gpt4 book ai didi

javascript - 使用 Greasemonkey 2.0 绑定(bind)到 Firefox 30 中的 unsafeWindow 事件

转载 作者:行者123 更新时间:2023-11-29 10:14:44 25 4
gpt4 key购买 nike

我正在维护一个 Greasemonkey 脚本,由于 Mozilla's change to the unsafeWindow API 遇到了一些麻烦在 Firefox 30 中。

运行我的脚本的页面触发事件“MyEvent”,我的脚本对该事件感兴趣。

事件是使用 jQuery 1.6.4 触发的

之前,我使用这段代码来 Hook 这个事件:

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_函数,你有时可以使用the new exportFunction() .
不幸的是,jQuery 和 jQuery 事件处理是一个特例。根据您的尝试,您将收到如下错误消息:

Permission denied to access property 'handler'
or
CloneNonReflectorsWrite error

我只是发现无法使用任何新的 unsafeWindow 功能来执行此操作。您唯一的办法是注入(inject)代码。像这样:

// ==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);
}

您可以针对 this jsBin page 测试这两个脚本.


如果您需要从注入(inject)的事件处理程序中运行/调用 GM_ 函数,请使用“How to call Greasemonkey's GM_ functions from code that must run in the target page scope?”中所示的技术。

关于javascript - 使用 Greasemonkey 2.0 绑定(bind)到 Firefox 30 中的 unsafeWindow 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24802606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com