2012-10-29 81 views
0

對不起,我不清楚冠軍,但我找不到,可能適合我problem.To更好地解釋它是什麼,讓我告訴你我的javascript代碼什麼:功能不能正常工作

function askForIDForCommand() 
{ 
    var content; 
    $.post("Somepage.aspx", function (data) 
    { 
    content = $(data).find("#myDiv").html(); 
    }); 

    var myFunc = function() { } 
    var buttons = [{ text: 'OK', click: myFunc}]; 
    ui_window("Hi", 630, content, buttons); 
} 

正如你所看到的,我聲明瞭一個名爲content的變量。然後,我將指定的div的html分配給它。然後我把它發送到ui_window函數,它只顯示一個帶有指定內容的jquery對話框。問題是我沒有得到對話框中的HTML內容。當我用Firebug查看「content」的值時,我可以看到它包含html內容。是什麼讓我絕望的是,如果我改變了上述函數下面的一個HTML內容被顯示在對話框中:

function askForIDForCommand() 
{ 
    var content; 
    $.post("Somepage.aspx", function (data) 
    { 
    content = $(data).find("#myDiv").html(); 
    var myFunc = function() { } 
    var buttons = [{ text: 'OK', click: myFunc}]; 
    ui_window("Hi", 630, content, buttons); 
    }); 

} 

如果你不能發現其中的差別,我只是把ui_window內的通話$ .post()方法。它的工作原理。爲什麼?

而這裏的情況中的HTML內容,您需要它:

 <table> 
     <tr> 
      <td align="right"> 
       <label> 
        Enter the ID:</label> 
      </td> 
      <td> 
       <input id="txtID" type="text" onkeydown="return onlyNumbers(event);" maxlength="8"/> 
      </td> 
     </tr> 
    </table> 
+2

閱讀關於[Ajax]中的* A *(http://en.wikipedia.org/wiki/Ajax_(編程)) – Yoshi

回答

4

打電話ui_window之前分配給content。這個任務發生在您的anomyous函數內部,因此直到有人調用函數(即,一旦完成到Somepage.aspx的發佈),纔會執行該任務。

相比之下,只要您有開始到Somepage,但沒有等待該操作完成,就打電話給ui_window()。那時你的完成函數還沒有被調用,因此content仍然包含undefined

+0

感謝Henning。在這種情況下,你會建議我做什麼。我的意思是,我想將「內容獲取」部分封裝到將返回內容的函數中。 –

+0

@MikeJM:你不能。啓動AJAX操作將始終在數據準備就緒之前立即返回,並且在從當前操作返回之前並不會準備好,並且讓瀏覽器執行其他操作,而不是執行您的Javascript代碼。使用它的唯一方法是讓任何需要數據的計算從回調函數中發生 - 這就是爲什麼您首先要提供回調函數的原因。 –

+0

@ Henning,我找到了一個辦法。我剛剛意識到$ .post只是$ .ajax(...)的縮寫,類型爲POST。默認情況下,Ajax調用是異步的。如果我將它設置爲false,那麼即將到來的命令將不得不等待,直到ajax調用完成。我試了一下,它確實如我所願 –

1

問題是AJAX調用服務器。在第一種情況下,您發送請求並直接進入下一個命令,即myFunc等等。因此,此時您的內容變量未被初始化。

2

問題是,當您收到來自服務器的響應時調用內部函數。然後在第一種情況下,變量在執行這些行時尚未分配,而在第二種情況下,您確定ui_window被調用了可用數據。