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

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

评论

我将在@grant指令中输入什么?那不是仅适用于Greasemonkey API吗?如何使@require 在沙盒中工作?

只需使用@grant GM_getValue,就可以解决问题。即使您实际上没有调用GM_getValue(),@ grant指令也具有恢复沙箱的副作用。因此@require应该恢复到应有的状态。

是的,我认为这是一个选择。只是一种解决方法,但至少是一种选择。我现在仍然坚持使用0.9,因为我有太多需要更改的脚本,我宁愿保持不变,直到GS解决此问题。

好吧,现在我收到了脚本的多个用户的支持请求。请向GM开发人员提交错误报告和/或对此错误发表评论。

GS 1.0于8月24日左右发布。从8月27日左右开始,他们就被GS 1.0问题所困扰。看起来终于可以解决了。看起来他们还在GS博客上发布了有关此内容的信息。

#1 楼

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

#2 楼

两年过去了,这个“功能”还没有得到足够的文档记录或解决。

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

可能的解决方案是:


添加@grant GM_log或类似于沙箱的脚本

通过添加以下内容来别名脚本中现有的jQuery对象块:

var my_jquery = jQuery;

jQuery.noConflict(true);

var $ = my_jquery, jQuery = my_jquery;

不要使用jQuery

总而言之,Greasemonkey做出了一个可怕的决定。

#3 楼

遇到了同样的问题。

自GM 1.0版以来,我在qq1202079q jQuery上运行的所有脚本(也使用jQuery的站点)都停止运行。

我知道,我可以尝试一些方法像@require一样,但这不是重点。

这里的要点是它们曾经工作过,现在却不再工作了。

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