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 准备就绪后,默认情况下。