2011-07-14 57 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