jQuery无法更新PHP生成的元素,即使使用on。('click'

时间:2014-05-20 21:04:10

标签: php jquery

我有以下代码,工作正常:

for (var i = 0; i < <?php echo count($set); ?>; i ++){

    $('#inc' + i).on('click', function(){
        $('#scratchbox').val('test');
    });         

}

但我需要的是这个,它不起作用(唯一的区别是&#39;#scratchbox&#39;已经改为&#39; #set&#39; + i):

for (var i = 0; i < <?php echo count($set); ?>; i ++){

    $('#inc' + i).on('click', function(){
        $('#set' + i).val('test');
    });         

}

#inc divs和#set文本框都是由PHP在同一个地方同时生成的(技术上,按顺序排列:#set1,#inc1,#set2,#inc2等)。另外,我还有这个,当事件处理程序是一个静态的#submit div时,它可以检索#set文本框中包含的值就好了。

$('#submit').click(function(){

    for (var i = 0; i < <?php echo count($set); ?>; i ++){
        sets[i] = $('#set' + i).val();
    }

}); 

我应该改变什么以及为什么?

2 个答案:

答案 0 :(得分:5)

为什么不为您的元素添加类名,以便您可以执行以下操作:

$(document).on('click', '.click_element', function() {
   var ID = $(this).attr('id');
   $('#set' + ID).val('test');
});

并将for循环分开,创建带有ID的点击元素。

请注意,此解决方案在执行方面要比在循环中绑定点击事件快得多。

答案 1 :(得分:2)

当您的click事件处理程序运行时,i的值将设置为其最大值。在循环中创建一个IIFE,以便为i循环的每次迭代保存for的值。

例如:

for (var i = 0; i < <?php echo count($set); ?>; i ++){
    (function (inner_i) {
        $('#inc' + inner_i).on('click', function(){
            $('#set' + inner_i).val('test');
        });         
    })(i);
}

以下是关于使用IIFE(即时调用函数表达式)的好读物:http://benalman.com/news/2010/11/immediately-invoked-function-expression/