click () event memanggil dua kali di jquery

113

Saya menyiapkan elemen tautan dan memanggil acara kliknya di jquery tetapi acara klik memanggil dua kali, silakan lihat di bawah kode jquery.

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

Mohon saran.

Terima kasih.

domlao
sumber
2
Masalahnya mungkin dari tempat lain di skrip Anda.
karim79
3
jika Anda tidak dapat menemukan di mana Anda membuat sesuatu untuk memanggil ini dua kali, lepaskan ('clik') sebelum klik (...).
regilero
regilero: tepatnya, seluruh basis kode sangat besar. di mana saya harus meletakkan pelepasan itu?
domlao
2
Anda dapat mendeteksi fungsi apa yang mengikat peristiwa klik itu: stackoverflow.com/questions/570960/…
Anh Pham

Jawaban:

229

Pastikan dan periksa bahwa Anda tidak sengaja memasukkan skrip Anda dua kali di halaman HTML.

Scott
sumber
1
Ini adalah masalah untuk kasus saya. Bahwa acara klik saya semakin menggelegar. Terima kasih atas penunjuknya. :) +1
Tahir Akram
22
Saya hanya melihat solusi ini dan tertawa berpikir "Saya tidak cukup bodoh untuk melakukan itu" ... ternyata saya telah melakukan ini. Terima kasih banyak.
JazzyP
1
Terima kasih! Ini ternyata menjadi masalah bagi saya juga. Memiliki itu di template blade laravel dan di template bersarang yang disebut @parent pada nama bagian yang sama. Ups. Terima kasih lagi!
Phillip Harrington
1
Terima kasih atas tip ini. Berjuang dengan ini selama lebih dari 20 jam, dan tip ini membawa saya ke jalan yang benar. Saya menggunakan MVC ScriptBundles tetapi juga menautkan ke file skrip secara langsung dan ini menggandakan peristiwa
Manish
lol ... Saya pernah ke sana ... Saya menyalahkan pihak ketiga, tetapi saya yang menautkan file .js dua kali.
Julian
76

Lepaskan ikatan sebelum klik;

$("#link_button").unbind('click');
$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});
Sistem
sumber
1
coba $ ("# link_button"). unbind (); atau buat tes sederhana untuk memeriksa berapa kali kode itu dibaca, jika lebih dari sekali ...
TheSystem
3
itu hanya memperbaiki kesalahan dengan cepat setiap kali, bukan solusi nyata. itu melakukan trik dan telah membantu saya tetapi Anda harus menemukan masalah sebenarnya dan membuat perbaikan permanen.
Juan Ignacio
1
ini sangat berguna dalam kasus saya, karena saya perlu memanggil beberapa kali metode dengan acara saya setelah beberapa panggilan ajax mulai menjadi overclicked (saya tidak tahu apakah kata ini ada). Untuk situasi saya, itu berarti solusi.
Thiago C. S Ventura
Memperbaiki masalah saya dengan skrip yang hanya disertakan sekali. Terima kasih!
K. Rhoda
49

Itu berarti kode Anda menyertakan skrip jquery dua kali. Tapi coba ini:

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

//your code

});
Nalan Madheswaran
sumber
36

Saya mencoba e.stopImmediatePropagation(),; Sepertinya ini berhasil untuk saya.

Aps18
sumber
@ BasheerAL-MOMANI Lihat stackoverflow.com/questions/5299740/…
fangxing
Terima kasih, ini berhasil ... ngomong-ngomong setelah membaca pahami itu mencegah penangan orang tua dieksekusi
Nandlal Ushir
18

Dalam kasus saya, saya menggunakan skrip di bawah ini untuk mengatasi masalah tersebut

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

off()melepaskan semua acara yang mengikat #id. Jika Anda hanya ingin melepaskan clickacara, gunakan off('click').

Upendra
sumber
8

Cukup panggil .off () tepat sebelum Anda memanggil .on ().

Ini akan menghapus semua penangan acara:

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

Untuk hanya menghapus pengendali acara 'klik' yang terdaftar:

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

Solusi yang agak umum untuk masalah dua klik adalah menempatkan

e.stopPropagation()

di akhir fungsi Anda (dengan asumsi Anda menggunakannya function(e)). Hal ini mencegah acara menggelembung yang dapat menyebabkan eksekusi fungsi kedua.

