jQuery 在 Greasemonkey 脚本中 – Firefox 中没有触发点击事件?
jQuery in a Greasemonkey script – click event is not firing in Firefox?
在具有 jQuery 1.6.3 的页面上使用 Greasemonkey 脚本,我试图让 link 对鼠标点击做出反应。
以下是有趣的部分:
// ==UserScript==
// […]
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant unsafeWindow
// ==/UserScript==
if (typeof $ == 'undefined') {
var $ = unsafeWindow.jQuery;
if (typeof $ == 'undefined') {
console.log('jQuery could not be loaded, script will not work.');
}
}
[…]
document.addEventListener("DOMContentLoaded", function(event) {
console.log('DOM content loaded.');
if (settings.firstRun) {
console.log('Creating welcome window.');
var hi = $('<div>This is a welcome message. Click the OK link to hide it forever. </div>');
var ok = $('<a href="javascript:void(0)" id="okay">OK</a>');
hi.append(ok);
// el is from earlier
el.append(hi);
console.log('Binding click event.');
ok.click(function(event) { // DOES NOT WORK
event.preventDefault();
alert('you clicked OK');
});
console.log('Bound.');
}
[…]
});
我的代码在 Tampermonkey/Chrome 中工作正常(即使在绑定事件之前我没有将元素插入 DOM),但在 Greasemonkey/Firefox.
现在我知道脚本正在被注入并且 jQuery 已加载,因为一直显示 'Binding click event.' 的控制台消息并且元素已正确插入 [=31] =].但是随后脚本在单击绑定时出现问题并停止执行,甚至没有出现错误消息。
当我使用纯 JS 时有效:
document.getElementById('okay').onclick = function(){ alert('you clicked OK'); };
它也适用于 Firebug 控制台 – 运行 这个命令产生正确的结果:
$('#okay').click(function(){ alert('you clicked OK'); });
我可以只使用纯 JS,但我想保持一定程度的一致性,而且我无法理解这个问题也让我很恼火。我错过了什么?
由于 Firefox 上的沙箱,这段代码似乎无法工作。如果没有 some interface. To override this problem, a better way to use jQuery is using @require
instead.
,您的函数无法传递给 unsafeWindow
如果您查看 Firefox 的浏览器控制台 (ControlShift J),您应该会看到如下错误:
Error: Permission denied to access property 'handler' jquery.min.js:2
这是因为 you can no longer access a page's jQuery that way(完整,没有 "time-bomb" 错误)。
通常,最好 @require
jQuery 用于您的用户脚本,这样可以避免各种偷偷摸摸的冲突问题——尤其是当您还可以使用 @grant
而不是 none
.
旁注:
使用 document.addEventListener("DOMContentLoaded" ...
.
没有意义
除非您已设置 @run-at document-start
,否则脚本将在该点运行,并且在 jQuery 准备就绪后,默认情况下。
在具有 jQuery 1.6.3 的页面上使用 Greasemonkey 脚本,我试图让 link 对鼠标点击做出反应。
以下是有趣的部分:
// ==UserScript==
// […]
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant unsafeWindow
// ==/UserScript==
if (typeof $ == 'undefined') {
var $ = unsafeWindow.jQuery;
if (typeof $ == 'undefined') {
console.log('jQuery could not be loaded, script will not work.');
}
}
[…]
document.addEventListener("DOMContentLoaded", function(event) {
console.log('DOM content loaded.');
if (settings.firstRun) {
console.log('Creating welcome window.');
var hi = $('<div>This is a welcome message. Click the OK link to hide it forever. </div>');
var ok = $('<a href="javascript:void(0)" id="okay">OK</a>');
hi.append(ok);
// el is from earlier
el.append(hi);
console.log('Binding click event.');
ok.click(function(event) { // DOES NOT WORK
event.preventDefault();
alert('you clicked OK');
});
console.log('Bound.');
}
[…]
});
我的代码在 Tampermonkey/Chrome 中工作正常(即使在绑定事件之前我没有将元素插入 DOM),但在 Greasemonkey/Firefox.
现在我知道脚本正在被注入并且 jQuery 已加载,因为一直显示 'Binding click event.' 的控制台消息并且元素已正确插入 [=31] =].但是随后脚本在单击绑定时出现问题并停止执行,甚至没有出现错误消息。
当我使用纯 JS 时有效:
document.getElementById('okay').onclick = function(){ alert('you clicked OK'); };
它也适用于 Firebug 控制台 – 运行 这个命令产生正确的结果:
$('#okay').click(function(){ alert('you clicked OK'); });
我可以只使用纯 JS,但我想保持一定程度的一致性,而且我无法理解这个问题也让我很恼火。我错过了什么?
由于 Firefox 上的沙箱,这段代码似乎无法工作。如果没有 some interface. To override this problem, a better way to use jQuery is using @require
instead.
如果您查看 Firefox 的浏览器控制台 (ControlShift J),您应该会看到如下错误:
Error: Permission denied to access property 'handler' jquery.min.js:2
这是因为 you can no longer access a page's jQuery that way(完整,没有 "time-bomb" 错误)。
通常,最好 @require
jQuery 用于您的用户脚本,这样可以避免各种偷偷摸摸的冲突问题——尤其是当您还可以使用 @grant
而不是 none
.
旁注:
使用 document.addEventListener("DOMContentLoaded" ...
.
没有意义
除非您已设置 @run-at document-start
,否则脚本将在该点运行,并且在 jQuery 准备就绪后,默认情况下。