1

我正在创建一个用户脚本,在 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 中无效?

4

1 回答 1

1

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

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

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

要绕过此限制,请将每个语句放入您的main函数中。

于 2012-06-24T17:10:18.213 回答