Hay*_*yun 14 javascript events
有没有办法确定是否由于本机浏览器事件而调用给定的函数?
在现代浏览器中,如果window.open(...)从源自单击处理程序的作用域链中调用该函数,则页面将打开而没有问题.
但是,如果您尝试直接调用它,浏览器将生成弹出警告.
因此浏览器会跟踪执行上下文并以某种方式标记它,以便首次使用该函数成功.如果没有此标志,则会阻止第二次使用.
是否有任何方法可以访问此标志以在内部阻止某些函数执行,如果它们是直接调用而不是从真正的本机浏览器事件调用.
我查看了我的函数接收的事件对象,但是我无法发现真正的本机事件和手动触发事件所生成的事件之间的任何不同.
我真正想要的是什么?
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);
Run Code Online (Sandbox Code Playgroud)
false当模拟事件立即被触发时,以及true实际单击元素时,这将发出警报.