BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #16209同步于 2012/5/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

ajax请求得到的responseText为空

Rurouni
2012/5/14镜像同步2 回复
//xmlHttpRequest pool xmlhttp请求池 var XMLHttp = { _objPool: [], _getInstance: function () { for (var i = 0; i < this._objPool.length; i ++) { if (this._objPool[i].readyState == 0 || this._objPool[i].readyState == 4) { return this._objPool[i]; } } this._objPool.push(this._createObj()); return this._objPool[this._objPool.length - 1]; }, _createObj: function () { if (window.XMLHttpRequest) { alert("new XMLHttpRequest not via AjectiveXObject"); var objXMLHttp = new XMLHttpRequest(); } else { var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP']; for(var n = 0; n < MSXML.length; n ++) { try { var objXMLHttp = new ActiveXObject(MSXML[n]); break; } catch(e) { } } } // mozilla某些版本没有readyState属性 if (objXMLHttp.readyState == null) { objXMLHttp.readyState = 0; objXMLHttp.addEventListener("load", function () { objXMLHttp.readyState = 4; if (typeof objXMLHttp.onreadystatechange == "function") { objXMLHttp.onreadystatechange(); } }, false); } return objXMLHttp; }, // 发送请求(方法, 地址, 数据, 回调函数) sendReq: function (method, url, data, callback) { var objXMLHttp = this._getInstance(); with(objXMLHttp) { try { // 加随机数防止缓存 if (url.indexOf("?") > 0) { url += "&randnum=" + Math.random(); } else { url += "?randnum=" + Math.random(); } open(method, url, true); // 设定请求编码方式 //setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); send(data); onreadystatechange = function () { alert(url); if (objXMLHttp.readyState == 4 && (objXMLHttp.status == 200 || objXMLHttp.status == 0)) { alert("readyState = 4"); alert("before callback, objXMLHttp.responseText = " + objXMLHttp.responseText); callback(objXMLHttp); } else if(objXMLHttp.readyState != 4) alert("xmlHttpRequest readyState = " + objXMLHttp.readyState); else alert("xmlHttpRequest not success!"); } } catch(e) { alert(e); } } } }; //以下是发送登陆请求和结果解析的代码 function testLogin() { alert("testlogin"); var url = "http://" + IPServer + ":" + PORT + "/ProjectX/user/vLogin?devId=" + 354705040973295; XMLHttp.sendReq("GET", url, "", loginAnalytic); } function loginAnalytic(objXMLHttp) { alert("loginAnalytic!"); alert("objXMLHttp.readyStatus: ") + objXMLHttp.readyStatus; alert("objXMLHttp.responseText: " + objXMLHttp.responseText); //问题来了,在IE8里这个能显示返回的结果,<user><id>***</id>......</user>,但是在Firefox里这里是空字符串,为什么呢?有什么解决办法??直接在浏览器地址栏里输入上面的请求url地址,服务器也能返回正常的xml字符串 //解析结果 if(window.ActiveXobject){ var ARR_ACTIVEX = ["MSXML4.DOMDocument", "MSXML3.DOMDocument", "MSXML2.DOMDocument", "MSXMLDOMDocument", "Microsoft.XMLDOM"]; //xmlDOM是否建立成功的标识 var xmlDomFlag = false; for(var i = 0; i < ARR_ACTIVEX.length; i++) { try{ var objXML = new ActiveXObject(ARR_ACTIVEX[i]); xmlDoc = objXML; xmlDomFlag = true; } catch(e){ } } if(xmlDoc) { xmlDoc.async = false; xmlDoc.loadXML(objXMLHttp.responseText); } } else if(window.DOMParser) { parser = new DOMParser(); xmlDoc = parser.parseFromString(objXMLHttp.responseText, "text/xml"); } else { alert("浏览器不支持XML解析!") return; } var nowNode = xmlDoc.getElementsByTagName("id")[0]; if(nowNode) { loginId = nowNode.firstChild.nodeValue; alert("loginId: " + loginId); } else { alert("登陆异常!"); return; } alert("loginId" + loginId); } 问题看上面的红色注释部分,在IE中收到的objXMLHttp.responseText是正常的,在Firefox和Chrome中都收不到(为空),但是readyStatus都是4,及响应完成,很奇怪?哪里出了错?求高手指教,万分感谢!
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
Rurouni机器人#1 · 2012/5/16
结论是问题出在FF和chrome不能跨域。。。问题解决,结贴
tangdi机器人#2 · 2012/5/17
楼上说得对,就是跨域问题。