0

我有一些拖动对象和放置对象的数组,这里:

var elmDragObj = ["#ob01","#ob02","#ob03","#ob04","#ob05","#ob06","#ob07","#ob08","#ob09","#ob10","#ob11","#ob12","#ob13","#ob14","#ob15","#ob16","#ob17","#ob18","#ob19","#ob20"];

var elmDropObj = ["#va_kb_a","#va_ks_a","#va_kk_a","#dk_kb_a","#dk_kb_b","#dk_ks_a","#pr_kb_a","#rv_kb_a","#rv_kb_b","#rv_kb_c","#pr_ks_a","#rv_ks_a","#rv_ks_b","#rv_ks_c","#vl_kb_a","#vl_ks_a","#vl_kk_a","#vk_kb_a","#vk_ks_a","#vk_kk_a"];

我有一个布尔数组来检查所有对象何时被放置在它的位置,这里:

var elmBool = [false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false];

当我想检查布尔值时,它是未定义的,脚本如下:

for(var j=0; j<elmDragObj.length; j++){
        $(elmDragObj[j]).draggable({revert:"invalid"});

        $(elmDropObj[j]).droppable({
            accept: elmDragObj[j],
            drop: function( event, ui ) {
                alert(elmBool[j]);
            }
        });
    }

我做错什么了吗?

4

2 回答 2

2

是因为那个时候...

alert(elmBool[j]);

... 运行,j现在超出了您的数组的范围(它将等于elmDragObj.length)。

最简单的解决方案是简单地使用$.each()

$.each(elmDragObj, function(j, sel) {
    $(sel).draggable({ revert: 'invalid' });

    $(elmDropObj[j]).droppable({
        accept: sel,
        drop: function(event, ui) {
            alert(elmBool[j]);
        }
    });
});

如果您真的想使用for循环,可以这样做,但您需要“锁定”j闭包中的值:

for(var j=0; j<elmDragObj.length; j++){
    $(elmDragObj[j]).draggable({revert:"invalid"});

    $(elmDropObj[j]).droppable({
        accept: elmDragObj[j],
        drop: (function() {
            var index = j;
            return function(event, ui) {
                alert(elmBool[index]);
            };
        })()
    });
}

不过,显然这不像第一种方法那样对开发人员友好,所以我的建议肯定是使用$.each().

于 2013-04-11T03:02:29.640 回答
0

问题是变量 j 在调用函数时无效。您已经运行了循环并且 j 无效,它已经递增到数组的末尾。

于 2013-04-11T03:01:33.060 回答