1

我正在尝试使用 Javascript / JQuery 来动态创建几个 HTML 按钮,每个按钮在单击时都会执行不同的操作。

我的第一次尝试是这样的:

function myFunc( target_div, num_buttons ) {
    var buttons="";
    for ( var i=0; i<num_buttons; i++ ) {
        buttons += '<input type="button" id="button_'+i+'" value="button_'+i+'"></input>';
    }
    target_div.html( buttons );
    var doButtonPress = function( i ) {
        alert( i ); // I actually do something more complicated here, but it's not important now
    }
    for ( var i=0; i<num_buttons; i++ ) {
        $('#button_'+i).click( function() { doButtonPress(i); } );
    }
}

不幸的是,这不起作用,因为(我认为)当点击事件发生时,doButtonPress 总是在 myFunc 的范围内传递 i 的当前值,而不是 - 如我所愿 - 定义点击事件时的值。因此,无论按下哪个按钮,传递给 doButtonPress 的值始终等于 num_buttons。所以我然后尝试了这个:

$('#button_'+i).click( new Function( "doButtonPress("+i+");" ) );

不幸的是,这也不起作用 - 我收到一条消息“ReferenceError:找不到变量:returnResult”。我认为这是因为在单击事件发生之前不会解析 Function 构造函数的 arg 值,而那时我已经超出了 myFunc 的范围,所以 doButtonPress 未定义?到目前为止,我做得对吗?

所以……我该怎么办?:-)

4

2 回答 2

3

您的代码不起作用,因为变量的范围i总是num_button在处理程序中。您可以通过将其包装在 a 中来修复它,closure但如何通过添加一个类并使用按钮的 id 来简化它。

function myFunc( target_div, num_buttons ) {
    var buttons="";
    for ( var i=0; i<num_buttons; i++ ) {
        //                             added class ----------------v
        buttons += '<input type="button" id="button_'+i+'" class="mybuttons" value="button_'+i+'"></input>';
    }
    target_div.html( buttons );
    var doButtonPress = function( i ) {
        alert( i ); // I actually do something more complicated here, but it's not important now
    }

    //yes, mybuttons exist 
    $('.mybuttons').click(function () {
         doButtonPress(this.id.replace('button_', ''));
         //this.id.replace('button_', '') <- returns i value
    });
}
于 2012-11-02T16:26:50.730 回答
1

我的建议是data为每个按钮分配一个属性,然后在单击按钮时可以读取该属性。这将避免对不必要的(和丑陋的)增量id属性的需要。像这样的东西:

function myFunc($target_div, num_buttons) {
    var buttons = [];
    for (var i = 0; i < num_buttons; i++) {
        buttons.push($('<input type="button" class="button" data-id="' + i + '" value="button ' + i + '" />'));
    }
    $target_div.append(buttons);

    var doButtonPress = function() {
        alert($(this).data('id'));
    }

    $(".button").click(doButtonPress);
}

示例小提琴

于 2012-11-02T16:30:45.203 回答