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的一些页面发生冲突。
潜在的解决方案是:
- 添加
@grant GM_log
或类似于沙盒的脚本 -
通过添加此块来别名脚本中现有的jQuery对象:
var my_jquery = jQuery;
jQuery.noConflict(true);
var $ = my_jquery, jQuery = my_jquery;
-
不要使用jQuery
总之,来自Greasemonkey的一个可怕的决定。
有同样的问题。
由于GM版本1.0,所有我@require
jQuery的脚本,运行在也使用jQuery的网站上,停止工作。
我知道,我可以尝试像$ = unsafeWindow.$
,但这不是重点。
这里的重点是,他们曾经工作,现在他们不会。
添加@grant GM_log
修正了它们。