14

有没有办法确定给定的函数是否由于本机浏览器事件而被调用?

在现代浏览器中,如果您window.open(...)从源自单击处理程序的作用域链调用该函数,则页面将毫无问题地打开。

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

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

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

我查看了我的函数接收到的事件对象,但我无法发现真正的本机事件与手动触发事件生成的事件之间有什么不同。

我想要的真的可能吗?

4

1 回答 1

7

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

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

目前,似乎只有 IE9+ 和 Firefox 支持这个属性。这是一个工作示例(显然您必须在支持的浏览器之一中运行它):

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在您实际单击元素时发出警报。

于 2013-04-26T12:41:53.480 回答