demongolem
sumber
6

Saya memiliki masalah yang sama, tetapi Anda dapat mencoba mengubah kode ini

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

untuk ini:

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

Bagi saya, kode ini memecahkan masalah. Namun berhati-hatilah agar tidak menyertakan skrip Anda dua kali secara tidak sengaja di halaman HTML. Saya rasa jika Anda melakukan dua hal ini dengan benar, kode Anda akan berfungsi dengan benar. Terima kasih

Ellington Brambila
sumber
3

silahkan coba ini

$('#ddlSupervisor').live('change', function (e) {
    if (e.handled !== true) { //this makes event to fire only once
    getEmployeesbySupervisor();
    e.handled = true;
   }
});
Raj
sumber
Saya mengubah "hidup" menjadi "aktif" dan sepertinya itu berhasil untuk saya. Jadi, peristiwa hanya menyala saat tombol diklik.
Vikneshwar
Ini tepat.
LargeTuna
3

Ini jelas merupakan bug khususnya saat itu FireFox. Saya mencari banyak mencoba semua jawaban di atas dan akhirnya mendapatkannya sebagai bug oleh banyak ahli melalui SO. Jadi, saya akhirnya mendapatkan ide ini dengan mendeklarasikan variabel like

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);

    }
});

Dengan cara ini pertama-tama memeriksa bukan fungsi yang dipanggil sebelumnya atau tidak.

Airy
sumber
3

Menambahkan e.preventDefault();di awal fungsi saya berhasil untuk saya.

Chris Edwards
sumber
3

Ini adalah pertanyaan lama, tetapi jika Anda menggunakan delegasi acara, inilah penyebabnya bagi saya.

Setelah menghapusnya .delegate-twoberhenti mengeksekusi dua kali. Saya yakin ini terjadi jika kedua delegasi hadir di halaman yang sama.

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

potongan kode ini tidak mengandung hal buruk. Itu adalah bagian lain dari skrip Anda seperti yang dikatakan @karim

asal
sumber
2

Dalam kasus saya, itu berfungsi dengan baik di Chrome dan IE memanggil .click()dua kali. jika itu adalah masalah Anda, maka saya memperbaikinya dengan mengembalikan false, setelah memanggil .click()acara tersebut

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

Memanggil unbindmemecahkan masalah saya:

$("#btn").unbind("click").click(function() {
    // your code
});
Deepti Gehlot
sumber
2

Saya tidak yakin mengapa tapi saya punya masalah dengan ini

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

Saat saya mengubahnya menjadi

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

Masalah terpecahkan. Tapi pasti ada yang salah dalam kode saya.

Petr
sumber
ini berhasil untuk saya di laravel, tidak tahu apa yang menyebabkan masalah ini
khan Farman
1

Saya tertipu oleh pilihan yang cocok dengan beberapa item sehingga masing-masing diklik. :firstmembantu:

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

Saya juga mengalami masalah ini di FF. Tag saya bagaimanapun terikat pada sebuah <a>tag. Meskipun <a>tag tidak ke mana-mana, itu masih melakukan klik dua kali. Saya menukar <a>tag dengan <span>tag dan masalah klik ganda menghilang.

Alternatif lain adalah menghapus atribut href sepenuhnya jika tautan tidak ke mana-mana.

Sadiki Latty
sumber
Ini tidak benar-benar menjawab pertanyaan itu. Jika Anda memiliki pertanyaan yang berbeda, Anda dapat menanyakannya dengan mengklik Ajukan Pertanyaan . Anda juga dapat menambahkan hadiah untuk menarik lebih banyak perhatian pada pertanyaan ini setelah Anda memiliki reputasi yang cukup .
Sean Patrick Floyd
@SeanPatrickFloyd: Sebenarnya, ini adalah sebuah jawaban. Bahkan jika diformulasikan untuk mengibarkan bendera merah.
Deduplicator
1

Saya menghadapi masalah ini karena $(elem).click(function(){});skrip saya ditempatkan sebaris di div yang disetel kestyle="display:none;" .

Saat tampilan css dialihkan ke blokir, skrip akan menambahkan event listener untuk kedua kalinya. Saya memindahkan skrip ke file .js terpisah dan pendengar acara duplikat tidak lagi dimulai.

