簡體   English   中英

使用Greasemonkey 2.0綁定到Firefox 30中的unsafeWindow事件

[英]Binding to an event of the unsafeWindow in Firefox 30 with Greasemonkey 2.0

由於Mozilla改進了 Firefox 30中的unsafeWindow API ,我正在維護Greasemonkey腳本並遇到一些麻煩。

我的腳本運行的頁面,觸發事件“MyEvent”,我的腳本對該事件感興趣。

該事件是使用jQuery 1.6.4觸發的

之前,我使用此代碼掛鈎此事件:

var jQuery = unsafeWindow.jQuery;
jQuery(unsafeWindow.document)
    .bind("MyEvent", function() {
        console.log("MyEvent Triggered!");
    });

但由於Mozilla的改變,這將不再適用。

我試圖在無沖突模式下插入我自己的jQuery,但我不認為這可以訪問由其他jQuery實例觸發的事件?

我有什么想法可以參與這個活動嗎?

快速而骯臟的方法, 如果你不需要任何GM_函數而你不需要@require自己的jQuery ,那就是使用@grant none模式。 這有效:

// ==UserScript==
// @name     _unsafeWindow tests
// @include  http://jsbin.com/xaman/*
// @grant    none
// ==/UserScript==

var jQuery = window.jQuery;
jQuery(document).bind ("MyEvent", function () {
    console.log ("From GM script: MyEvent caught!");
} );

如果確實需要GM_函數,有時可以使用新的exportFunction()
不幸的是,jQuery和jQuery事件處理是一個特例。 根據您的嘗試,您將收到如下錯誤消息:

訪問屬性'handler'的權限被拒絕
要么
CloneNonReflectorsWrite錯誤

我只是發現沒有辦法使用任何新的unsafeWindow功能。 你唯一的辦法是注入代碼。 像這樣:

// ==UserScript==
// @name     _unsafeWindow tests
// @include  http://jsbin.com/xaman/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/
function myEventHandler (zEvent) {
    console.log (
        'From GM script: "' + zEvent.type + '" triggered on ', zEvent.target
    );
}

function bindMyEvent () {
    //-- Gets "jQuery is not defined" if GM script does not also use jQuery.
    jQuery(document).bind ("MyEvent", myEventHandler);
    console.log ("The jQuery version being used is: ", jQuery.fn.jquery);
}

//-- Create A COPY OF myEventHandler in the target page scope:
addJS_Node (myEventHandler);
//-- Create A COPY OF bindMyEvent in the target page scope and immediately run it.
addJS_Node (null, null, bindMyEvent);

function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    if (runOnLoad) {
        scriptNode.addEventListener ("load", runOnLoad, false);
    }
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

您可以針對此jsBin頁面測試這兩個腳本。


如果需要在注入的事件處理程序中運行/調用GM_函數,請使用“ 如何從必須在目標頁面范圍內運行的代碼調用Greasemonkey的GM_函數? ”中顯示的技術。

只是不要在unsafeWindow上綁定事件處理程序,而是使用常規window對象:

window.document.addEventListener("MyEvent", function() {
  console.log("MyEvent Triggered!");
}, false, true);

請注意addEventListener的第四個參數( wantsUntrusted ) - 這個參數允許您的事件處理程序接收不受信任的事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM