Olayın bir insan tarafından tetiklenip tetiklenmediğini kontrol edin


140

Bir olaya bağlı bir işleyici var ve ben bir tetikleyici () yöntemi tarafından değil, sadece bir insan tarafından tetiklenirse yürütmek istiyorum. Farkı nasıl anlarım?

Örneğin,

$('.checkbox').change(function(e){
  if (e.isHuman())
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

Yanıtlar:


212

Şunları kontrol edebilirsiniz e.originalEvent: Tanımlanmışsa tıklama insandır:

Kemana bakın http://jsfiddle.net/Uf8Wv/

$('.checkbox').change(function(e){
  if (e.originalEvent !== undefined)
  {
    alert ('human');
  }
});

kemandaki örneğim:

<input type='checkbox' id='try' >try
<button id='click'>Click</button>

$("#try").click(function(event) {
    if (event.originalEvent === undefined) {
        alert('not human')
    } else {
        alert(' human');
    }


});

$('#click').click(function(event) {
    $("#try").click();
});

1
@Nicola Bu herhangi bir yerde belgelendi mi?
Šime Vidas

@Sime bilmiyorum, ama bence standart. buraya bakın: api.jquery.com/category/events/event-object
Nicola Peluchetti

@Nicola Anlıyorum, bu bir jQuery olayı. jQuery, özgün olay nesnesini bu özelliğin içinde saklar. Btw, ne demek istediğini bilmiyorsun? Sadece belgelere bağlantı verdiniz:)
Šime Vidas

1
Ayrıca kullanabileceğiniz gibi görünüyorevent.isTrigger
avoliva

1
@Anurag, şu an aynı sorunu yaşıyordum. JQuery originalEvent, olay tarafından tetiklendiğinde doldurulur DOM.click(), ancak kullanabilirsiniz $($("#try")[0]).click();, bu da tıknazdır, ancak çalışır.
Daniel Garrett

19

Yukarıdakilerden daha düz ileri:

$('.checkbox').change(function(e){
  if (e.isTrigger)
  {
    alert ('not a human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

Bu en iyi cevap. Açıklama için, bakınız: stackoverflow.com/questions/10704168/…
jaredjacobs

3
Bu cazip ve muhtemelen pratikte rahat olsa da, jQuery geliştiricilerinin şu andanisTrigger itibaren genel API'ya geçmek istemediklerini unutmayın .
Jon

7

Bunu yapmanın tek yolunun belgelere göretrigger çağrıda ek bir parametre geçirmek olacağını düşünüyorum .

$('.checkbox').change(function(e, isTriggered){
  if (!isTriggered)
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change', [true]); //doesn't alert

Örnek: http://jsfiddle.net/wG2KY/


1
event nesnesinin originalEvent özelliğini kontrol edebilirsiniz: etkinlik bir tıklamadan
gelmezse


1
Nedense event.originalEvent, Zepto'nun 'click' işleyicisini kullanırken benim için çalışmadı (1'i emekliye ayırmaya devam etti). Bu yüzden yukarıdaki çözümü denedim. Bir cazibe gibi çalıştı.
Larrydx

7

Kabul edilen cevap benim için işe yaramadı. 6 yıl oldu ve jQuery o zamandan beri çok değişti.

Örneğin event.originalEvent, her zaman truejQuery 1.9.x ile döner. Yani nesne her zaman var ama içerik farklı.

JQuery'nin daha yeni sürümlerini kullananlar bunu deneyebilir. Chrome, Edge, IE, Opera, FF üzerinde çalışır

if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) {
    //Hey hooman it is you
}

3

Şu anda tarayıcıların çoğu event.isTrusted'ı destekliyor :

if (e.isTrusted) {
  /* The event is trusted: event was generated by a user action */
} else {
  /* The event is not trusted */
}

Gönderen docs :

IsTrusted salt okunur özelliği Eventarabirimi olan bir Boolean olduğu gerçek bir olay, bir kullanıcı hareketi ile üretilen ve zaman yanlış bir olay oluşturulmuş veya değiştirilmiş bir komut dosyası veya üzerinden gönderilmiş olan EventTarget.dispatchEvent () .


0

Fare tıklaması vs tetikleyici () çağrısı algılamak için onmousedown kullanabilirsiniz.


Aşağıdaki senaryoda çalışmayabilir: Bazen Tab tuşunu kullanarak sayfa öğelerini seçmek mümkündür. Örneğin, bu şekilde bir onay kutusu seçtiysem boşluk tuşunu kullanarak kontrol edebilir / işaretini kaldırabilirim. Veya aşağı ok tuşunu kullanarak bir drodpdown açın.
Diego Favero

0

Fare konumunu kontrol ettiğiniz gibi bir olasılık düşünürdüm:

  • Tıklayın
  • Fare konumunu al
  • Düğmenin kenarlarıyla çakışıyor
  • ...

Aşağıdaki senaryoda çalışmayabilir: Bazen Tab tuşunu kullanarak sayfa öğelerini seçmek mümkündür. Örneğin, bu şekilde bir onay kutusu seçtiysem boşluk tuşunu kullanarak kontrol edebilir / işaretini kaldırabilirim. Veya aşağı ok tuşunu kullanarak bir drodpdown açın.
Diego Favero

0

Tüm kod, hiçbir yabancı aramaların kontrol sahibi Örtmek $(input).focus()daha setFocus().

Global bir değişken kullanmak benim için doğru bir yoldur.

var globalIsHuman = true;

$('input').on('focus', function (){
    if(globalIsHuman){
        console.log('hello human, come and give me a hug');
    }else{
        console.log('alien, get away, i hate you..');
    }
    globalIsHuman = true;
});

// alien set focus
function setFocus(){
    globalIsHuman = false;
    $('input').focus();
}
// human use mouse, finger, foot... whatever to touch the input

Bazı uzaylılar hala $(input).focus()başka bir gezegenden aramak istiyorsa . İyi şanslar veya diğer cevapları kontrol edin


Bu sadece insanların aramalarını önler setFocus()- insanların odaklama olayını tetiklemelerini engellemez. Yazmamak setFocus()da insanların aramasını engeller, bu yüzden fayda görmüyorum. Aslında, insanlar hala arayabilir $('input').focus()ve geçmesini sağlayabilirler.
Rob

wow, soruyu cevapladıktan hemen sonra birisinin yorumu var, cevabı güncelleyeceğim
vanduc1102

Başka / 3. taraf komut dosyası olmayan kapalı bir ortamda çalışıyorsanız, bu mükemmel bir dünyada işe yarayacaktır. Bununla birlikte, en pratik uygulamalar, bunlara çok iyi odaklanabilecek çok çeşitli eklentilere ve komut dosyalarına sahip istemci siteleri içindir. Buna yardımcı olabilecek bir şey, kodunuzu (ve bu işlevi çağırması gereken herhangi bir kodu) aşağıdaki gibi kapsamlı bir işleve sarmaktır: (function(){/*your code here*/})();Bu, setFocus işlevinin çağrılmasını ve booleanın dış komut dosyaları tarafından değiştirilmesini önler.
Xandor
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.