【问题标题】:Userscript works in Opera but Firefox and Chrome give "variable not defined" error?Userscript 在 Opera 中工作,但 Firefox 和 Chrome 给出“变量未定义”错误?
【发布时间】:2012-06-24 16:58:57
【问题描述】:

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

【问题讨论】:

  • 你有完整脚本的链接吗?你能在fiddle 中重现问题吗?

标签: javascript variables cross-browser userscripts


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,自从我开始使用这个脚本以来已经有一段时间了,所以我完全忘记了:S
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2013-04-30
  • 2012-03-04
  • 2015-10-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多