2011-11-19 29 views
1

請注意,我不知道JavaScript。我從幾個小時的閱讀和一個問題到這裏把這些放在一起。我不是程序員,只懂HTML和CSS。Javascript代碼在控制檯中工作,但是當作爲實際的腳本函數加載時未定義

我試圖創建一個間隔,直到某個條件滿足,則停止循環,並按下另一個按鈕點擊頁面上的指定按鈕userscript。感謝這裏的一些幫助,我得到了一大堆代碼,它完全符合我希望在粘貼到Chrome或Firebug控制檯時執行的操作。

但是,如果我安裝此腳本作爲一款Chrome擴展程序或腳本Greasemonkey的,我得到了一個未定義的錯誤。

var int = self.setInterval ("refresh()", 4000); 

function stop() { 
    // Stop the loop before joining server 
    int = window.clearInterval (int) 
} 

function join() { 
    // Click Join Server button 
    document.getElementsByClassName (
     "base-button-arrow-almost-gigantic" 
    )[0].click(); 
} 

function refresh() { 
    // If current players < max, cancel loop and join server 
    var playersElement = document.getElementById ('server-info-players'); 
    var players = playersElement.textContent; 
    var parts = players.split ("/"); 

    var current = parseFloat (parts[0]); 
    var max = parseFloat (parts[1]); 

    if (current < max) { 
     stop() 
     join() 
    } 

    var refreshBtn = document.querySelector (
     "div.serverguide-header-refresh-button div[type='reset'] a" 
    ); 
    var clickEvent = document.createEvent ('MouseEvents'); 
    clickEvent.initEvent ('click', true, true); 
    refreshBtn.dispatchEvent (clickEvent); 
} 

如果這是直接粘貼到它按預期工作控制檯,點擊刷新按鈕,直到滿足條件再按下加入按鈕。安裝爲userscript我來自Chrome和Firebug的得到如下錯誤:

Uncaught ReferenceError: refresh is not defined 
(anonymous function) 

這只是保持在四周秒鐘的時間間隔返回。

有什麼關於用戶腳本,我不知道嗎?我究竟做錯了什麼?

回答

4

注:如果它的縮進和格式化的可讀性

  1. 的人更容易閱讀你的代碼。 ;-)查看我對你的問題所做的修改,並且有大量的tools that help with formatting

  2. 回覆:setInterval("refresh()"...;請不要將setInterval(以及類似的函數)與這樣的引用代碼聯繫起來。它總是很差的形式(不必要地使用eval()),並且由於沙盒而使其平坦化了won't work in Greasemonkey

  3. 同樣地,有時JS之前它被定義將是用於「未定義」 - 特別是在eval的情況。

  4. 不要使用模棱兩可的,常見的,或保留字作爲變量或函數名。 int尤其糟糕,因爲大多數人會將其理解爲「整數」,它幾乎是所有主流語言中的保留字。

  5. 請注意selfwindow對象。這些在Greasemonkey上下文中具有不同的含義/行爲。

  6. 分號並不總是需要在JavaScript中,真實的,但進入始終使用它們的習慣。它將在未來爲您節省您的痛苦,並使代碼稍微易於理解。

無論如何,如果代碼從控制檯的工作,那麼這應該也是從腳本工作:

var refreshInterval; 

function stopRefreshTimer() { 
    // Stop the loop before joining server 
    clearInterval (refreshInterval); 
} 

function joinServer() { 
    // Click Join Server button 
    document.getElementsByClassName (
     "base-button-arrow-almost-gigantic" 
    )[0].click(); 
} 

function refreshUntilJoiningServer() { 
    // If current players < max, cancel loop and join server 
    var playersElement = document.getElementById ('server-info-players'); 
    var players   = playersElement.textContent; 
    var parts   = players.split ("/"); 

    var current   = parseFloat (parts[0]); 
    var max    = parseFloat (parts[1]); 

    if (current < max) { 
     stopRefreshTimer(); 
     joinServer(); 
    } 

    var refreshBtn  = document.querySelector (
     "div.serverguide-header-refresh-button div[type='reset'] a" 
    ); 
    var clickEvent  = document.createEvent ('MouseEvents'); 
    clickEvent.initEvent ('click', true, true); 
    refreshBtn.dispatchEvent (clickEvent); 
} 

refreshInterval   = setInterval (refreshUntilJoiningServer, 4000); 
+0

謝謝!您已經回答了關於此腳本的兩個問題。我一直聽到eval()拋出。我將不得不更多地閱讀。 – HittingSmoke

+0

不客氣,樂意效勞。可能先閱讀[GM陷阱](http://commons.oreilly.com/wiki/index.php/Greasemonkey_Hacks/Getting_Started#Avoid_Common_Pitfalls);它涵蓋了很多相關的隱藏陷阱。 –

0

都在使用setInterval和事件處理程序,簡而言之,即呼叫後發生Greasemonkey沙箱已經消失。

頁面加載 - > Greasemonkey啓動,運行腳本,Greasemonkey消失。 (4秒通過)你的腳本現在發生了。

你需要做的是將範圍和setInterval一起傳遞,所以當這4秒過去時它仍然存在。您可以使用匿名功能輕鬆完成。 (而在同一時間,避免了目前正在做的隱含的eval()...)

粗略地說,這是你的代碼應該結束什麼看起來像:

var notInt = self.setInterval(function() { 

    function stopRefreshTimer() { 
     // Stop the loop before joining server 
     clearInterval(refreshInterval); 
    } 

    function joinServer() { 
     // Click Join Server button 
     document.getElementsByClassName("base-button-arrow-almost-gigantic")[0].click(); 
    } 

    // If current players < max, cancel loop and join server 
    var playersElement = document.getElementById('server-info-players'); 
    var players = playersElement.textContent; 
    var parts = players.split("/"); 

    var current = parseFloat(parts[0]); 
    var max = parseFloat(parts[1]); 

    if (current < max) { 
     stopRefreshTimer(); 
     joinServer(); 
    } 

    var refreshBtn = document.querySelector("div.serverguide-header-refresh-button div[type='reset'] a"); 
    var clickEvent = document.createEvent('MouseEvents'); 
    clickEvent.initEvent('click', true, true); 
    refreshBtn.dispatchEvent(clickEvent); 
}, 4000); 
相關問題