Javascript 检查事件是否由人工触发

Javascript 检查事件是否由人工触发,javascript,jquery,Javascript,Jquery,我有一个附加到事件的处理程序,我希望它仅在由人触发而不是由trigger()方法触发时执行。我该如何区别呢 比如说, $('.checkbox').change(function(e){ if (e.isHuman()) { alert ('human'); } }); $('.checkbox').trigger('change'); //doesn't alert 我认为这样做的唯一方法是根据 示例:我会考虑检查鼠标位置的可能性,如: 点击 获取鼠标位置 重叠按钮的

我有一个附加到事件的处理程序,我希望它仅在由人触发而不是由trigger()方法触发时执行。我该如何区别呢

比如说,

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

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

我认为这样做的唯一方法是根据


示例:

我会考虑检查鼠标位置的可能性,如:

  • 点击
  • 获取鼠标位置
  • 重叠按钮的坐标

您可以检查
e.originalEvent
:如果已定义,则单击是人为的:

看这把小提琴

我在小提琴中的例子:

<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();
});
试试看
点击
$(“#try”)。单击(函数(事件){
if(event.originalEvent==未定义){
警报(“非人类”)
}否则{
警惕(‘人’);
}
});
$(“#单击”)。单击(函数(事件){
$(“#try”)。单击();
});

比上面更直截了当的是:

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

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

您可以使用onmousedown来检测鼠标单击vs trigger()调用。

接受的答案对我不起作用。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
}

如果您控制了所有代码,则不会有外来调用
$(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
如果某个外星人仍然想从另一个星球调用
$(输入).focus()

祝你好运或查看其他答案目前大多数浏览器都支持:

发件人:

事件
接口的受信任的只读属性是一个
布尔属性
当事件由用户操作生成时,为true,为false 通过脚本创建或修改事件或通过


您可以检查事件对象的属性originalEvent:如果事件不是来自单击,那么它是未定义的,这绝对是委派事件的方法。但是,由于某些原因,event.originalEvent在使用Zepto的“click”处理程序时对我不起作用(只是不断重复1)。所以我尝试了上面的解决方案。工作很有魅力。@Nicola这有记录吗?@Sime我不知道,但我认为这是标准的。看这里:@Nicola我明白了,这是一个jQuery的东西。jQuery将原始事件对象存储在此属性中。顺便说一句,你不知道是什么意思?您刚才提供了指向文档的链接
:)
看起来您也可以使用
事件。isTrigger
@Anurag,我刚才遇到了相同的问题。当事件由
DOM触发时,jQuery似乎会填充
originalEvent
。单击()
,但您可以使用
$($(“#尝试”)[0])。单击(),虽然很笨重,但很有效。这是最好的答案。有关解释,请参阅:虽然这在实践中很诱人,而且可能很舒适,但请注意,jQuery开发人员不希望将
isTrigger
升级到公共API。这只会阻止人们调用
setFocus()
——这并不阻止人们触发焦点事件。根本不写
setFocus()
也会阻止人们调用它,所以我看不出它有什么好处。事实上,人们仍然可以调用
$('input')。focus()
并让它通过。哇,在我回答问题后第一次有人评论,我会更新答案。如果你在封闭环境中工作,没有其他/第三方脚本,这将在一个完美的世界中工作。然而,大多数实际的应用程序都是针对那些添加了各种插件和脚本的客户端站点的,这些插件和脚本可以很好地称之为焦点。一件可能有助于实现这一点的事情是将代码(以及需要调用该函数的任何代码)包装到一个作用域函数中,如下所示:
(function(){/*此处的代码*/})()这将确保setFocus函数不会被调用,布尔值不会被外部脚本更改。我可能无法处理以下情况:有时可以使用Tab键选择页面的元素。例如,如果我以这种方式选择了复选框,我可以使用空格键选中/取消选中。或者甚至可以使用向下箭头键打开DrodDown。我可能无法处理以下情况:有时可以使用Tab键选择页面的元素。例如,如果我以这种方式选择了复选框,我可以使用空格键选中/取消选中。甚至用向下箭头键打开DrodDown。不在Chrome浏览器中工作
if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) {
    //Hey hooman it is you
}
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
if (e.isTrusted) {
  /* The event is trusted: event was generated by a user action */
} else {
  /* The event is not trusted */
}