我有一個處理程序附加到一個事件,我希望它只能在人類觸發而不是觸發器()方法觸發時執行。我如何分辨差異?檢查事件是否由人觸發
例如,
$('.checkbox').change(function(e){
if (e.isHuman())
{
alert ('human');
}
});
$('.checkbox').trigger('change'); //doesn't alert
我有一個處理程序附加到一個事件,我希望它只能在人類觸發而不是觸發器()方法觸發時執行。我如何分辨差異?檢查事件是否由人觸發
例如,
$('.checkbox').change(function(e){
if (e.isHuman())
{
alert ('human');
}
});
$('.checkbox').trigger('change'); //doesn't alert
您可以檢查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();
});
@Nicola這是記錄在任何地方? –
@Sime我不知道,但我認爲這是標準。看看這裏:http://api.jquery.com/category/events/event-object/ –
@Nicola我看,這是一個jQuery的東西。 jQuery將原始事件對象存儲在此屬性中。順便說一句,你是什麼意思,你不知道?你只是提供了鏈接到文檔':)' –
我認爲要做到這一點的唯一方法將是一個額外的參數傳遞的trigger
通話按該documentation。
$('.checkbox').change(function(e, isTriggered){
if (!isTriggered)
{
alert ('human');
}
});
$('.checkbox').trigger('change', [true]); //doesn't alert
您可以查看事件對象的屬性originalEvent:如果事件不是來自點擊事件,則它是未定義的 –
[將數據與觸發器一起傳遞](http://api.jquery.com/trigger/)絕對是委派事件的途徑。 [至少點擊事件似乎沒有參數](http://jsfiddle.net/notacouch/Uf8Wv/69/)。但[如果你做了一個自定義事件,那麼傳遞參數應該不成問題](http://jsfiddle.net/notacouch/Uf8Wv/68/)。 – notacouch
由於某些原因,當使用Zepto的'click'處理程序時,event.originalEvent不適用於我(只是不停地回頭1)。所以我嘗試了上面的解決方案。像魅力一樣工作。 – Larrydx
我曾經想,你點擊鼠標的位置,就像一個可能性:
我可能無法在以下情況下工作:有時可以使用Tab鍵選擇頁面的元素。例如,如果我以這種方式選擇了複選框,則可以使用空格鍵來選中/取消選中。或者甚至使用向下箭頭鍵打開drodpdown。 –
更直接比以上將是:
$('.checkbox').change(function(e){
if (e.isTrigger)
{
alert ('not a human');
}
});
$('.checkbox').trigger('change'); //doesn't alert
這是最好的答案。對於解釋,請參閱:http://stackoverflow.com/questions/10704168/in-javascript-what-is-event-istrigger – jaredjacobs
雖然這是誘人的,可能在實踐中很舒適,請注意,jQuery開發人員不希望畢業' isTrigger'到公共API [截至此時](https://github.com/jquery/api.jquery.com/issues/319)。 – Jon
您可以使用onmousedown來檢測鼠標點擊與觸發()調用。
我可能無法在以下情況下工作:有時可以使用Tab鍵選擇頁面的元素。例如,如果我以這種方式選擇了複選框,則可以使用空格鍵來選中/取消選中。或者甚至使用向下箭頭鍵打開drodpdown。 –
接受的答案不適合我。已經有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
}
櫃面你有你的所有代碼控制,沒有外星人通話$(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()
。 祝你好運或檢查其他答案
這隻會阻止人們調用'setFocus()' - 它不會阻止人們觸發焦點事件。根本不寫'setFocus()'也會阻止人們調用它,所以我沒有看到好處。事實上,人們仍然可以調用'$('input')。focus()'並讓它通過。 – Rob
哇,我第一次有人評論後,我回答了這個問題,我會更新答案 – vanduc1102
我花了一段時間才弄清楚如何谷歌這個問題。 – minexew
@minexew使用編程最難的部分是命名變量和如何谷歌問題!:P –