2012-04-22 97 views
0

我掙扎了一段時間,我無法找到此代碼無法工作的原因。Javascript變量顯示爲undefined

當單擊#submitmsg時,它應該會觸發另一個函數,它會從php文件中獲取時間。這是一個不同的聊天框,它應該顯示名稱(這是Ja)在這種情況下,它旁邊的時間是可變的「tajm」。雖然未定義顯示,而不是時間。

任何想法爲什麼不這樣做?

代碼如下片段:

var tajm; 

$(document).ready(function() { 
    $("#submitmsg").click(function() { 
     time(); 
     var newtext = $("#textmsg").val(); 
     var oldtext = document.getElementById("textbox").innerHTML; 
     document.getElementById("textbox").innerHTML = oldtext + "<br/><div id='name'>Ja:  " + tajm + "</div><div id='red'>" + newtext + "</div>"; 
     $("#textbox").scrollTop($("#textbox")[0].scrollHeight); 
    }); 
}); 

function time() { 
    var ajax = new XMLHttpRequest(); 
    ajax.onreadystatechange = function() { 
     if (ajax.readyState == 4) { 
      tajm = ajax.responseText; 
     } 
    }; 
    ajax.open("GET", "r.php", true); 
    ajax.send(null); 
} 
+0

異步HTTP請求需要時間。 – Pointy 2012-04-22 14:57:08

+0

如果代碼以「正常」順序執行,則不必提供回調('ajax.onreadystatechange')。 – 2012-04-22 15:01:28

+0

我已經通過添加setTimeout並延遲了一點來解決了這個問題。有沒有更有效的方法可以做到這一點? – xtra 2012-04-22 15:11:27

回答

2

AJAX是異步

您的回調僅在代碼的其餘部分完成後運行一段時間。

0

由於ajax是異步的,Java腳本永遠不會等待執行時間方法。 在這種情況下,U需要編寫下面的代碼片段格式

$(document).ready(function() { 
    $("#submitmsg").click(function() { 
     $.load("r.php",function(){ 
      var newtext = $("#textmsg").val(); 
      var oldtext = document.getElementById("textbox").innerHTML; 
      document.getElementById("textbox").innerHTML = oldtext + "<br/><div id='name'>Ja:  " + tajm + "</div><div id='red'>" + newtext + "</div>"; 
      $("#textbox").scrollTop($("#textbox")[0].scrollHeight); 
     } 

    }); 
}); 

注:設置超時工作,因爲ü[R給等待加載你的Ajax調用。