0

我正在使用 Chrome 上的 webkit 通知。该方法window.webkitNotifications.requestPermission只能从用户操作(单击等)中调用。在其他任何地方调用它都不会产生任何影响,也不会抛出任何错误。

由于某些原因,我需要稍后在另一个事件上运行它,该事件最初是由真正的点击生成的。

我尝试通过生成这样的点击来运行此方法:

var a = document.createElement('a');
a.addEventListener('click', function () {
  window.webkitNotifications.requestPermission()
});
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 1, 0, 0, 0, 0,
false, false, false, false, 0, null);
a.dispatchEvent(evt);

但正如预期的那样,该方法没有效果。这让我想知道 Chrome 是如何真正检测用户操作的?生成的事件和由真实用户操作生成的事件有什么区别?

我还尝试保留对原始点击事件的引用,并在需要调用此方法时将其传回,但它不起作用。

我创建了一个小提琴来说明我的问题:http: //jsfiddle.net/arnaudbreton/B38yJ/1/

4

1 回答 1

1

用户生成的所有点击操作都将具有一个秘密属性,该属性指示事件是否由用户创建。它对开发人员不可见,但对于底层的 javascript 引擎来说是可见的。

有必要防止恶意代码在用户的浏览器上运行,例如当您意外访问恶意网站时。

一个常见的例子是您不能通过简单地触发点击事件来打开文件浏览器对话框input[type=file]。用户创建了一个真正的点击事件来打开文件浏览器。

另一件事是,所有事件侦听器必须是同步的才能触发安全敏感功能,例如上面的示例。

总之,假事件不能调用对安全敏感的浏览器 API。

于 2013-09-05T15:04:37.957 回答