2012-06-24 42 views
1

我創建一個userscript和歌劇它就像一個魅力,但在火狐和Chrome它提供了以下錯誤:UsersScript在Opera中工作,但Firefox和Chrome給出「變量未定義」錯誤?

Error: PunishCalc is not defined

我有變量(因此用戶可以配置腳本中的多個項目)在這樣的腳本的頂部:

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?

+2

你有鏈接到完整的腳本?你可以在[小提琴](http://jsfiddle.net)中重現問題嗎? –

回答

1

整個問題來自如何加載jQuery。

我們在頁面中插入一個<script>標籤,並添加一個偵聽器來在加載腳本時運行某些東西。要運行的代碼是main.toString(),這實際上是main的每個語句,但不是實際的函數。

Firefox和Chrome中的用戶頁面被沙箱化,頁面上下文和腳本上下文完全不同。因此,當執行main.toString()語句時,您不再處於您的腳本範圍內,而是處於當前頁面範圍內。這是因爲插入的<script>在其上下文中執行代碼:當前頁面。這裏沒有定義PunishCalc,因爲它是在userscript作用域中定義的。

要繞過此限制,請將您的main函數中的所有語句放入。

+0

謝謝,自從我開始使用這個腳本以來,我已經有一段時間了,所以我完全忘記了這個:S –

相關問題