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

IT技术 javascript jquery firefox greasemonkey tampermonkey
2021-01-26 23:40:35

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

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

3个回答

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

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

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

可能的解决方案是:

  1. 添加@grant GM_log或类似沙盒脚本
  2. 通过添加以下块,在脚本中别名现有的 jQuery 对象:

    var my_jquery = jQuery;

    jQuery.noConflict(true);

    var $ = my_jquery, jQuery = my_jquery;

  3. 不要使用 jQuery

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

有同样的问题。

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

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

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

添加@grant GM_log固定它们。