我正在创建一个用户脚本,在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中无效?
答案 0 :(得分:1)
整个问题来自jQuery的加载方式。
我们在页面中插入<script>
标记,并添加一个侦听器以在加载脚本时运行某些内容。要运行的代码是main.toString()
,实际上是main
的每个语句,而不是实际的函数。
Firefox和Chrome中的用户脚本是沙盒,页面上下文和脚本上下文完全不同。因此,当执行main.toString()
语句时,您不再处于用户脚本范围内,而是在当前页面范围内。这是因为插入的<script>
在其上下文中执行代码:当前页面。此处未定义PunishCalc
,因为它在userscript范围中定义。
要绕过此限制,请将每个语句都放在main
函数中。