我有一个处理程序附加到一个事件,我希望它只能在人类触发而不是触发器()方法触发时执行。我如何分辨差异?检查事件是否由人触发
例如,
$('.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 –