5

我正在@require为我的 Greasemonkey 脚本使用 jQuery,并在我的脚本文件中使用这一行:

// @require https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js

而且效果很好;我可以$('#id')用来访问 DOM。

但是,$“真实”页面的变量被修改($jQuery 1.2.xx 在哪里):我收到一个$.include未定义的错误。

我认为 Greasemonkey 的沙盒模型会防止目标页面的变量被覆盖?

如何确保包含 javascript 库不会影响“真实”网站,而只会影响我的 Greasemonkey 脚本?

4

2 回答 2

10

Greasemonkey 1.0 从根本上改变了沙盒的工作方式,破坏了数千个脚本。另请参阅,Greasemonkey 1.0 中的 jQuery 与使用 jQuery 的网站冲突

这是一个巨大的问题,我希望你能和我一起就这个问题的主要错误报告发表你的意见/经验。

同时,将沙箱恢复到您的脚本,并$通过编辑元数据块以以下行结束来解决冲突:

// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a major design change introduced in GM 1.0,
    It restores the sandbox.
*/


指定一个@grant值(不是none)会重新激活沙箱。


您还可以考虑切换到Scriptish,它在过去提供了卓越的功能和性能,并且不会受到这种新沙盒行为的影响。

于 2012-09-03T23:49:05.593 回答
3

jQuery.noConflict();; 它解释了很多。

编辑:在搜索中
找到“Greasemonkey 1.0 + jQuery: Broken, with Workaround”

可能的解决方案:

 this.$ = this.jQuery = jQuery.noConflict(true);

这样做,可能会隐式指定 $, jQuery 将在您的脚本的命名空间中可用。

于 2012-09-03T16:03:12.473 回答