click()イベントがjqueryで2回呼び出される


113

リンク要素を設定してjqueryでそのクリックイベントを呼び出しましたが、クリックイベントが2回呼び出されています。jqueryのコードの下をご覧ください。

$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

お知らせ下さい。

ありがとう。


2
問題はおそらくスクリプト内の別の場所にあります。
karim79

3
これを2回呼び出す場所を見つけられない場合は、クリック(...)の前にunbind( 'clik')を作成します。
regilero

regilero:正確には、コードベース全体が非常に大きいです。アンバインドはどこに置くべきですか?
domlao 2011

2
そのクリックイベントにバインドしている関数を検出できます。stackoverflow.com
questions / 570960

回答:


229

HTMLページに誤って2回スクリプトを含めていないことを確認してください。


1
これは私の場合の問題でした。私のクリックイベントがおかしくなりました。ポインタをありがとう。:) +1
Tahir Akram 2011

22
私はこの解決策を見て、「私はそれをするのに十分なほど愚かではない」と思って笑いました...私はまさにこれをやったことがわかりました。どうもありがとう。
JazzyP 2014年

1
ありがとう!これも私にとって問題であることがわかりました。laravelブレードテンプレートと、同じセクション名で@parentを呼び出すネストされたテンプレートでそれを使用していました。おっとっと。再度、感謝します!
Phillip Harrington

1
このヒントをありがとう。これに20時間以上苦しんでおり、このヒントは私を正しい道に導きました。私はMVC ScriptBundlesを使用していましたが、スクリプトファイルに直接リンクしていて、これがイベントを複製していました
Manish

笑...私はそこに行ったことがあります...私はサードパーティを非難していましたが、.jsファイルを2回リンクしたのは私でした。
ジュリアン

76

クリックする前にバインドを解除します。

$("#link_button").unbind('click');
$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

1
$( "#link_button")。unbind();を試してください または、簡単なテストを行って、コードが複数回読み取られた回数を確認します...
TheSystem

3
これは毎回エラーをその場で修正するだけであり、実際の解決策ではありません。それはトリックを行い、私を助けましたが、あなたは本当の問題を見つけて永久的な修正をするべきです。
ファンイグナシオ

1
いくつかのajaxが呼び出された後、イベントでメソッドを数回呼び出す必要があるため、このメソッドは本当に便利です(この単語が存在するかどうかはわかりません)。私の状況では、それは解決策を意味します。
チアゴC. Sベンチュラ

一度しか含まれていないスクリプトに関する問題を修正しました。ありがとうございました!
K.ロダ2017

49

これは、コードにjqueryスクリプトが2回含まれていることを意味します。しかし、これを試してください:

$("#btn").unbind("click").click(function(){

//your code

});


18

私の場合、問題を克服するために以下のスクリプトを使用しました

$('#id').off().on('click',function(){
    //...
});

off()にバインドされて#idいるすべてのイベントをバインド解除します。clickイベントのみをバインド解除する場合は、を使用しますoff('click')


8

.on()を呼び出す直前に.off()を呼び出すだけです。

これにより、すべてのイベントハンドラーが削除されます。

$(element).off().on('click', function() {
// function body
});

登録された「クリック」イベントハンドラのみを削除するには:

$(element).off('click').on('click', function() {
// function body
});

7

2クリック問題のかなり一般的な解決策は、

e.stopPropagation()

関数の最後(これを使用しfunction(e)ている場合)。これにより、関数の2回目の実行につながる可能性のあるイベントが発生しなくなります。


6

同じ問題が発生しましたが、このコードを変更してみてください

$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

これに:

$("#link_button").button();
$("#link_button").unbind("click").click(function () {
   $("#attachmentForm").slideToggle("fast");
});

私にとって、このコードは問題を解決しました。ただし、HTMLページに誤ってスクリプトを2回含めないように注意してください。これら2つのことを正しく行っていれば、コードは正しく機能すると思います。ありがとう


3

これを試してください

$('#ddlSupervisor').live('change', function (e) {
    if (e.handled !== true) { //this makes event to fire only once
    getEmployeesbySupervisor();
    e.handled = true;
   }
});

「ライブ」を「オン」に変更したところ、うまくいくようです。したがって、イベントはボタンがクリックされたときだけ発生します。
Vikneshwar、2016年

これはスポットです。
LargeTuna 2019年

3

これは間違いなく、FireFoxの特別なバグです。私はたくさん検索して上記の答えをすべて試し、最終的にSOを介して多くの専門家によってバグとしてそれを得ました。だから、私はようやく変数を宣言することでこのアイデアを思いついた

var called = false;
$("#ColorPalete li").click(function() {
    if(!called)
    {
             called = true;
             setTimeout(function(){ //<-----This can be an ajax request but keep in mind to set called=false when you get response or when the function has successfully executed.
                 alert('I am called');
                 called = false;
             },3000);

    }
});

このようにして、最初に関数が以前に呼び出されたかどうかをチェックします。



3

これは古い質問ですが、イベントの委任を使用している場合、これが原因でした。

削除後、.delegate-two実行が2回停止しました。これは、両方のデリゲートが同じページに存在する場合に発生すると思います。

$('.delegate-one, .delegate-two').on('click', '.button', function() {
    /* CODE */
});

2

このコードスニペットには問題はありません。@karimが言ったように、それはあなたのスクリプトの別の部分です


2

