用户脚本适用于Opera,但Firefox和Chrome会出现“未定义变量”错误?

时间:2012-06-24 16:58:57

标签: javascript variables cross-browser userscripts

我正在创建一个用户脚本,在Opera中它就像一个魅力,但在Fire Fox和Chrome中它会出现以下错误:

  

错误:未定义PunishCalc

我在脚本顶部有变量(因此用户可以在脚本中配置多个项目),如下所示:

var LoginFormat     = true;
var PunishCalc      = true;
var WorldList       = true;
var aWerelden       = Array();
var TitleTickets    = true;
var OverviewLink    = true;
var CookieMarker    = true;

如您所见,PunishCalc实际上是在那里定义的。

这是脚本中最重要的部分:它在页面上实现了jQuery。

function addJQuery(callback) 
{
    var script = document.createElement("script");
    script.setAttribute("src", "http://code.jquery.com/jquery-1.7.2.min.js");
    script.addEventListener("load", function() 
    {
        var script = document.createElement("script");
        script.textContent = "(" + callback.toString() + ")();";
        document.body.appendChild(script);
    }, false);
    document.body.appendChild(script);
}

function main()
{
    // All the code will be in here
}

addJQuery(main);

这导致我使用变量的代码:

else if(document.location.href.indexOf("village.php?mode=list") > -1 && PunishCalc === true)
{
    // Code here
}

正如您所看到的,它只是检查变量是否为真。这就是它所要做的一切。有没有人知道为什么它在Opera中有效但在Chrome或Firefox中无效?

1 个答案:

答案 0 :(得分:1)

整个问题来自jQuery的加载方式。

我们在页面中插入<script>标记,并添加一个侦听器以在加载脚本时运行某些内容。要运行的代码是main.toString(),实际上是main的每个语句,而不是实际的函数。

Firefox和Chrome中的用户脚本是沙盒,页面上下文和脚本上下文完全不同。因此,当执行main.toString()语句时,您不再处于用户脚本范围内,而是在当前页面范围内。这是因为插入的<script>在其上下文中执行代码:当前页面。此处未定义PunishCalc,因为它在userscript范围中定义。

要绕过此限制,请将每个语句都放在main函数中。