我有一个realtivley简单的ajax应用程序,我已经分解为更加模块化。代码位于下面的链接中,我主要做的是添加GetRecordSet函数并允许fetchcompelte获取一个变量,用于将数据放入哪个层。它应该可以正常工作。当我输入alert()时,代码似乎执行,除了在fetchcomplete中的if子句中。
http://www.nomorepasting.com/getpaste.php?pasteid=22558
这是get_records.php的代码,再次看起来应该没问题
http://www.nomorepasting.com/getpaste.php?pasteid=22559
这是原始的索引php文件
答案 0 :(得分:0)
我建议您使用http://www.prototypejs.org中的prototypejs,它会抽象代码中的所有状态检查,并使其更简单,并摆脱混乱。
如果由于某种原因您更喜欢使用自己的代码,那么请避免对XMLHttpRequestObject的readyState属性使用字符串值。请改用下表
State Description
0 The request is not initialized
1 The request has been set up
2 The request has been sent
3 The request is in process
4 The request is complete
并检查。
答案 1 :(得分:0)
首先,我会同意Shyam,并为Firefox安装Firebug;这将是javascript调试的巨大帮助。
无论如何,行
xmlHttp.onreadystatechange = FetchComplete(layername);
会将FetchComplete(layername)
的结果分配给xmlHttp.onreadystatechange
,这不是您想要的。它需要
xmlHttp.onreadystatechange = FetchComplete;
但是你有传递layername
的问题。
如果将onreadystatechange定义为匿名内部函数,则可以轻松使用在其外部定义的变量,因此您可以执行以下操作:
function GetAuctionData(pk) {
var xmlHttp=GetXmlHttpObject();
var layer = "Layer2";
if(xmlHttp==null) {
alert("Your browser is not supported?");
}
var url="get_auction.php?";
url=url+"cmd=GetAuctionData&pk="+pk;
url=url+"&sid="+Math.random();
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
document.getElementById(layer).innerHTML=xmlHttp.responseText
} else if (xmlHttp.readyState==1 || xmlHttp.readyState=="loading") {
document.getElementById(layer).innerHTML="loading"
}
};
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
layer
被定义为GetAuctionData()中的局部变量,但可以在匿名函数中访问,因为您正在创建一个Closure。请注意,我没有测试过上述功能,但它原则上应该有用。