click () olayı jquery'de iki kez arıyor


113

Bir bağlantı öğesi kurdum ve tıklama olayını jquery'de çağırdım ancak tıklama olayı iki kez çağırıyor, lütfen aşağıdaki jquery koduna bakın.

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

Tavsiye lütfen.

Teşekkürler.


2
Sorun muhtemelen senaryonuzun başka bir yerindendir.
karim79

3
Eğer bunu iki kez çağırmak için nerede yaptığınızı bulamazsanız, tıklamadan önce (...) bir çözme ('clik') yapın.
regilero

regilero: tam olarak, tüm kod tabanı çok büyük. bunu çözmeyi nereye koymalıyım?
domlao

2
o tıklama olayına hangi işlevlerin bağlandığını tespit edebilirsiniz: stackoverflow.com/questions/570960/…
Anh Pham

Yanıtlar:


229

Komut dosyanızı yanlışlıkla HTML sayfanıza iki kez eklemediğinizden emin olun ve kontrol edin.


1
Benim durumum için sorun buydu. Tıklama etkinliğimin köpürdüğünü. İşaretçi için teşekkürler. :) +1
Tahir Akram

22
Sadece bu çözüme baktım ve "Bunu yapacak kadar aptal değilim" diye güldüm ... tam olarak bunu yaptığım ortaya çıktı. Çok teşekkürler.
JazzyP

1
Teşekkürler! Bu benim için de sorun oldu. Bir laravel blade şablonunda ve aynı bölüm adında @parent adlı iç içe bir şablonda vardı. Hata. Tekrar teşekkürler!
Phillip Harrington

1
Bu ipucu için teşekkürler. Bununla 20 saatten fazla uğraştı ve bu ipucu beni doğru yola götürdü. MVC ScriptBundles kullanıyordum ama aynı zamanda komut dosyalarına doğrudan bağlanıyordum ve bu olayları çoğalttı
Manish

lol ... Ben oradaydım ... Suçu üçüncü tarafa yükledim, ama .js dosyasını iki kez ilişkilendiren bendim.
Julian

76

Tıklamadan önce bağlantıyı kaldırın;

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

1
$ ("# link_button") deneyin. unbind (); veya bu kodun kaç kez okunduğunu kontrol etmek için basit bir test yapın, eğer birden fazla ise ...
TheSystem

3
bu sadece hatayı her seferinde anında düzeltmektir, gerçek bir çözüm değildir. hile yapıyor ve bana yardımcı oldu, ancak gerçek sorunu bulmalı ve kalıcı bir düzeltme yapmalısınız.
Juan Ignacio

1
benim durumumda gerçekten kullanışlı, çünkü bazı ajax çağrıları aşırı tıklanmaya başladıktan sonra olaylarımla birkaç kez yöntem çağırmam gerekiyor (bu kelimenin var olup olmadığını bilmiyorum). Benim durumum için bu bir çözüm demek.
Thiago C.S Ventura

Yalnızca bir kez eklenen bir komut dosyasıyla ilgili sorunum düzeltildi. Teşekkür ederim!
K. Rhoda

49

Bu, kodunuzun jquery betiğini iki kez içerdiği anlamına gelir. Ama şunu dene:

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

//your code

});


18

Benim durumumda, sorunun üstesinden gelmek için aşağıdaki komut dosyasını kullandım

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

off()bağlandığı tüm olayları çözer #id. Yalnızca clickolayı çözmek istiyorsanız , o zaman kullanın off('click').


8

.On () öğesini aramadan hemen önce .off () çağrısı yapmanız yeterlidir.

Bu, tüm olay işleyicilerini kaldıracak:

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

Yalnızca kayıtlı 'tıklama' olay işleyicilerini kaldırmak için:

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

7

İki tıklama sorununun oldukça yaygın bir çözümü,

e.stopPropagation()

işlevinizin sonunda (bunu kullandığınızı varsayarak function(e)). Bu, işlevin ikinci kez çalıştırılmasına yol açabilecek olayın köpürmesini önler.


