var xml = xmlParse(Request.sendGET("default.xml", gexml).responseText);
var xslt =xmlParse(Request.sendGET("default.xsl", gexml).responseText);
function gexml(response)
{
var feedResponse;
feedResponse = response;
if (response.responseText == '' || response.responseXML.documentElement==null || response.responseXML.documentElement.nodeName=="parsererror")
{ // si le flux n'est pas valide
callBack(feedResponse, feedUrl);
}
}
var xslt =xmlParse(Request.sendGET("default.xsl", gexml).responseText);
function gexml(response)
{
var feedResponse;
feedResponse = response;
if (response.responseText == '' || response.responseXML.documentElement==null || response.responseXML.documentElement.nodeName=="parsererror")
{ // si le flux n'est pas valide
callBack(feedResponse, feedUrl);
}
}
Request.send = function(url, method, callback, data) {
var req;
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
req = new ActiveXObject("Msxml2.XMLHTTP");
}
req.onreadystatechange = function() {
if (req.readyState == 4)
{// only if req shows "loaded"
if (req.status < 400)
{// only if "OK"
(method=="POST") ? callback(req) : callback(req,data);
}
else
{
alert("您所请求的页面有异常);
}
}
}
if (method=="POST") {
req.open("POST", url, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//req.setRequestHeader('Connection','close'); //STUPID 400 FF ERROR FIX
req.send(data);
} else {
req.open("GET", url, true);
req.send(null);
}
return req;
}Request.sendPOST = function(url, data, callback) {
Request.send(url, "POST", callback, data);
}
Request.sendGET = function(url, callback, args) {
return Request.send(url, "GET", callback, args);
}
从服务器返回的数字代码,比如404(未找到)或200(就绪) 现在processVoteResponse()函数开始显示出其意义了。它首先检查XmlHttpRequest的整体状态以保证它已经完成(readyStatus == 4),然后根据服务器的设定询问请求状态。如果一切正常(status == 200),就使用innerHTML属性重写DOM的“votes”节点的内容
status == 200 你查查function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var response = request.responseText.split("|");
document.getElementById("order").value = response[0];
document.getElementById("address").innerHTML =
response[1].replace(/\n/g, "<br />");
} else
alert("status is " + request.status);
}
}
status == 200 数据表示读取完
不知是不是这个原因,没用过ajax
我用这句已经可以达到目的 if (req.status < 400)
现在问题是如果是异步时,一般Request.send 会运行几次才能达到req.readyState == 4,将数据完全取出。
上面给得不全吧!
var xml = xmlParse(Request.sendGET("default.xml", gexml).responseText);
var xslt =xmlParse(Request.sendGET("default.xsl", gexml).responseText);
是调用
其它只要放在js区里就行了。
var oDiv
var xh
function getXML()
{
oDiv = document.all.m
oDiv.innerHTML = "正在装载栏目数据,请稍侯......."
oDiv.style.display= ""
xh = new ActiveXObject("Microsoft.XMLHTTP")
xh.onreadystatechange = getReady
xh.open("GET",a.value,true)
xh.send()}function getReady()
{
if(xh.readyState==4)
{
if(xh.status==200)
{ oDiv.innerHTML = "完成"
}
else
{
oDiv.innerHTML = "抱歉,装载数据失败。原因:" + xh.statusText
}
}
}
</script>
<body>
xmlhttp异步的例子:
URL:<input name=a value="http://www.microsoft.com" style="width:600px">
<input onclick="getXML()" type="button" value="得到源代码">
<input onclick="if(xh && xh.responseText) {alert(xh.responseText);oDiv.innerHTML=xh.responseText}" type="button" value="显示源代码">
<div id=m></div>
function getData()
{
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); // 异步调用
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4) // 调用完毕
{
if (xmlhttp.status == 200) // 加载成功
{
var xmldoc = xmlhttp.responseXML;
var root = xmldoc.documentElement; alert (xmldoc.xml);
}
}
} var url = 'xml.asp';
xmlhttp.open("get", url, true);
xmlhttp.send();
}
</SCRIPT>
<BODY>异步调用 xmlhttp 取后台数据
<input type="button" value="GetData" onclick="getData()"> <%
dim i, xmlxml = "<?xml version='1.0' encoding='gb2312' ?>"
xml = xml & "<data>"for i = 1 to 50
xml = xml & "<record>记录" & i & "</record>"
nextxml = xml & "</data>"response.ContentType = "text/xml"
response.write xml
%>
这么早?
一个简单的AJAX框架:http://xkr.us/code/javascript/XHConn/
注意你这里的调用Request.sendGET("default.xml", gexml).responseText
Request.sendGET("default.xml", gexml)返回的是当然HTTPRequestXML对象,返回后你马上就调用它的responseText属性很显然是不对的,尽管你在send方法中设置了onreadystate方法说当if (req.readyState == 4)才调用,但是这个是不管用的。因为前者是按照js语句顺序执行,而后者是按照事件机制执行,前者在sendGET函数执行完毕就执行,后者则在xml文档完全返回才执行,这样就造成了一个很普通的时序问题。
按照楼主的使用,你的send函数实际上等效于(我在后面添加了一行注意看):
Request.send = function(url, method, callback, data) {
var req;
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
req = new ActiveXObject("Msxml2.XMLHTTP");
}
req.onreadystatechange = function() {
if (req.readyState == 4)
{// only if req shows "loaded"
if (req.status < 400)
{// only if "OK"
(method=="POST") ? callback(req) : callback(req,data);
}
else
{
alert("您所请求的页面有异常);
}
}
}
if (method=="POST") {
req.open("POST", url, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//req.setRequestHeader('Connection','close'); //STUPID 400 FF ERROR FIX
req.send(data);
} else {
req.open("GET", url, true);
req.send(null);
}
alert(req+"||"+req.response); //注意这里,你实际上等效于在这里调用
req.response,但是由于这里加了个alert中断,所以时序
问题反而被解决,因此如果你在本机上调试,一般错误可
能不再出现
return req;
}
既然你已经明白了异步调用,那怎么不写回调函数呢?
responseText只应在回调函数及后续程序中使用,不知道我说的你明白没。
我测试了一下的确如果加入一个alert程序不会出错,但最终解决方法哪位有,我现在需要的是解决这个问题
var xml = xmlParse(Request.sendGET("default.xml", gexml).responseText);
var xslt =xmlParse(Request.sendGET("default.xsl", gexml).responseText);
的方式,这个问题我觉得基本上无解,不知道是否有哪位高手有办法解决。我的解决方法是(这个方法似乎不是最好的,但是大致解决这个时序问题,如果需要一个较好的解决这个问题需要详细了解你的目的,不过我的JS也不是很好,所以暂时就不提供了):
var xml="";
Request.sendGET("default.xml", gexml); //只发请求不马上处理,处理在另外一个函数中
Request.sendGET("default.xsl", gexml); //只发请求不马上处理,处理在另外一个函数中function gexml(response)
{
var feedResponse;
feedResponse = response;
if (response.responseText == '' || response.responseXML.documentElement==null
|| response.responseXML.documentElement.nodeName=="parsererror")
{ // si le flux n'est pas valide
callBack(feedResponse, feedUrl);
}
else //这里为我添加的,实际上你对reponseText处理似乎应该放在这里
{
xml=xmlParse(response.responseText);//注意这里没有区分xml和xslt,楼主自己斟
酌着弄吧,我觉得你的这段代码不是简单修
改就可以
}
}
正确的解决方法是检测返回的状态。 xmlhttp 对象还没有调用完成,就将它作为结果传给另一个方法了?
只能说明你的方法有问题