2011-07-14 59 views
105

我有一個處理程序附加到一個事件,我希望它只能在人類觸發而不是觸發器()方法觸發時執行。我如何分辨差異?檢查事件是否由人觸發

例如,

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

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

我花了一段時間才弄清楚如何谷歌這個問題。 – minexew

+0

@minexew使用編程最難的部分是命名變量和如何谷歌問題!:P –

回答

163

您可以檢查e.originalEvent:如果它定義的點擊是人類:

看小提琴http://jsfiddle.net/Uf8Wv/

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

我在小提琴例如:

<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這是記錄在任何地方? –

+0

@Sime我不知道,但我認爲這是標準。看看這裏:http://api.jquery.com/category/events/event-object/ –

+0

@Nicola我看,這是一個jQuery的東西。 jQuery將原始事件對象存儲在此屬性中。順便說一句,你是什麼意思,你不知道?你只是提供了鏈接到文檔':)' –

5

我認爲要做到這一點的唯一方法將是一個額外的參數傳遞的trigger通話按該documentation

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

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

例子:http://jsfiddle.net/wG2KY/

+1

您可以查看事件對象的屬性originalEvent:如果事件不是來自點擊事件,則它是未定義的 –

+0

[將數據與觸發器一起傳遞](http://api.jquery.com/trigger/)絕對是委派事件的途徑。 [至少點擊事件似乎沒有參數](http://jsfiddle.net/notacouch/Uf8Wv/69/)。但[如果你做了一個自定義事件,那麼傳遞參數應該不成問題](http://jsfiddle.net/notacouch/Uf8Wv/68/)。 – notacouch

+1

由於某些原因,當使用Zepto的'click'處理程序時,event.originalEvent不適用於我(只是不停地回頭1)。所以我嘗試了上面的解決方案。像魅力一樣工作。 – Larrydx

1

我曾經想,你點擊鼠標的位置,就像一個可能性:

  • 點擊
  • 獲取鼠標位置
  • 重疊的的COORDS按鈕
  • ...
+0

我可能無法在以下情況下工作:有時可以使用Tab鍵選擇頁面的元素。例如,如果我以這種方式選擇了複選框,則可以使用空格鍵來選中/取消選中。或者甚至使用向下箭頭鍵打開drodpdown。 –

13

更直接比以上將是:

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

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

這是最好的答案。對於解釋,請參閱:http://stackoverflow.com/questions/10704168/in-javascript-what-is-event-istrigger – jaredjacobs

+1

雖然這是誘人的,可能在實踐中很舒適,請注意,jQuery開發人員不希望畢業' isTrigger'到公共API [截至此時](https://github.com/jquery/api.jquery.com/issues/319)。 – Jon

1

您可以使用onmousedown來檢測鼠標點擊與觸發()調用。

+0

我可能無法在以下情況下工作:有時可以使用Tab鍵選擇頁面的元素。例如,如果我以這種方式選擇了複選框,則可以使用空格鍵來選中/取消選中。或者甚至使用向下箭頭鍵打開drodpdown。 –

1

接受的答案不適合我。已經有6年了,從那以後,jQuery發生了很大的變化。

例如event.originalEvent通過jQuery 1.9.x總是返回true。我的意思是對象總是存在,但內容是不同的。

那些使用較新版本的jQuery的人可以試試這個。適用於Chrome,邊緣,IE,歌劇,FF

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

櫃面你有你的所有代碼控制,沒有外星人通話$(input).focus()setFocus()

使用全局變量對我來說是一個正確的方法。

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 

如果一些外星人仍然想從另一個星球撥打$(input).focus()。 祝你好運或檢查其他答案

+0

這隻會阻止人們調用'setFocus()' - 它不會阻止人們觸發焦點事件。根本不寫'setFocus()'也會阻止人們調用它,所以我沒有看到好處。事實上,人們仍然可以調用'$('input')。focus()'並讓它通過。 – Rob

+0

哇,我第一次有人評論後,我回答了這個問題,我會更新答案 – vanduc1102