在具有jQuery 1.6.3的页面上使用Greasemonkey脚本,我试图获得一个链接以响应鼠标点击。
以下是有趣的部分:
// ==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,因为控制台消息直到'绑定点击事件'。正在显示,元素正在DOM中正确插入。但随后脚本在点击绑定时出现问题,并且在没有错误消息的情况下停止执行。
当我使用普通的JS时它可以工作:
document.getElementById('okay').onclick = function(){ alert('you clicked OK'); };
它也适用于Firebug控制台 - 运行此命令会产生正确的结果:
$('#okay').click(function(){ alert('you clicked OK'); });
我可以使用普通的JS,但我希望保持一致的程度,并且让我感到烦恼,我无法理解这个问题。我错过了什么?
答案 0 :(得分:1)
由于Firefox上的沙箱,此代码似乎无法正常工作。没有some interface,您的函数无法传递给unsafeWindow。要覆盖此问题,使用jQuery的更好方法是using @require
instead。
答案 1 :(得分:1)
如果您查看Firefox的浏览器控制台( Control Shift J ),您应该看到类似的错误:
错误:访问属性'handler'的权限被拒绝jquery.min.js:2
这是因为you can no longer access a page's jQuery that way(完全没有“定时炸弹”错误)。
作为一项规则,最好为您的用户脚本 @require
jQuery ,并避免各种偷偷摸摸的冲突问题 - 尤其是当您还使用@grant
其他时比none
。
旁注:
使用document.addEventListener("DOMContentLoaded" ...
毫无意义
除非您已设置@run-at document-start
,否则脚本将在此时运行,并且在jQuery准备好之后,默认情况下运行。