1

このコードに何か問題がありますか?

$(document).ready(function() {

    if($("#textbox-id-recipient").val()) {
        console.log("In");


        $(document).on("click", "#textbox-id-recipient", function(event) {
            addEmail($(this));
        });

        $('#textbox-id-recipient').trigger('click');

        $("#textbox-id-recipient").off("click");
    }

...
});

そのため、ページを更新した後、テキストボックスに何かがある場合、クリックイベントがトリガーされ、「オン」イベントが1つトリガーされますが、その後、イベントをオフにするはずでしたが、テキストボックスを手動でクリックすると、オンイベントがまだトリガーされている

4

4 に答える 4

2

レビュー

この声明を考慮して:

$(document).on("click", "#textbox-id-recipient", function(event) {
    addEmail($(this));
});

クリック ハンドラーを にバインドしています。documentこれは、クリック イベントがクリックの開始位置から完全にバブルするときに呼び出されます。

    $('#textbox-id-recipient').trigger('click');

これにより、要素のクリック イベントがシミュレートされます。イベントが処理されない場合、jQuery はイベントが に到達するまで、親を介して要素ツリーをバブルアップさせますdocument

    $("#textbox-id-recipient").off("click");

上記のクリック トリガーは期待どおりに機能します.off()が、現在の要素のみを参照します。つまり、自動的に「バブルアップ」しません。

代替案 1

したがって、アタッチしたのと同じ要素でクリック ハンドラーを無効にする必要があります。

$(document).off("click", "#textbox-id-recipient");

ところで、識別子は一意でなければならないことを知っているので、要素が後で追加されるだけでない限り#textbox-id-recipient、イベント ハンドラーを直接アタッチすることもできます。

$('#textbox-id-recipient').on('click', function(event) {
});

代替案 2

また、クリックを 1 回だけ処理する必要がある場合は、次を使用します.one()

$('#textbox-id-recipient').one('click', function(event) {
});

または、イベント委任を使用する場合:

$(document).one('click', '#textbox-id-recipient', function(event) {
});
于 2013-04-30T01:11:20.153 に答える
2

イベントをドキュメントではなく要素にバインドします。

$('#textbox-id-recipient').on("click", function(event) {
    addEmail($(this));
});

$('#textbox-id-recipient').trigger('click');

$("#textbox-id-recipient").off("click");
于 2013-04-30T00:41:27.757 に答える
1

このコードを使用してハンドラーを削除してみてください。それはうまくいくはずです:

$(document).off("click", "#textbox-id-recipient");

ここでフィドル:http://jsfiddle.net/yntyF/1/

于 2013-04-30T00:46:54.420 に答える