JQuery'de programlı ve kullanıcı tıklamasını nasıl anlayabilirim?


91

Tanımlanmış bir tıklama işleyicim olduğunu varsayalım:

$("#foo").click(function(e){

});

İşlev işleyicinin içinde olayın programlı olarak mı yoksa kullanıcı tarafından mı başlatıldığını nasıl anlayabilirim?


Program bir olayı programlı olarak tetiklemeye nasıl devam ediyor?
Clayton

5
Neden vakaları ayırt etmeniz gerekiyor?
Damien_The_Unbeliever

@Clayton: $x.click()veya $x.trigger('click').
mu çok kısa

Görüntüler arasında otomatik olarak kayan bir görüntü kaydırıcıyla ilgili bir durum yaşadım ve bunu görüntüyle ilişkili doğru gezinme öğesinin tıklanmasını tetikleyerek yaptım. Sorun, kullanıcı nav'ı tıkladığında otomatik rotasyonun durmasıdır.
Kasapo

2
Bu, en son firefox, chrome ve IE9'da çalışır. Aşağıdaki cevabı neden en yüksek oylarla kabul etmiyorsunuz? @kevino
OZZIE

Yanıtlar:


120

Olay nesnesine bir göz atabilirsiniz e. Olay gerçek tıklama tetiklendiyse, olayları sever gerekecek clientX, clientY, pageX, pageY, vb iç eve sayılar olacak; bu sayılar, tıklama tetiklendiğinde fare konumu ile ilgilidir, ancak tıklama klavye aracılığıyla başlatılsa bile muhtemelen mevcut olacaktır. Etkinlik tarihine kadar tetiklendiyse $x.click(), konumunda olağan konum değerlerine sahip olmazsınız e. Ayrıca , olay geldiyse orada olmaması gereken originalEventmülke de bakabilirsiniz $x.click().

Belki bunun gibi bir şey:

$("#foo").click(function(e){
    if(e.hasOwnProperty('originalEvent'))
        // Probably a real click.
    else
        // Probably a fake click.
});

Ve işte oynamak için küçük bir sanal alan: http://jsfiddle.net/UtzND/


4
Bu harika ... Kendi kendime "belki jQuery'nin tetiklediği olaylarda fare konumu bilgisi yok" diye düşündüm! w00t!
Kasapo

2
Bu, createEvent'i destekleyen tarayıcılarda yenilebilir. jsfiddle.net/UtzND/26
Joe Enzminger

2
@JoeEnzminger evet ama tabiri caizse neden kendi senaryonuzu yeniyorsunuz ...?
OZZIE

3
Bir tıklama olayı oluşturan bir üçüncü taraf komut dosyasıyla ilgili endişelerim var ve komut dosyamın bunu kullanıcı tarafından oluşturulmuş olduğu varsayımıyla (gerçek bir tıklama) işliyor.
Joe Enzminger

2
@JoeEnzminger: Kodunuz tarayıcıya girdikten sonra tüm bahisler kapanır, yeterince zeki bir kişi tarafından mağlup edilemeyecek hiçbir şey yapamazsınız. Bence yapabileceğiniz en iyi şey bir sürü şeyi kontrol etmektir: Var mı originalEvent? Doğru türden bir şey mi? Herhangi bir yerde koordinatlar var mı? Koordinatlar tutarlı mı? Koordinatlar içeride #foomi? ...
mu çok kısa

44

JQuery tetik kılavuzunda belirtildiği gibi ekstra bir parametre kullanabilirsiniz :

$("#foo").click(function(e, from){
    if (from == null)
        from = 'User';
    // rest of your code
});

$('#foo').trigger('click', ['Trigger']);

3
Bununla ilgili gördüğüm tek sorun, normal bir tıklama arasında ayrım yapamamanız $x.click()ve .click()arayanın size açıkça numara yaptığını söylemesi gerekiyor. Bu Kevin Owocki'nin ne yaptığına bağlı olarak bir sorun olabilir veya olmayabilir.
mu çok kısa

1
@mu: "Normal" tıklama (kullanıcı?) ile $x.click()eventHandler (kullanıcı tıklaması için, "normal" olabilir) arasındaki
farkı tam olarak anlayamıyorum

