我在开发“简单”javascript 应用程序时遇到了一种奇怪的行为。函数通过经典的 Ajax/POST 方法向 .php 页面发送带有一些参数的请求。
function sendRequest(params, doAsync, onSending, onDone)
{
var xmlhttp;
if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState < 4) {
if(typeof onSending == "function") onSending();
}
else if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
if(typeof onDone == "function") {
var resultCode = xmlhttp.responseXML.documentElement.getAttribute("result");
var content = xmlhttp.responseXML.documentElement.childNodes;
onDone(resultCode, content);
}
}
}
xmlhttp.open("POST", "mypage.php", doAsync);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(params);
php 页面对其进行处理并以 XML 形式返回一个简单的结果,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<MYreply result="0"/>
嗯......这个方法在 IE 和 Firefox 下工作正常,但在 Chrome 上却不行,上面写着“无法读取 null 的属性 'documentElement'”(=> responseXML 为 null)。
我读到setRequestHeader
Chrome 并不完全支持这些功能(请参阅WebKit "Refused to set unsafe header 'content-length'")。事实上,Chrome 在执行时会出错,但删除这些行会导致应用程序在 IE 和 Firefox 下也失败。
那么......发出 Ajax/POST 请求并获得相关 XML 响应的交叉兼容方式是什么?
PS:我不想使用 jQuery 库或其他外部库;)