Javascript:检测事件是否由用户触发而不是以编程方式触发

bha*_*a_w 11 javascript dom-events

好吧,这个问题之前已经被问过,但是在jQuery的背景下.在jQuery中,我们可以通过事件Object(link)的originalEvent属性来检查它,它告诉它是手动事件还是编程事件. 在我的情况下,我使用Javascript事件监听器和触发器.在这种情况下,我们可以区分这两种事件(编程和手动)吗?如果不是那么任何变通方法?



我的听众:

   function setUpListeners(){
       _cellViewWrapper.addEventListener('mousedown',mouseDownHandler,false);
       _cellViewWrapper.addEventListener('mouseover',mouseEnter,false);
       _cellViewWrapper.addEventListener('blur',blurHandler,true);
       _cellViewWrapper.addEventListener('focus',focusEventHandler,true);
   }`
Run Code Online (Sandbox Code Playgroud)

触发器使用案例:1.)

if(!IE_FLAG) hidePicker();
           //if browser is internet explorer
           else{
               //if blur is allowed then hide Picker
               if(_ieBlurAllowed) hidePicker();
               //if blur is not allowed -- keep focus on picker input
              //triggering the focus event here
               else blurredElement.focus(); /
         }
Run Code Online (Sandbox Code Playgroud)

2.) if((inputElem !== _focussedInput)) setTimeout(function(){ inputElem.focus(); },10);

还有很多...

小智 13

在最新的浏览器中,Event.isTrusted可用于此特定用例.根据其MDN文件:

Event接口的isTrusted只读属性是一个布尔值,当事件由用户操作生成时为true,当事件由脚本创建或修改或通过dispatchEvent调度时为false.

你可以简单地检查任何事件处理程序:

if (e.isTrusted) {
 /* The event is trusted. */
} else {
 /* The event is not trusted. */
}
Run Code Online (Sandbox Code Playgroud)

浏览器支持:Chrome 46.0,Firefox(最新),Opera 33,Safari和IE(不支持)

  • 这不正确。即使由代码触发也可以信任。 (7认同)

Vij*_*jay 5

[解决方法] Javascript:检查event.screenX&event.screenY是否为非零.

var button = document.getElementsByTagName('button')[0];

button.onclick = function(e) {
  if(e.screenX && e.screenX != 0 && e.screenY && e.screenY != 0){
         alert("real button click");
       }   
}
Run Code Online (Sandbox Code Playgroud)

  • @Vijay 在我尝试过的所有解决方案中,`e.isTrusted` 或 `e.originalEvent` 或 'e.which' 当我们触发像 `$("#button")[0].click( 这样的 DOM 单击时,它们都会失败);` 您的解决方案是唯一适用于所有场景和点击组合的解决方案。但不幸的是它不适用于键盘点击。但无论如何,+1 是一个干净简单的解决方案。 (3认同)

Kus*_*hal 4

我知道如何在 jQuery 中做到这一点

您可以通过检查来使用事件对象e.isTrigger

小提琴

$(".lol").click(function(e){
    console.log(e)
    alert("Is triggered: " + (e.isTrigger ? true:  false))
})

$(".trigger-lol").click(function(e){
    $(".lol").trigger("click")
})
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="lol">lol</div>
<div class="trigger-lol">Trigger lol</div>
Run Code Online (Sandbox Code Playgroud)