0

配列からいくつかの要素への関数のバインドに問題がありますが、クラス「クラス」の要素をクリックするとこのエラーが発生します。

キャッチされていない TypeError: オブジェクト function (){alert(1)},function (){alert(2)},function (){alert(3)},function (){alert(4)} のプロパティ '4' はありません機能

var c = [
    function(){alert(1)},
    function(){alert(2)},
    function(){alert(3)},
    function(){alert(4)}
];

function test(b){
    for(var i = 0; i < b.length; i++){
        $('.class').eq(i).bind('click', function(){
            b[i]();
        });
    }
}

test(c);

変数 i は最後の値を保持していると思います。

解決策や説明は本当にありがたいです。前もって感謝します。

4

3 に答える 3

2

クロージャが必要です - js では、変数のスコープは関数によって決定されます。jQuery では、以下を使用します.each

$('.class').each(function(i) {
     $(this).on('click', function(){
         alert(i+1);
     });
});

ただし、個別の関数の配列が本当に必要な場合は、関数自体をハンドラーとして直接バインドできます。

var elems = $('.class');
for (var i=0;i<b.length;i++) {
    elems.eq(i).on('click', b[i]);
}
于 2013-02-26T20:12:53.953 に答える
1

関数配列には 4 つの項目しかないため、b[4]未定義です。クリック ハンドラー内で参照する代わりに、bそれをクリック ハンドラー自体にします。

elems.eq(i).on('click', b[i]);

これを行うことによりi、要素がクリックされたときではなく、ループの各反復で の値が調べられます (その時点での値は常に である必要があります4)。

于 2013-02-26T20:12:27.447 に答える
1

問題は、ループ内でハンドラーとして設定している関数がすべて同じ値clickを共有していることです。iループの後、そのi値は になるため、各関数は存在しない4を呼び出そうとします。b[4]

i値がすべて異なるように、関数ごとに新しいスコープを作成する必要があります。

for(var i = 0; i < b.length; i++){
    (function(i){
        $('.class').eq(i).bind('click', function(){
            b[i]();
        });
    }(i));
}

配列から関数をclickハンドラーとして直接設定することもできます。

for(var i = 0; i < b.length; i++){
    $('.class').eq(i).bind('click', b[i]);
}
于 2013-02-26T20:20:30.403 に答える