Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 添加到动态按钮的动态onClick_Javascript_Jquery_Html_Jqgrid - Fatal编程技术网

Javascript 添加到动态按钮的动态onClick

Javascript 添加到动态按钮的动态onClick,javascript,jquery,html,jqgrid,Javascript,Jquery,Html,Jqgrid,我正在使用jqGrid并向网格动态添加按钮。添加这些按钮后,在gridComplete属性中,我调用我的函数: function(){ var ids = jQuery("#dataTable").jqGrid('getDataIDs'); for(var i=0;i < ids.length;i++){ var cl = ids[i]; $('.ui-loader.ui-corner-all.ui-body-a.ui-loader-defaul

我正在使用jqGrid并向网格动态添加按钮。添加这些按钮后,在gridComplete属性中,我调用我的函数:

function(){
   var ids = jQuery("#dataTable").jqGrid('getDataIDs');
   for(var i=0;i < ids.length;i++){
        var cl = ids[i];
        $('.ui-loader.ui-corner-all.ui-body-a.ui-loader-default').remove();
        $('#create_' + cl).on('click', function() {
            var $popUp = $("<div/>").popup({
            dismissible : true,
            theme : "b",
            overlyaTheme : "e",
            transition : "pop"
            }).on("popupafterclose", function() {
            $(this).remove();
            }).css({
                'width' : '100%',
                'height' : '100%',
                'padding' : '5px'
            })
            $("<a>", {
                text : "Edit",
            }).buttonMarkup({
                inline : false,
                mini : true,
            }).on("click", function() {
                $popUp.popup("close");
                $('#dataTable').jqGrid('editGridRow', cl);
            }).appendTo($popUp);

            $("<a>", {
                text : "Delete"
            }).buttonMarkup({
                inline : false,
                mini : true,
            }).on("click", function() {
                $popUp.popup("close");
            }).appendTo($popUp);

            $popUp.popup('open').trigger("create");
            });
}

问题是处理函数中使用的变量cl绑定到函数外部声明的同一个变量。当您在循环中迭代时,cl的值会发生变化,但您正在添加的函数不会发生变化

循环内变量闭包的错误是一个常见的Javascript编程问题,在循环内声明函数时需要随时注意。Javascript中没有像Java中那样的块作用域,只有函数作用域

基本上,模式是:

for (var i=0; i<len; i++) {
    foo.on('click', function() {
        console.log(i);
    });
}
在这种情况下,循环的每次迭代都会创建一个新函数,该函数的i值不同,绑定到变量bound_i

将此模式应用于上面的代码,我发现了以下问题:

....
.on("click", function() {
   $popUp.popup("close");
   $('#dataTable').jqGrid('editGridRow', cl);
 })
 ....
变成

....
.on("click", (function(bound_cl) {
   return function() {
       $popUp.popup("close");
       $('#dataTable').jqGrid('editGridRow', bound_cl);
   };
 })(cl));
 ....

如需进一步参考,请参阅。

我遇到了相同的问题,因为它们都是使用您创建的上一个方法设置的,对吗?尝试使用递归函数来创建按钮,而不是for循环。请不要像上面的注释所建议的那样尝试使用递归来解决这个问题。您可能会想出一种方法来解决这个问题,但对于解决一个简单的函数闭包问题来说,这是完全不必要的。非常优雅,工作完美,并且有很好的解释。非常感谢你。
for (var i=0; i<len; i++) {
    foo.on('click', (function(bound_i) { 
        return function() {
            console.log(bound_i);
        };
    })(i));
}
....
.on("click", function() {
   $popUp.popup("close");
   $('#dataTable').jqGrid('editGridRow', cl);
 })
 ....
....
.on("click", (function(bound_cl) {
   return function() {
       $popUp.popup("close");
       $('#dataTable').jqGrid('editGridRow', bound_cl);
   };
 })(cl));
 ....