在Greasemonkey脚本中使用jQuery - 在Firefox中没有触发click事件?

时间:2015-01-25 13:20:35

标签: javascript jquery firefox greasemonkey

在具有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,但我希望保持一致的程度,并且让我感到烦恼,我无法理解这个问题。我错过了什么?

2 个答案:

答案 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准备好之后,默认情况下运行。