2011-11-05 102 views
1

我試圖在Javascript中創建一個小型自動化腳本,我想使用Opera的用戶腳本功能來定義外部腳本運行。我之前使用過這個功能來運行我用外部網站編寫的腳本,效果很好。頁面加載後運行Javascript函數

我需要等到頁面加載腳本運行,但我似乎無法得到這個工作。代碼目前是:

if (addEventListener in document) { // use W3C standard method 
    document.addEventListener('load', meerfirst(), false); 
} else { // fall back to traditional method 
    document.onload = meerfirst(); 
} 

function meerfirst(){ 
    nameForm = document.forms['aspnetForm']; 
    nameForm.elements('ctl00$CPH1$NewQuoteView$TitlesView$DropDownListTitles').value = 'MR:TRUE:MR'; 
    nameForm.elements('ctl00$CPH1$NewQuoteView$TextBoxFirstName').value = 'James'; 
} 

這是我自己的函數,加上通過另一個問題在這裏找到的if語句。我也試過window.onload,但它仍然沒有工作。

奇怪的是,Opera似乎並沒有真正執行腳本,就好像我在if語句中設置了一個斷點,它從來沒有真正打斷它。該網站是否具有內置的反使用者腳本功能?還是有可能我做錯了,以阻止這個執行?

+0

這是立即調用meerfirst,而不是負載。看到這裏:http://jsfiddle.net/ThinkingStiff/6ajFz/。刪除parens,如下面提到的@missingo。它似乎並沒有叫meerfirst,因爲nameForm在加載頁面之前首次調用它時返回undefined。 – ThinkingStiff

回答

3

此代碼有幾個問題:

if (addEventListener in document) { // use W3C standard method 
    document.addEventListener('load', meerfirst(), false); 
} else { // fall back to traditional method 
    document.onload = meerfirst(); 
} 
  1. 你需要把引號的addEventListener if語句。你在document尋找屬性名稱,所以名字必須是一個字符串if('addEventListener' in document)

  2. 你想通過名字來引用該函數在聲明的addEventListener,沒有立即調用它。您應該刪除括號 - 只使用meerfirst而不是meerfirst()

  3. 分配給document.onload不起作用。請參閱我對window.onload vs document.onload的回答,並改用window.onload。

  4. 將作業更改爲窗口 .onload後,還需要刪除小括號。同樣,你只是指名稱的功能,並不希望它實際上被稱爲在這一點上。

  5. 最後,我建議您收聽DOMContentLoaded而不是load - 除非您要運行一些需要等待所有圖像加載的代碼。

+1

我也建議在你定義nameform的第一行前加'var'。這使'nameform'成爲局部變量而不是全局變量。 – hallvors

+0

這似乎已經成功了 – jskrwyk

5

通過將括號你,而不是立即調用函數(以前的事情負載)傳遞函數本身作爲回調

addEventListener('load', meerfirst, false); 
        // no parens! ^^ 

,並通過其(無用,無功能)返回值的addEventListener。


順便說一句,既然你已經知道你將使用哪個瀏覽器的代碼,爲什麼你要在開始時測試這個功能呢?

2

嘗試:

window.onload = function() 
{ 

meerfirst(); 

}; 
+0

我以前試過window.onload方法沒有用。正如在上面的評論中提到的,我越來越多地認爲它與腳本永遠不會執行有關,這引發了問題,爲什麼, – jskrwyk

+0

@missingno提到的parens是addEventListener調用的問題。 – ThinkingStiff

2

你的答案是O'Reilly的範圍內很好地嵌套「JavaScript權威指南」

// Register the function f to run when the document finishes loading. 
// If the document has already loaded, run it asynchronously ASAP. 
function onLoad(f) { 
    if (onLoad.loaded) // If document is already loaded 
     window.setTimeout(f, 0); // Queue f to be run as soon as possible 
    else if (window.addEventListener) // Standard event registration method 
     window.addEventListener("load", f, false); 
    else if (window.attachEvent) // IE8 and earlier use this instead 
     window.attachEvent("onload", f); 
} 
// Start by setting a flag that indicates that the document is not loaded yet. 
onLoad.loaded = false; 
// And register a function to set the flag when the document does load. 
onLoad(function() { onLoad.loaded = true; }); 

當瀏覽器加載完成這不僅運行,但它也將處理跨瀏覽器差異。享受:)