2

可能重复:
Greasemonkey 1.0 中的 jQuery 与使用 jQuery 的网站冲突

看来,如果我的任何greasemonkey 脚本具有如下行,我会在包含jquery 的网站上收到错误。我不知道为什么,但我确实注意到一些 javascript 事件完全没有触发。(例如,我无法添加评论)。

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

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

2 回答 2

4

Greasemonkey 1.0 从根本上改变了沙盒的工作方式,破坏了数千个脚本。另请参阅,Greasemonkey 1.0 中的 jQuery 与使用 jQuery 的网站冲突

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

要解决此问题,请将沙箱恢复到您的脚本,并通过编辑元数据块以以下行结束来$解决冲突:

// @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还没有发布破坏其大部分安装基础的更新。

于 2012-10-19T22:45:29.523 回答
2

仅当尚未包含 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();

唯一的问题是如果谷歌的 jquery 没有启动。

于 2012-10-19T22:30:17.483 回答