2

'親の「ボックス」IDが正しい場合にのみ、「ヒット」クラスをクリックすると関数を実行する以下のようなことをしようとしています。

var selected = 1;    

$('#box-' + selected + ' .hit').click(function(){

    selected = randomFromTo(1,5);

});

変数はページ上のselected他のアクションに応じて変化しますが、変更後に関数を機能させることができません。最初に選択した「ボックス」IDに固定されたままです。jQueryがその文字列のスナップショットを取得し、それを更新するように指示していないため、これがなぜであるかは想像できますが、これを回避する方法がわかりません。

編集:選択した変数のインスタンス化とそれが設定される場所を追加しました。これをユーザーが理解しやすくするためのUIの変更は省略しました。

4

4 に答える 4

3

クラスにクリックハンドラーを設定して.hitから、ハンドラー自体の中で正しいIDの親ノードを確認することができます。これを行う場合は、イベントを正しく延期するようにしてください。そうしないと、.hit要素ごとに1つのハンドラーが作成されてしまいます。

于 2013-02-20T23:44:07.650 に答える
2

私があなたの問題を正しく理解しているなら、問題はselectedあなたの関数が作成されたときに変数が評価されるということです。この関数はclick、その時点で一連のDOM要素のイベントにバインドされています。

バインド後、セレクターを変更することはできず、選択中に使用される変数を変更しても効果はありません。

私が考えることができるこれを回避する最良の方法は、クリックイベントをすべての可能な一致に添付し、clickハンドラー内でそれらをさらにフィルター処理することです...

$('.hit').click(function(){
    // check if the parent has the correct id
    if($(this).parent().attr('id') == 'box-' + selected){
        //function
    }
});
于 2013-02-20T23:47:43.573 に答える
1

このようなことをすることができます:

var selected = null;
function setSelected(aSelected) {

    if (selected !== null) {
        // Remove existing selected click handler
        $('#box-' + selected + ' .hit').off('click.selected')
    }

    selected = aSelected;

    // Click handler for new selected el
    $('#box-' + selected + ' .hit').on('click.selected', function() { });
}
于 2013-02-20T23:49:24.980 に答える
0

理解するにはコンテキスト全体を確認する必要がありますが、一見すると、投稿されたコードがページで1回実行されているように見えます。

だからあなたがするなら

var selected = something;

$('#box-' + selected + ' .hit').click(function(){

    //function

});

以降

selected = "newvalue";

これによってプログラムの動作が変わることはありません。クリックイベントは特定のオブジェクトにすでに設定されています。

.hitにクリックハンドラーを設定する他の提案は非常に理にかなっており、ハンドラー内で次のことを確認できます。

($(this).parent().attr('id')) == ("box-"+selected)

その後、コードを実行します。

于 2013-02-20T23:46:07.407 に答える