检查事件是否由人触发

IT技术 javascript jquery
2021-02-05 22:29:27

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

例如,

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

$('.checkbox').trigger('change'); //doesn't alert
6个回答

您可以检查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();
});
@Sime 我不知道,但我认为这是标准的。看这里:api.jquery.com/category/events/event-object
2021-03-13 22:29:27
@Anurag,我刚才遇到了同样的问题。看起来 jQuery 会originalEvent在由 触发事件时填充DOM.click(),但您可以使用$($("#try")[0]).click();,这很笨拙,但有效。
2021-03-19 22:29:27
@Nicola 这在任何地方都有记录吗?
2021-03-25 22:29:27
看起来你也可以使用 event.isTrigger
2021-03-27 22:29:27
@Nicola 我明白了,这是 jQuery 的东西。jQuery 将原始事件对象存储在此属性中。顺便说一句,你的意思是你不知道?您刚刚提供了文档的链接:)
2021-04-07 22:29:27

比上面更直接的是:

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

$('.checkbox').trigger('change'); //doesn't alert
这是最好的答案。有关解释,请参阅:stackoverflow.com/questions/10704168/...
2021-03-20 22:29:27
虽然这是很有诱惑力,可能在实践舒适,注意jQuery的开发者不希望毕业生isTrigger到公共API因为这个时间
2021-04-10 22:29:27

目前大多数浏览器都支持event.isTrusted

if (e.isTrusted) {
  /* The event is trusted: event was generated by a user action */
} else {
  /* The event is not trusted */
}

文档

所述isTrusted只读的属性Event接口是一个Boolean时由用户操作生成的事件,并且虚假 事件创建或修改在由脚本或者经由调度 EventTarget.dispatchEvent()

我认为这样做的唯一方法trigger是根据文档调用中传递一个附加参数

$('.checkbox').change(function(e, isTriggered){
  if (!isTriggered)
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change', [true]); //doesn't alert

示例:http : //jsfiddle.net/wG2KY/

您可以查看事件对象的属性 originalEvent:如果事件不是来自单击,则它是未定义的
2021-03-21 22:29:27
出于某种原因,在使用 Zepto 的“点击”处理程序时, event.originalEvent 对我不起作用(只是一直返回 1)。所以我尝试了上面的解决方案。像魅力一样工作。
2021-03-22 22:29:27

接受的答案对我不起作用。6 年过去了,jQuery 从那时起发生了很大的变化。

例如,event.originalEvent总是true使用 jQuery 1.9.x返回。我的意思是对象总是存在但内容不同。

那些使用较新版本 jQuery 的人可以试试这个。适用于 Chrome、Edge、IE、Opera、FF

if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) {
    //Hey hooman it is you
}