我有一个在线聊天室,它使用jQuery/Ajax从服务器请求数据。然而,我使用的方法效率非常低,我试图通过仅在聊天内容发生更改(新消息等)时加载服务器数据来改进它。该方法似乎在逻辑上是正确的,尽管不知何故它从不计算为true。我已经附上了下面的代码,请告诉我我做错了什么,因为这给了我一个非常艰难的时间。我希望仅当来自服务器的数据不同时才更改聊天div。
function loadMsgs()
{
var v_loadMsgs = new XMLHttpRequest();
v_loadMsgs.open("GET", "msgs.php");
v_loadMsgs.onreadystatechange = function()
{
var old_content = $("#msgs").html();
var new_content = v_loadMsgs.responseText;
if (old_content != new_content)
{
$("#msgs").html(new_content);
}
if (old_content == new_content)
{
$("#msgs").html("EQUAL!"); // only here for testing
}
};
v_loadMsgs.send(null);
}发布于 2011-03-18 05:36:32
我只使用jQuery的AJAX函数。它们让一切变得非常简单:
function loadMsgs()
{
jQuery.get("msgs.php", function(data)
{
if ($("#msgs").html() != data)
{
$("#msgs").html(data);
} else {
$("#msgs").html("EQUAL!"); // only here for testing
}
});
}如果你真的想知道你的方法不工作的原因,你不需要检查服务器是否真的向你发送了一个响应(返回一个4的readyState ):
function loadMsgs()
{
var v_loadMsgs = new XMLHttpRequest();
v_loadMsgs.open("GET", "msgs.php");
v_loadMsgs.onreadystatechange = function()
{
if (v_loadMsgs.readyState == 4)
{
var old_content = $("#msgs").html();
var new_content = v_loadMsgs.responseText;
if (old_content != new_content)
{
$("#msgs").html(new_content);
}
if (old_content == new_content)
{
$("#msgs").html("EQUAL!"); // only here for testing
}
}
};
v_loadMsgs.send(null);
}发布于 2011-03-18 05:36:12
当您执行.html()时,浏览器会给出格式整齐的HTML。也就是说,所有的标签都是封闭的,所有的属性都用引号括起来,诸如此类。而且您从msgs.php返回的内容很可能没有完全格式化。因此,这就是区别所在。
然而,如果你担心效率低下,这种方法仍然是非常低效的。我的意思是,是的,您不再不必要地更新UI,但是您仍然从服务器加载消息列表,不是吗?
为了在这里节省几个字节,您应该使用"if-modified“技术。也就是说,与消息列表一起返回某种类型的时间戳。比方说,就是一个整数。当服务器上发生变化时,将该整数加1。当从服务器请求更新时,让AJAX代码传递之前接收到的时间戳,如果时间戳是当前的,则让服务器响应"nothing changed“。否则,让服务器传输新的消息列表。粗略地说,这就是我们的想法。
发布于 2011-03-18 05:33:36
尝试使用jquery's ajax functions
https://stackoverflow.com/questions/5345517
复制相似问题