JQuery.trigger nasıl alınır ('tıklayın'); fare tıklaması başlatmak için


145

JQuery kullanarak bir fare tıklaması simüle anlamak için zor bir zaman yaşıyorum. Birisi bana yanlış yaptığım şey hakkında bilgi verebilir mi?

HTML:

<a id="bar" href="http://stackoverflow.com" target="_blank">Don't click me!</a>
<span id="foo">Click me!</span>

jQuery:

jQuery('#foo').on('click', function(){
    jQuery('#bar').trigger('click');
});

Gösteri: FIDDLE

#fo düğmesine tıkladığımda #bar'da bir tıklamayı simüle etmek istiyorum ancak bunu denediğimde hiçbir şey olmuyor. Ben de denedim jQuery(document).ready(function(){...})ama başarılı olamadım.


2
jQuery triggeryalnızca herhangi bir 'jQuery click` etkinliği eklendiğinde çalışır. Aksi takdirde, bu şekilde hiçbir şey yapamazsınız;
Reza Mamun

3
Bu, tarayıcıda yerleşik bir güvenlik önlemidir. @ Blazemonger'ın cevabına bakınız: stackoverflow.com/questions/7999806/…
sanchez

1
@ san.chez Bilgi için teşekkürler, bu güvenlik önlemini daha önce bilmiyordum!
lickmycode

Yanıtlar:


277

JQuery yöntemini kullanmak yerine jQuery('#bar')[0].click(); , gerçek DOM öğesinde (jQuery nesnesinde değil) fare tıklatmasını simüle etmek için kullanmanız gerekir .trigger().

Not: DOM Düzey 2 .click(), Safari'deki bazı öğeler üzerinde çalışmaz . Bir geçici çözüm kullanmanız gerekecektir.

http://api.jquery.com/click/


18
günümü $ ('# asd') [0] .click ();
waza123

JQuery ACF alanlarındaki bir sonraki sekmeyi tıklatmak için bunu kullanın: $ ('. Next'). (İşlev () {$ ('# birincil li.active'). Next (). Find ('. Acf-tab-button ') [0] .click ();});
Tisch

1
Teşekkürler. Masaüstünde çalışır. Ancak mobilde (android krom) öyle değil. baska öneri?
kk-dev11

Herhangi bir nedenle bu, geçerli URL'deki karmayı yok eder.
luis

1
<etiketindeki hreflerden biri '#' ise bunu yapar. <a normalde farklı bir URL'ye yönlendirir. Tıklama işleyiciniz dönmeden önce ev.preventDefault () ve ev.stopPropagation () ile durdurmanız gerekir. VEYA, <a; görünür olan herhangi bir şeye tıklama işleyicileri ekleyebilirsiniz.
OsamaBinLogin

43

Bunu yapmadan önce küçük bir zaman aşımı etkinliği koymanız yeterlidir .click() :

setTimeout(function(){ $('#btn').click()}, 100);

Sayfa yüklendiğinde bir tıklamayı simüle etmeye çalışıyorsanız mükemmel çalışır.
Gabriel Dzul

33

Bu JQuery davranışıdır. Neden bu şekilde çalıştığından emin değilim, sadece bağlantıdaki onClick işlevini tetikler.

Deneyin:

jQuery(document).ready(function() {
    jQuery('#foo').on('click', function() {
        jQuery('#bar')[0].click();
    });
});

Açıkladığınız için teşekkürler. JQuery çok rahatsız edici davranış, ancak kod çalışır.
lickmycode

Hiç rahatsız edici değil. trigger()tıklama etkinliği JavaScript bölümünü yürütmeyi amaçlamaktadır . function var() {}Birden çok kez kullanılan bir yeniden oluşturmaya çok benzer .

21

Demoma bakın: http://jsfiddle.net/8AVau/1/

jQuery(document).ready(function(){
    jQuery('#foo').on('click', function(){
         jQuery('#bar').simulateClick('click');
    });
});

jQuery.fn.simulateClick = function() {
    return this.each(function() {
        if('createEvent' in document) {
            var doc = this.ownerDocument,
                evt = doc.createEvent('MouseEvents');
            evt.initMouseEvent('click', true, true, doc.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
            this.dispatchEvent(evt);
        } else {
            this.click(); // IE Boss!
        }
    });
}

Ben örtecek this.click();bir inelse if(this.click)
Alex W

15

Faydalı olabilir:

Tetikleyiciyi çağıran kod , olay çağrıldıktan sonra gitmelidir .

Örneğin, #expense_tickets değeri değiştirildiğinde ve ayrıca sayfa yeniden yüklendiğinde yürütülmesini istediğim bazı kodlar var

$(function() { 

  $("#expense_tickets").change(function() {
    // code that I want to be executed when #expense_tickets value is changed, and also, when page is reload
  });

  // now we trigger the change event
  $("#expense_tickets").trigger("change");

})

4
Ahhh benim de sorunumdu! Neden trigger()çalışmadığı konusunda şaşkına döndü . Tetikleyici kodu çağırdığı işlevin üzerinde ayarladım - kanca aslında yerinde değildi. Doh!
Andrew Newby

5

jQuery's .trigger('click');yalnızca bir olayın bu olayda tetiklenmesine neden olur, varsayılan tarayıcı eylemini de tetiklemez.

Aşağıdaki JavaScript ile aynı işlevselliği simüle edebilirsiniz:

jQuery('#foo').on('click', function(){
    var bar = jQuery('#bar');
    var href = bar.attr('href');
    if(bar.attr("target") === "_blank")
    {
        window.open(href);
    }else{
        window.location = href;
    }
});

2

Benim için çalışan şunu deneyin:

$('#bar').mousedown();

0

İlk iki yanıtı denedim, dosya giriş öğelerimden "display: none" kaldırılana kadar benim için çalışmadı. Sonra geri .trigger () döndü de windows için safari çalıştı.

Yani sonuç, display kullanma: none; dosya girişinizi gizlemek için bunun yerine opaklık: 0 kullanabilirsiniz.


0

Teknik olarak bunun bir cevabı değil , jQuery ACF alanlarındaki sekmeler için sonraki ve önceki düğmeleri oluşturmak için kabul edilen cevabın ( https://stackoverflow.com/a/20928975/82028 ) iyi bir şekilde kullanılması :

$('.next').click(function () {
    $('#primary li.active').next().find('.acf-tab-button')[0].click();
});

$('.prev').click(function () {
    $('#primary li.active').prev().find('.acf-tab-button')[0].click();
});

0

Sadece şunu kullanın:

$(function() {
 $('#watchButton').click();
});

-3

Javascript ile bir tıklama etkinliğini simüle edemezsiniz. jQuery .trigger()işlevi, öğede yalnızca .on()jQuery yöntemiyle yakalayabileceğiniz "click" adlı bir olay başlatır.


9
"Bir tıklama etkinliğini javascript ile simüle edemezsiniz" - Evet yapabilirsiniz .
nnnnnn

Yanlış ... javascript / jquery ile bir tıklama olayını simüle edebilir ve açık olmadan .click ile tetikleyici tıklama olayını yakalayabilirsiniz.
Aerious
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.