我有一个附加到事件的处理程序,我希望它只在由人类触发时执行,而不是由trigger()方法触发。我该如何区分?
例如,
$('.checkbox').change(function(e){
if (e.isHuman())
{
alert ('human');
}
});
$('.checkbox').trigger('change'); //doesn't alert
答案 0 :(得分:194)
您可以查看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 :(得分:18)
比上面更直接的是:
$('.checkbox').change(function(e){
if (e.isTrigger)
{
alert ('not a human');
}
});
$('.checkbox').trigger('change'); //doesn't alert
答案 2 :(得分:6)
我认为执行此操作的唯一方法是根据documentation在trigger
来电中传递额外参数。
$('.checkbox').change(function(e, isTriggered){
if (!isTriggered)
{
alert ('human');
}
});
$('.checkbox').trigger('change', [true]); //doesn't alert
答案 3 :(得分:6)
接受的答案对我不起作用。已经有6年了,jQuery从那以后发生了很大的变化。
例如event.originalEvent
总是使用jQuery 1.9.x返回true
。我的意思是对象总是存在但内容却不同。
使用较新版本的jQuery的人可以尝试这个。适用于Chrome,Edge,IE,Opera,FF
if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) {
//Hey hooman it is you
}
答案 4 :(得分:1)
我会考虑检查鼠标位置的可能性,例如:
答案 5 :(得分:1)
您可以使用onmousedown来检测鼠标点击与触发()调用。
答案 6 :(得分:1)
当前大多数浏览器都支持event.isTrusted:
if (e.isTrusted) {
/* The event is trusted: event was generated by a user action */
} else {
/* The event is not trusted */
}
来自docs:
Event
界面的 isTrusted 只读属性是Boolean
当事件是由用户操作生成时为 true ,而为 false 通过脚本创建或修改事件或通过以下事件调度事件时 EventTarget.dispatchEvent()。
答案 7 :(得分:0)
如果你控制了所有代码,没有外国人来电$(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()
。
祝你好运或查看其他答案