私の場合、Chromeで問題なく動作し、IEが.click()2回呼び出していました。それがあなたの問題だった場合は、.click()イベントを呼び出した後、falseを返すことで修正しました

   $("#txtChat").keypress(function(event) {
        if (event.which == 13) {
            $('#btnChat').click();
            $('#txtChat').val('');
            return false;
        }
    });


2

理由はわかりませんが、この問題が発生しました

$(document).on("click", ".my-element", function (e) { });

に変更したとき

$(".my-element").click(function () { });

問題は解決しました。しかし、間違いなく私のコードに問題があります。


これは私にとってlaravelでうまくいきました、この問題の原因がわからない
ファーマンカーン

1

複数のアイテムに一致するセレクションにだまされて、それぞれがクリックされました。:first助けた:

$('.someClass[data-foo="'+notAlwaysUniqueID+'"]:first').click();

1

私もFFでこの問題を抱えていました。しかし、私のタグはタグにバインドされていました<a><a>タグはどこにも行きませんでしたが、それでもダブルクリックしました。代わりに<a>タグをタグに交換したところ<span>、ダブルクリックの問題が解消されました。

別の方法は、リンクがどこにも行かない場合にhref属性を完全に削除することです。


これは実際には質問の答えにはなりません。別の質問がある場合は、[ 質問する]をクリックして質問できます。賞金追加して、十分な評判を得たら、この質問にもっと注意を向けることもできます。
Sean Patrick Floyd、

@SeanPatrickFloyd:実際、それは答えです。赤い旗を掲げるために処方されたとしても。
デュプリケータ

1

$(elem).click(function(){});スクリプトがに設定されたdivにインラインで配置されたため、この問題に直面しましたstyle="display:none;"

cssの表示がブロックに切り替えられたとき、スクリプトはもう一度イベントリスナーを追加しました。スクリプトを別の.jsファイルに移動し、重複したイベントリスナーが開始されなくなりました。


1

jqueryでページをロードするときにこのメソッドを使用すると$('#obj').off('click');、クリック関数を設定する前に書き込みを行うので、バブルは発生しません。私のために働く。



0

イベントが2回または3回、またはそれ以上呼び出す場合は、これが役立つ場合があります。

このようなものを使用してイベントをトリガーする場合…

$('.js-someclass').click();

.js-someclassページにある要素の数に注意してください。一度だけでなく、すべての要素に対してクリックイベントがトリガーされるためです。

簡単な修正は、最初の要素だけを選択して、クリックを1回だけトリガーすることです。

$('.js-someclass:first').click();

0

他のいくつかの回答/コメントが示唆しているように、スクリプトの別の場所で「クリック」イベントが同じ要素に再度バインドされていることは確かです。

同様の問題があり、それを確認するためconsole.logに、次のスニペットのように、スクリプトにコマンドを追加しました。

$("#link_button")
    .button()
    .click(function () {
        console.log("DEBUG: sliding toggle...");
        $("#attachmentForm").slideToggle("fast");
    });

ボタンをクリックすると、ブラウザーの開発者コンソールから(下図のように)以下のような画像click()が表示される場合は、イベントが同じボタンに2回バインドされていることを確認できます。

開発者のコ​​ンソール

迅速なパッチが必要な場合は、他のコメンテーターが提案しているoff方法(btw unbindはjQuery 3.0以降では非推奨)を使用してイベントをバインド解除してから(再)バインドすることで問題が解決します。

$("#link_button")
    .button()
    .off("click")
    .click(function () {
        $("#attachmentForm").slideToggle("fast");
    });

残念ながら、これは一時的なパッチにすぎません!上司を幸せにする問題が解決したら、実際にコードをもう少し掘り下げて、「重複したバインディング」の問題を修正する必要があります。

実際のソリューションは、もちろん特定のユースケースに依存します。私の場合、例えば、「文脈」の問題がありました。Ajax呼び出しがドキュメントの特定の部分に適用された結果、関数が呼び出されました。ドキュメント全体を再読み込みすると、実際には「ページ」と「要素」の両方のコンテキストが再読み込みされ、イベントが要素に2回バインドされました。 。

この問題に対する私の解決策は、jQuery one関数を利用することでした。これは、最初の呼び出し後にイベントが自動的にバインド解除されることを除いて、と同じです。これは私のユースケースには理想的でしたが、繰り返しになりますが、他のユースケースの解決策にはならないかもしれません。


-1

同じ問題があった。これは私のために働いた-

$('selector').once().click(function() {});

これが誰かを助けることを願っています。


私にエラーを投げます...加えてそれは汚い解決策です-関数は複数回実行されています、解決策はそれをどこか別の場所に置き、console.log()を使用して物事を監視することです。
tylerl 2013年

-1

私の場合、HTMLは次のようにレイアウトされています。

<div class="share">
  <div class="wrapper">
    <div class="share">
    </div>
  </div>
</div>

そして私のjQueryはこのようなものでした:

jQuery('.share').toggle();

何も起こっていないように見えたため、混乱しました。問題は、内側のことだった.shareのがtoggle 、外相殺しまう.shareのをtoggle


-1

要素タイプを変更することでこの問題を解決しました。ボタンの代わりに入力を配置すると、この問題は発生しなくなります。

の挿入:

<button onclick="doSomthing()">click me</button>

と置換する:

<input onclick="doSomthing()" value="click me">
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.