6

Aynı sorunu yaşadım, ancak bu kodu değiştirmeyi deneyebilirsiniz

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

buna:

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

Benim için bu kod sorunu çözdü. Ancak komut dosyanızı yanlışlıkla HTML sayfanıza iki kez eklememeye dikkat edin. Bu iki şeyi doğru yapıyorsanız kodunuzun doğru çalışacağını düşünüyorum. Teşekkürler


3

lütfen bunu dene

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

"Canlı" yı "açık" olarak değiştirdim ve benim için işe yarıyor gibi görünüyor. Bu nedenle, olay yalnızca düğmeye tıklandığında tetiklenir.
Vikneshwar

Bu yerinde.
LargeTuna

3

Bu kesinlikle FireFox iken özellikle bir hatadır. Yukarıdaki cevapların hepsini denedim ve sonunda SO üzerinden birçok uzman tarafından hata olarak aldım. Böylece, nihayet bu fikri şu şekilde değişken tanımlayarak buldum:

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

    }
});

Bu şekilde, önce işlevin daha önce çağrılıp çağrılmadığını kontrol eder.


3

İşlevimin e.preventDefault();başlangıcında ekleme yapmak benim için çalıştı.


3

Bu daha eski bir soru, ancak olay yetkilendirme kullanıyorsanız benim için buna neden olan buydu.

Kaldırdıktan sonra .delegate-twoiki kez çalıştırmayı durdurdu. Her iki delege de aynı sayfada bulunursa bunun olacağına inanıyorum.

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

2

bu kod parçacığı kötü bir şey içermiyor. @Karim'in söylediği gibi senaryonuzun başka bir parçası


2

Benim durumumda, Chrome'da iyi çalışıyordu ve IE .click()iki kez arıyordu . Eğer sorununuz buysa, .click()olayı çağırdıktan sonra yanlış döndürerek sorunu düzelttim

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

2

Arama unbindsorunumu çözdü:

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

2

Neden olduğundan emin değilim ama bu sorunu yaşadım

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

Olarak değiştirdiğimde

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

Sorun çözüldü. Ama kodumda kesinlikle yanlış bir şeyler var.


bu benim için Laravel'de çalıştı, bu soruna neyin sebep olduğunu bilmiyorum
khan Farman

1

Birden çok öğeyle eşleşen bir seçimle kandırıldım, böylece her biri tıklandı. :firstyardım etti:

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

1

Ben de FF'de bu sorunu yaşadım. Ancak etiketim bir <a>etikete bağlıydı . Gerçi <a>etiketi hiçbir yere gitmiyordu hala çift tıklayın yaptı. Bunun yerine <a>etiketi bir <span>etiketle değiştirdim ve çift tıklama sorunu ortadan kalktı.

Başka bir alternatif, bağlantı hiçbir yere gitmiyorsa href özelliğini tamamen kaldırmaktır.


Bu soruya gerçekten cevap vermiyor. Farklı bir sorunuz varsa, Soru Sor'a tıklayarak sorabilirsiniz . Yeterli itibara sahip olduğunuzda bu soruya daha fazla dikkat çekmek için bir ödül de ekleyebilirsiniz .
Sean Patrick Floyd

@SeanPatrickFloyd: Aslında bu bir cevap. Kırmızı bayrakları yükseltmek için formüle edilmiş olsa bile.
Deduplicator

1

Bu sorunla karşılaştım çünkü $(elem).click(function(){});komut dosyam şu şekilde ayarlanmış bir div'e satır içi olarak yerleştirildistyle="display:none;" .

Css görüntüsü blok olarak değiştirildiğinde, komut dosyası olay dinleyicisini ikinci kez ekler. Komut dosyasını ayrı bir .js dosyasına taşıdım ve yinelenen olay dinleyicisi artık başlatılmadı.


1