NRTRX
sumber
1

Ketika saya menggunakan metode ini pada halaman memuat dengan jquery, saya menulis $('#obj').off('click');sebelum mengatur fungsi klik, sehingga gelembung tidak terjadi. Bekerja untuk saya.

GustavoAdolfo
sumber
1

Jawaban sederhana saya adalah mengubah ikatan klik menjadi sebuah fungsi dan memanggilnya dari onclick elemen - berhasil! sedangkan di atas tidak ada yang melakukannya

Steve Whitby
sumber
0

Jika acara Anda menelepon dua atau tiga kali, atau lebih, ini mungkin membantu.

Jika Anda menggunakan sesuatu seperti ini untuk memicu peristiwa ...

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

… Lalu perhatikan jumlah .js-someclasselemen yang Anda miliki di halaman, karena ini akan memicu peristiwa klik untuk semua elemen - dan tidak hanya sekali!

Perbaikan sederhana selanjutnya adalah memastikan Anda memicu klik hanya sekali, dengan memilih hanya elemen pertama , misalnya:

$('.js-someclass:first').click();
Fabien Snauwaert
sumber
0

Di tempat lain di skrip Anda, peristiwa "click" terikat lagi ke elemen yang sama, seperti yang disarankan oleh beberapa jawaban / komentar lain.

Saya memiliki masalah serupa dan untuk memverifikasi itu, saya cukup menambahkan console.logperintah ke skrip saya, seperti di cuplikan berikut:

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

Jika, setelah mengklik tombol, Anda mendapatkan sesuatu yang mirip dengan gambar di bawah ini dari konsol pengembang browser Anda (seperti yang saya lakukan), maka Anda tahu pasti bahwa click()acara tersebut telah terikat dua kali ke tombol yang sama.

konsol pengembang

Jika Anda memerlukan tambalan cepat, solusi yang diusulkan oleh komentator lain menggunakan offmetode (btw unbindtidak digunakan lagi sejak jQuery 3.0) untuk melepaskan acara sebelum (kembali) mengikatnya berfungsi dengan baik, dan saya merekomendasikannya juga:

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

Sayangnya, ini hanya patch sementara! Setelah masalah yang membuat bos Anda senang teratasi, Anda harus benar-benar menggali kode Anda lebih dalam dan memperbaiki masalah "pengikatan duplikat".

Solusi sebenarnya tentu saja bergantung pada kasus penggunaan spesifik Anda. Dalam kasus saya, misalnya, ada masalah "konteks". Fungsi saya dipanggil sebagai hasil dari panggilan Ajax yang diterapkan ke bagian tertentu dari dokumen: memuat ulang seluruh dokumen sebenarnya memuat ulang konteks "halaman" dan "elemen", yang mengakibatkan peristiwa tersebut terikat ke elemen dua kali .

Solusi saya untuk masalah ini adalah untuk memanfaatkan jQuery satu fungsi, yang sama di dengan pengecualian bahwa acara ini secara otomatis terikat setelah doa pertama. Itu ideal untuk kasus penggunaan saya, tetapi sekali lagi, ini mungkin bukan solusi untuk kasus penggunaan lain.

Sal Borrelli
sumber
-1

Punya masalah yang sama. Ini berhasil untuk saya -

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

Semoga ini bisa membantu seseorang.

SGhosh
sumber
Melempar kesalahan untuk saya ... Plus, ini adalah solusi kotor - fungsi dijalankan lebih dari sekali, solusinya adalah meletakkannya di tempat lain dan menggunakan console.log () untuk memantau berbagai hal.
tylerl
-1

Dalam kasus saya, HTML ditata seperti ini:

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

Dan jQuery saya seperti ini:

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

Itu membuatku bingung karena sepertinya tidak ada yang terjadi. Masalahnya adalah bahwa dalam .shares toggle akan membatalkan keluar luar .shares toggle.

Steven Linn
sumber
-1

Saya memecahkan masalah ini dengan mengubah jenis elemen. alih-alih tombol saya menempatkan input, dan masalah ini tidak terjadi lagi.

instesd dari:

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

ubah dengan:

<input onclick="doSomthing()" value="click me">
Shneor
sumber