Greasemonkey Jquery干扰?

时间:2012-10-19 22:15:47

标签: javascript jquery greasemonkey

  

可能重复:
  jQuery in Greasemonkey 1.0 conflicts with websites using jQuery

如果我的任何一个greasemonkey脚本都有如下所示的行,那么我在包含jquery的网站上会出现错误。我不确定为什么,但我确实注意到一些javascript事件完全没有解雇。 (例如关于SO我无法添加评论)。

我可以在脚本中排除SO,但有更好的解决方案吗?如果jquery存在,也许我应该在测试后动态添加jquery。如何解决此问题以及如何在不使用jquery的情况下将jquery脚本标记添加到正文中?

// @require         http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js

2 个答案:

答案 0 :(得分:4)

Greasemonkey 1.0, radically changed the way the sandbox works,破坏了数千个脚本。另请参阅jQuery in Greasemonkey 1.0 conflicts with websites using jQuery

这是一个很大的问题,Greasemonkey的首席开发人员表示完全不愿以合理的方式解决它。

要解决此问题,请将沙箱恢复到您的脚本,并通过修改Metadata Block以结束以下行来解决$冲突:

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


指定@grant值(none除外)会重新激活沙箱。


您可能还会考虑切换到Scriptish,它在过去提供了卓越的功能和性能,并且不会受到这种新的沙箱行为的影响。

到目前为止,

Scriptish 还没有发布破坏其大部分安装基础的更新。

答案 1 :(得分:2)

只有在尚未包含jQuery时才需要包含jQuery。所以你需要进行第一行检查。如果包含它,则运行脚本(如果未包含)添加类似行以包含它然后循环检查功能。像这样:

var wrote = false,
    runScript = function(){
    if(typeof(jQuery) === 'undefined'){
        if(!wrote){
            wrote = true;
            document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>');
        }
        setTimeout(runScript, 50);
    }else{
        //your script goes here
    }
};

runScript();

唯一的问题是,如果google的jquery没有启动。