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

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

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

Greasemonkey 1.0从根本上改变了沙箱的工作方式 ,破坏了数千个脚本。 这是一个很大的问题,我希望你们能够和我一起就这个问题的原则性报告发表你的意见/经验。

Greasemonkey博客声称,您可以通过以下方法解决该问题 :

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

…我不确定哪种情况下都能正常工作。 但是我不会去测试它,因为从避免副作用的DRY原则原子编码哲学来说,这是一个确切的错误方法。 在我看来 ,最好的策略是恢复沙箱,这是迄今为止我已经成功完成的104个脚本。

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

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

沙盒将被恢复,所有的冲突将被解决。


您也可以考虑转换为过去提供了卓越功能和性能的Scriptish ,而不会受到这种新的沙箱行为的影响。

两年过去了,这个“特征”还没有被充分记录或处理。

需要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修正了它们。