Greasemonkey 1.0中的jQuery与使用jQuery的网站冲突

时间:2012-08-27 17:15:45

标签: javascript jquery firefox greasemonkey tampermonkey

自从几天前发布了新的Greasemonkey 1.0以来,每个拥有jQuery的网站以及我在Greasemonkey脚本中使用jQuery的网站都没有正确运行我的脚本。我在我的GS脚本中使用的jQuery(使用@require元数据)与页面的jQuery冲突。这是由于新的@grant代码。

我已经阅读了文档,但仍然不知道如何再次在沙箱中运行GS脚本;唯一的选择似乎是授予对GS API的访问权限或将其授予无API并在没有任何安全限制的情况下运行脚本,当我设计了几十个GS脚本来运行时,这对我来说根本不起作用有安全限制,喜欢这样。

3 个答案:

答案 0 :(得分:12)

Greasemonkey 1.0, radically changed the way the sandbox works,破坏了数千个脚本。这是一个很大的问题,我希望你能和我一起在the principle bug report for this issue上表达你的观点/经验。

The Greasemonkey blog claims that you can workaround the issue with the following

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

......我不确定在所有情况下都会有效。从避免副作用的DRY-principle原子编码哲学来看,这是完全错误的方法。在我的意见中,最好的策略是恢复沙箱。

通过指定@grant值(none除外)重新激活沙箱。修改 Metadata Block以结束以下行

// @grant       GM_addStyle
// @grant       GM.getValue
// ==/UserScript==
/*- The @grant directive is needed to work around a design flaws introduced in GM 1.0
    and again in GM 4.0.
    It restores the sandbox.
*/

沙箱将被恢复,所有冲突都将得到解决 这些脚本将与Tampermonkey和Violentmonkey等高级引擎兼容。

答案 1 :(得分:7)

两年过去了,这个“特征”仍然没有得到充分记录或解决。

需要jQuery的脚本仍然与使用jQuery的一些页面冲突。

潜在的解决方案是:

  1. @grant GM_log或类似内容添加到沙箱脚本
  2. 通过添加此块来对脚本中的现有jQuery对象进行别名:

    var my_jquery = jQuery;

    jQuery.noConflict(true);

    var $ = my_jquery, jQuery = my_jquery;

  3. 不要使用jQuery

  4. 总而言之,Greasemonkey做出了一个糟糕的决定。

答案 2 :(得分:4)

有同样的问题。

自GM版本1.0以来,我在{jin} jQuery运行在同样使用jQuery的网站上的所有脚本都停止了工作。

我知道,我可以尝试@require之类的东西,但这不是重点。

这里的重点是他们曾经工作,现在他们不会。

添加$ = unsafeWindow.$修复它们。