1
Aradaki fark, birinin kullanıcıdan, diğerinin yazılımdan gelmesidir. Sahte tıklama, bir eklentiden veya fazladan bağımsız değişkenler eklemek için değiştirilemeyen başka bir koddan geliyor olabilir. Çözümünüzü eleştirmiyorum, sadece bazı olası boşluklara dikkat çekiyorum.
mu çok kısa

Mu doğru olsa ve bu her durumda işe yaramayacak olsa da, tam olarak aradığım buydu, teşekkür ederim! Ekstra parametreyi bir değişken gibi geçirebileceğimi bilmiyordum, ancak bazı "gerçek" tıklamaları programatik olarak ele alan karmaşık bir kullanıcı arayüzünde "gerçek" tıklamaları test etmek için tam olarak ihtiyacım olan şey buydu. Hem inanılmaz derecede kullanışlı çözümler için teşekkürler!
Phil

9

Zaten cevaplanmış başka bir soru var.

Bir tıklamanın () bir fare tıklaması olup olmadığı veya bir kod tarafından tetiklendiği nasıl anlaşılır?

whichOlay nesnesinin özelliğini kullanın . undefinedKodla tetiklenen olaylar için olmalıdır

$("#someElem").click(function(e) {
    if (e.which) {
        // Actually clicked
    } else {
        // Triggered by code
    }
});

JsFiddle örneği - http://jsfiddle.net/interdream/frw8j/

Umarım yardımcı olur!


2
Her zaman işe yaramıyor. Örneğin select, e.which==undefinedgerçek bir olay için bir eşitlik verir .
JNF

5

Yukarıdaki tüm çözümleri denedim, benim durumumda hiçbir şey işe yaramadı. Aşağıdaki çözüm benim için çalıştı. Umarım size de yardımcı olur.

$(document).ready(function(){
  //calling click event programmatically
    $("#chk1").trigger("click");
});

$(document).on('click','input[type=checkbox]',function(e) {
		if(e.originalEvent.isTrusted==true){
			alert("human click");
		}
		else{
			alert("programmatically click");
		}
    
    });
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js">
</script>

<input type="checkbox" id="chk1" name="chk1" >Chk1</input>
<input type="checkbox" id="chk2" name="chk2" >Chk2</input>
<input type="checkbox" id="chk3" name="chk3" >Chk3</input>


4

DOM Düzey 3, event.is Trusted'i belirtir. Bu, şu anda yalnızca IE9 + ve Firefox'ta desteklenmektedir (testlerime göre. Ayrıca bazı tarayıcılarda geçersiz kılınabileceğini ve muhtemelen güvenilmeye henüz% 100 hazır olmadığını (ne yazık ki) okudum (tam olarak araştırılmamış olsa da).

Bu , @ mu'nun kemanının IE ve Firefox'ta çalışan değiştirilmiş bir sürümüdür.


İyi bir nokta. Yine de hiçbir şeyin% 100 sağlam olacağını sanmıyorum. isTrustedDesteklendiğini ve yazılabilir olmadığını görmek için bazı testleri karıştırmanız gerekir . Bence gerçek cevap, bu sorunun arkasındaki nedene bağlı ve nedenini asla bulamadık.
mu çok kısa

@mu, benzer ama daha genel bir soru sorduktan sonra bu soruya geldim. Benim "neden" durumum, kullanıcı sayfada doğrudan olumlu bir işlem yaparsa yalnızca bir eylem (küçük de olsa bir finansal işlem) gerçekleştirdiğimden emin olmak istiyorum.
Joe Enzminger

1

Vanila js çözümü:

document.querySelector('button').addEventListener('click', function (e){
    if(e.isTrusted){
        // real click.
    }else{
        // programmatic click
    }
});

-1

Entelektüel tartışmaya katılmayı filtreye benim için çalıştı kodu gitmiyorum .click()ve .trigger('click')IS-

$(document).on('click touchstart', '#my_target', function(e) {
    if (e.pageX && e.pageY) { // To check if it is not triggered by .click() or .trigger('click')
        //Then code goes here
    }
});
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.