2011-08-31 33 views
1

我對jQuery的理解是腳本將在文檔準備就緒後立即執行。在Jquery中生成HTML之前執行的腳本?

我有一些動態生成的HTML,在頁面加載時生成一旦從服務器返回響應以生成什麼。 HTML都是模板的一部分。所有這些都是通過以下行開始的。

window.App=new AppView; 

和行之後,我有

alert($("#field").val()); 

其中$( 「#場」)是這是動態生成到HTML

和NULL被驚動了模板的一部分。

但是,如果我設置setTimeout來執行警報,我會看到一個值。 這兩行代碼都在jQuery {}中。

有人可以解釋爲什麼第二行是在第一行中的所有內容執行之前執行的。

P.S.這是生成模板行

 $("body").html($.tmpl("temp", data)); 
+0

如果不知道AppView函數的內容,則無法回答。因爲它可能包含一些包含超時的內容。 – Alxandr

+0

沒有時間或任何與延遲有關的事情。這是一個非常長的代碼,我會盡力提取什麼是必要的,如果有必要 –

+0

@Alxandr,還有什麼可能的原因,所以我會知道該找什麼。裏面的所有代碼基本上都涉及到,向服務器發送GET請求並將響應解析到字段 –

回答

1

我想我只是想出了問題。你說你的代碼涉及從服務器獲取GET請求?那麼,這意味着異步代碼。換句話說,發生了以下情況:

You call new AppView 
    - Inside AppView, a XHR is created, sending a GET request to server 
    - Code finishes inside AppView, and returns to calling function 
You call alert field val (not created yeat) 
Some time later, the GET request is finnished 
    - Inside callback-function for GET-request. Your field get's created. 
+0

是的,這也是我的猜測。這通常是如何解決的?在瀏覽器控制檯中確實存在一個XHR –

+0

通常有兩種方式,一種是不好的(同步運行請求),一種是好的,最好的方式是將代碼作爲回調但是,如果沒有更多的代碼,我不能解釋這一點。 – Alxandr

+0

我想我已經得到你了,謝謝。 –

1

您應該只使用jQuery在DOM準備就緒:

window.App=new AppView; 

$(document).ready(function() { // Triggered when the whole DOM is ready 
    alert($("#field").val()); 
}); 
+0

他是否說過「這兩行代碼都在jQuery {}」中?「?你不認爲這意味着它在jQuery中的功能是這樣的:'jQuery(function(){/ * code here * /}',換句話說,在頁面加載時運行? – Alxandr

+0

我確實說過所有的東西都在jQuery {}。我也嘗試使用單獨的$(document).ready ...,沒有運氣。這次它甚至在瀏覽器有機會顯示來自服務器的響應之前就會發出提醒。 –

0

你需要在事件處理起來包住你的代碼多數民衆贊成在調用的時候你的頁面已經完成裝!

$(function() { 
    $('body').html($.tmpl("temp", data)); 
}); 
相關問題