2013-09-05 38 views
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/

回答

1

所有點擊用戶生成的行動將有一個祕密的屬性,指示事件是否是由用戶或沒有創建。它對開發人員來說是不可見的,但是對於底層的JavaScript引擎來說是不可見的。

爲防止惡意代碼在用戶的瀏覽器上運行,例如偶然訪問惡意網站時,有必要進行此操作。

一個常見的例子是,您無法通過簡單地觸發input[type=file]上的點擊事件來打開文件瀏覽器對話框。用戶創建了一個真正的點擊事件來打開文件瀏覽器。

另一件事是所有的事件監聽器必須是同步的才能觸發安全敏感的函數,就像上面的例子一樣。

總之,假事件不能調用安全敏感的瀏覽器API。

相關問題