Bu yöntemi jquery ile yükleme sayfasında kullandığımda $('#obj').off('click');, tıklama işlevini ayarlamadan önce yazıyorum , böylece kabarcık oluşmasın. Benim için çalışıyor.


1

Benim basit cevabım, tıklama bağlantısını bir işleve dönüştürmek ve bunu öğenin bir kez tıklanmasıyla aramak oldu - bir zevkti! oysa yukarıdakilerin hiçbiri yapmadı


0

Etkinliğiniz iki veya üç kez veya daha fazla arıyorsa, bu yardımcı olabilir.

Olayları tetiklemek için buna benzer bir şey kullanıyorsanız ...

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

... sonra sayısına dikkat edin .js-someclass sayfadaki öğelerin edin, çünkü tüm öğeler için tıklama olayını tetikleyecektir - sadece bir kez değil!

O halde basit bir düzeltme, yalnızca ilk öğeyi seçerek tıklamayı yalnızca bir kez tetiklediğinizden emin olmaktır , örneğin:

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

0

Elbette, komut dosyanızın başka bir yerinde, "tıklama" olayı, diğer birkaç yanıtın / yorumun önerdiği gibi, aynı öğeye yeniden bağlanıyor.

Benzer bir sorun yaşadım ve bunu doğrulamak için, console.logaşağıdaki kod parçacığında olduğu gibi komut dizime bir komut ekledim :

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

Düğmeye tıkladığınızda, tarayıcınızın geliştirici konsolundan aşağıdaki resme benzer bir şey görürseniz (benim yaptığım gibi), click()etkinliğin aynı düğmeye iki kez bağlandığından emin olursunuz .

geliştiricinin konsolu

Hızlı bir yamaya ihtiyacınız varsa, diğer yorumcular tarafından önerilen off( unbindjQuery 3.0'dan beri btw kullanımdan kaldırılmıştır) çözüm, (yeniden) bağlamadan önce olayı çözmek için iyi çalışıyor ve ben de tavsiye ederim:

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

Ne yazık ki, bu yalnızca geçici bir yama! Sizi patron mutlu etme sorunu çözüldüğünde, kodunuzu biraz daha araştırmalı ve "çoğaltılmış bağlama" sorununu gidermelisiniz.

Gerçek çözüm elbette sizin özel kullanım durumunuza bağlıdır. Benim durumumda, örneğin, bir "bağlam" sorunu vardı. Belgenin belirli bir bölümüne uygulanan bir Ajax çağrısının sonucu olarak işlevim çağrılıyordu: tüm belgeyi yeniden yüklemek aslında hem "sayfa" hem de "öğe" bağlamlarını yeniden yüklüyordu, bu da olayın öğeye iki kez bağlanmasıyla sonuçlanıyordu .

Bu sorunun çözümü benim jQuery kaldıraç oldu biri aynıdır işlevi, üzerindeki olay ilk çağırma sonra otomatik olarak ilişkisiz olduğunu hariç. Bu benim kullanım durumum için idealdi, ancak yine, diğer kullanım durumları için çözüm olmayabilir.


-1

Aynı sorunu yaşadım. Bu benim için çalıştı -

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

Umarım bu birine yardımcı olur.


Benim için bir hata veriyor ... Ayrıca bu kirli bir çözüm - işlev birden çok kez çalıştırılıyor, çözüm onu ​​başka bir yere yerleştirmek ve bir şeyleri izlemek için console.log () kullanmak.
tylerl

-1

Benim durumumda, HTML şu şekilde düzenlenmiştir:

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

Ve jQuery'm şöyleydi:

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

Kafamı karıştırdı çünkü hiçbir şey olmuyor gibiydi. Sorun, iç .shares’nin toggle dış .shares’yi iptal etmesiydi toggle.


-1

Öğe türünü değiştirerek bu sorunu çözdüm. düğme yerine girdi koyuyorum ve bu sorun artık oluşmuyor.

anları:

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

ile değiştirin:

<input onclick="doSomthing()" value="click me">
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.