2

JQuery UI のオートコンプリート ウィジェットを使用しており、オートコンプリートをアタッチしている現在のセレクターにアクセスしたいと考えています。ここで前の質問を使用して、セレクターにアクセスする方法を見つけましたが、ソース関数が正しく呼び出されません。

私の現在のコードは次のようになります

$("input[id$=artist]").each(function() {
    e1 = $(this);
    curID = $(this).parent('td').parent('tr').attr('id');       
    e1.autocomplete({
        minLength: 3,
        source: function(request, response) { 
            findSuggestions(request, response, 'artist', artist_cache, curID);
        }
    });
});

ご覧のとおり、現在のセレクターを取得して e1 に配置します。指定された「アーティスト」入力を持つ複数の行があり、メソッドの各行の ID を知りたいのですがfindSuggestions、メソッドが呼び出されると、各行に同じ ID が与えられます (これは、行。

なぜこれが起こっているのでしょうか?この問題へのアプローチは間違っていますか?

ありがとう!

4

2 に答える 2

3

クロージャー内で変数を定義してローカルスコープを与える必要があります。そうしないと、グローバル変数を作成します

$("input[id$=artist]").each(function() {
    var e1 = $(this);
    var curID = $(this).parent('td').parent('tr').attr('id');       
    e1.autocomplete({
        minLength: 3,
        source: function(request, response) { 
            findSuggestions(request, response, 'artist', artist_cache, curID);
        }
    });
});
于 2010-07-15T07:59:26.740 に答える
2

変数varの前に置くのを忘れました。curID

これにより、ウィンドウ オブジェクトにグローバル変数が作成されるcurIDため、すべてのソース コールバック関数は同じオブジェクトを参照するため、値が参照されます。

への変更

var curID = $(this).parent('td').parent('tr').attr('id');       

varこのような厄介なバグの原因になる可能性があるため、変数宣言の前に置くことを忘れないでください。

于 2010-07-15T08:00:17.503 に答える