2012-04-22 93 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调用。