21

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

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

4

3 回答 3

15

Greasemonkey 1.0 从根本上改变了沙盒的工作方式,破坏了数千个脚本。这是一个巨大的问题,我希望你能和我一起就这个问题的主要错误报告发表你的意见/经验。

Greasemonkey 博客声称您可以使用以下方法解决此问题

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

...我不确定这是否适用于所有情况。从避免副作用、DRY 原则、原子编码的哲学来看,这是完全错误的方法。在我看来,最好的策略是恢复沙盒。

@grant通过指定一个值(不是none)来重新激活沙箱。编辑您的元数据块以以下行结尾

// @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 等高级引擎兼容。

于 2012-09-04T00:34:20.517 回答
7

两年过去了,这个“功能”仍然没有被充分记录或解决。

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

潜在的解决方案是:

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

    var my_jquery = jQuery;

    jQuery.noConflict(true);

    var $ = my_jquery, jQuery = my_jquery;

  3. 不要使用 jQuery

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

于 2015-05-28T14:44:15.950 回答
5

有同样的问题。

@require从 GM 版本 1.0 开始,我在使用 jQuery 的网站上运行的所有 jQuery 脚本都停止了工作。

我知道,我可以尝试类似的东西$ = unsafeWindow.$,但这不是重点。

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

添加@grant GM_log修复它们。

于 2012-09-21T12:23:09.403 回答