2011-09-10 62 views
2

我遇到了一些jQuery代碼的問題。 在我的HTML頁面我使用ajax來獲取一些信息,然後我改變一個HTML元素 與$("#id").html(...)如何在頁面加載完成後調用函數? (只有然後..)

的問題是,我也有一個$(document).ready代碼,我想稱之爲一次 當頁面加載完成,但與$("#id").html(...) 在HTML每次更改後的代碼被再次調用。

我怎樣才能運行$(document).ready代碼只有一次?

下面是一個例子:

$(document).ready(function(){ 
    // this code will run not only once... 
} 

function f(){ 
    $("#id").html(...); 
} 
+1

定義 「加載完成」。所有內容? DOM?什麼?你的第二個要求是一樣的嗎?有關係嗎?不同? –

回答

1

從評論上the .ready documentation

看起來像。就緒()不僅激發時,頁面已初步解決了 DOM,但顯然也經過更改DOM。如果 您的準備好的處理程序更改DOM,則這是一個問題。這將導致ready()不止一次觸發 。如果每個調用 都向DOM添加更多內容,則可能會導致無限循環。 Firefox和IE的行爲與此不同, 包含不同的錯誤消息,並使頁面以不同的狀態顯示在 中。所以,如果ready()修改了DOM,那麼明智的方法是檢查ready是否已經被觸發。

在回答自己:那麼它出現的問題的一部分是不是 就緒功能再次開火(儘管這是可能的aparently), 但改變DOM導致腳本創建準備 功能再次啓動,添加一個額外的就緒功能等等。 這似乎發生如果JavaScript被嵌入到HTML中 點以外(或包含在)準備好的 處理程序修改的DOM部分中。 (顯然最好把 在文檔頭中創建一個就緒函數的腳本,但在這種情況下,這是 不是一個選項。)通過檢查全局標誌變量修復的問題是 在執行jQuery(document).ready之前未定義(......)。

如果這可能是你的問題,你可以採用相同的解決方案:

var onLoadFired = false; 
$(document).ready(function() { 

    /* Ensure this function only runs once */ 
    if (onLoadFired) { 
     return; 
    } 
    else { 
     onLoadFired = true; 
    } 

    /* Business logic */ 

    // .. your code here .. 
}); 

或者,更好的,請將您的處理器必須清楚交代在您的網頁head元素的script標籤包含一個單獨的腳本文件。

2

嘗試:

var run = false; 
$(document).ready(function() { 
    if(!run) { 
     ... 
     run = true; 
    } 
}); 

......或者......

$(window).load(function() { 
    ... 
}); 

第一個將確保其只運行一次;第二個在整個頁面加載完成時運行(如果在圖像加載完成後需要調整大小時有用)。

0

試試這個:

$(window).bind("load", function() { 
    ... 
}); 
相關問題