确定函数是否由于本机浏览器事件而被调用

时间:2013-04-26 12:29:22

标签: javascript events

有没有办法确定某个函数是否因本机浏览器事件而被调用?

在现代浏览器中,如果从一个源自点击处理程序的作用域链中调用函数window.open(...),页面将打开没有问题。

但是,如果您尝试直接调用它,浏览器将生成弹出警告。

因此浏览器会跟踪执行上下文并以某种方式标记它,以便首次使用该函数成功。如果没有此标志,则会阻止第二次使用。

如果直接调用某些函数而不是真正的本机浏览器事件,是否有任何方法可以访问此标志以在内部阻止执行某些函数。

我查看了我的函数收到的事件对象,但是我无法发现真正的本机事件和手动触发事件所生成的事件之间的任何不同。

我想要的实际可能吗?

1 个答案:

答案 0 :(得分:7)

DOM Level 3 Events规范在事件对象上引入了isTrusted property。当作为用户操作的结果生成事件时,此属性设置为true,而当创建事件时,此属性设置为false,例如通过createEvent

  

用户代理生成的事件,无论是作为用户交互的结果,还是作为DOM更改的直接结果,都受到用户代理的信任,具有不通过脚本通过脚本生成的事件提供的特权。 DocumentEvent.createEvent("Event")方法,使用Event.initEvent()方法修改,或通过EventTarget.dispatchEvent()方法调度。

目前,似乎只有IE9 +和Firefox支持这个属性。这是一个working example(显然你必须在其中一个支持的浏览器中运行它):

var elem = document.getElementById("example");
elem.addEventListener("click", function (e) {
    alert(e.isTrusted);
}, false);

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
elem.dispatchEvent(evt);

当模拟事件立即被触发时,这将提醒false,并且只要您实际点击该元素,就会true