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 に答える