检查事件是否由人类触发

时间:2011-07-14 10:50:43

标签: jquery

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

例如,

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

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

8 个答案:

答案 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)

我认为执行此操作的唯一方法是根据documentationtrigger来电中传递额外参数。

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

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

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

答案 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()。 祝你好运或查看其他答案