检查事件是否由人触发

我有一个处理程序附加到一个事件,我希望它只能执行,如果它是由人触发,而不是由触发()方法。 我如何分辨?

例如,

$('.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(); }); 

比上面更直接的是:

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

我认为这样做的唯一方法是按照文档在trigger调用中传递一个额外的参数。

 $('.checkbox').change(function(e, isTriggered){ if (!isTriggered) { alert ('human'); } }); $('.checkbox').trigger('change', [true]); //doesn't alert 

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

你可以使用onmousedown来检测鼠标点击与触发()调用。

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

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

接受的答案没有为我工作。 已经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()

使用全局variables对我来说是一个正确的方法。

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