2011-07-14 22 views
105

Bir olaya bağlı bir işleyicim var ve yalnızca bir tetikleyici() yöntemiyle değil, yalnızca bir insan tarafından tetiklendiğinde yürütmesini istiyorum. Farkı nasıl anlarım? Örneğin Olayın bir insan tarafından tetiklendiğini kontrol edin

,

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

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

Bu soruyu nasıl anlayacağımı öğrenmek bana biraz zaman aldı. – minexew

+0

@minexew Programlamayı kullanmanın en zor kısmı değişkenler ve google sorunlarına nasıl ad verilir?: P –

cevap

163

Sen e.originalEvent kontrol edebilirsiniz: o tanımlanmış, tıklama insandır: keman de

Bak keman benim örnek http://jsfiddle.net/Uf8Wv/

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

: yalındır

<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 belgelenmiş mi? –

+0

@Sime bilmiyorum, ama standart olduğunu düşünüyorum. Buraya bakın: http: //api.jquery.com/category/events/event-object/ –

+0

@Nicola Görüyorum, bu bir jQuery şey. jQuery, bu özelliğin içindeki orijinal olay nesnesini depolar. Btw, ne demek istemedin? Sadece aşağıdaki bağlantıyı sağladınız: '' '' –

5

Bunu yapmanın tek yolu documentation uyarınca trigger çağrı üzerine ek bir parametre geçmek olacağını düşünüyoruz.

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

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

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

+1

olay nesnesinin originalEvent özelliğini kontrol edebilirsiniz: olay bir tıklamadan gelmiyorsa, tanımlanmamış –

+0

[Verileri tetikle birlikte geçirme] (http://api.jquery.com/trigger/) kesinlikle devredilen olaylar için gitmek için yoldur. [En azından tıklama olayı parametreler almıyor gibi görünüyor] (http://jsfiddle.net/notacouch/Uf8Wv/69/). Ancak [eğer özel bir etkinlik yaparsanız, parametreleri aktarmanız sorun olmaz] (http://jsfiddle.net/notacouch/Uf8Wv/68/). – notacouch

+1

Herhangi bir nedenden dolayı, event.originalEvent, Zepto'nun 'click' işleyicisini kullanırken benim için çalışmazdı (sadece 1'e devam etti). Bu yüzden yukarıdaki çözümü denedim. Bir çekicilik gibi çalıştı. – Larrydx

1

ben sizin gibi, fare konumunu kontrol imkânını düşünürdüm:

  • tıklayın
  • alın fare pozisyonu
  • ait Coords çakışmalar
  • ...
+0

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. –

13

Daha Yukandakilerden daha fazlası:

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

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

Bu en iyi cevaptır. Açıklama için bkz: http://stackoverflow.com/questions/10704168/in-javascript-what-is-event-istrigger – jaredjacobs

+1

Bu uygulama çekici ve muhtemelen rahat olsa da, jQuery geliştiricilerinin mezun olmak istemediklerini unutmayın. isTrigger', bu zamana kadar [bu zamana kadar] (https://github.com/jquery/api.jquery.com/issues/319). – Jon

1

Fare tıklaması veya tetikleyici() çağrısını algılamak için onmousedown özelliğini kullanabilirsiniz.

+0

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. –

1

Kabul edilen cevap benim için çalışmadı. 6 yıl geçti ve jQuery o zamandan beri çok değişti. Örneğin

jQuery 1.9.x. ile daima trueevent.originalEvent döner Nesne her zaman var demek ama içerik farklı.

jQuery'nin daha yeni sürümlerini kullananlar bunu deneyebilirler. Chrome, Edge, IE, Opera, FF

çalışır
if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) { 
    //Hey hooman it is you 
} 
-1

Örtmek tüm kod kontrole sahip, hiçbir yabancı setFocus() daha $(input).focus() çağırır.

Genel değişken kullan benim için doğru 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ı yabancı hala başka bir gezegenden $(input).focus() aramak isterseniz. İyi şanslar veya diğer cevapları kontrol edin

+0

Bu, yalnızca kullanıcıların "setFocus()" işlevini çağırmasını engeller - kullanıcıların odak etkinliğini tetiklemesini engellemez. 'SetFocus()' yazmamak da insanların bunu engellemesini engelleyecektir, bu yüzden ben de fayda göremiyorum. Aslında, insanlar hala '$' ('input') diyebiliriz, focus() 've onu geçebilir. – Rob

+0

Vay canına, ilk kez bir sorum var, soruya cevap verdikten hemen sonra cevabı güncelleyeceğim – vanduc1102

İlgili konular