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.


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.


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

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

});


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').


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

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.


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


3

silahkan coba ini

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

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.



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 */
});

2

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


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

2

Memanggil unbindmemecahkan masalah saya:

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

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.


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

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.


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.


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.


1

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


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

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.


-1

Punya masalah yang sama. Ini berhasil untuk saya -

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

Semoga ini bisa membantu seseorang.


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.


-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">
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.