【问题标题】:responseXML from Ajax/POST request is null only on Chrome来自 Ajax/POST 请求的 responseXML 仅在 Chrome 上为空
【发布时间】:2012-10-16 13:07:39
【问题描述】:

我在开发“简单”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 上却不行,上面写着“Cannot read property 'documentElement' of null”(=> responseXML 为 null)。

我了解到 Chrome 不完全支持 setRequestHeader 函数(请参阅 WebKit "Refused to set unsafe header 'content-length'")。事实上,Chrome 在执行时会报错,但删除这些行会导致应用程序在 IE 和 Firefox 下也失败。

那么...发出 Ajax/POST 请求并获得相关 XML 响应的交叉兼容方式是什么?

P.S.:我不想使用 jQuery 库或其他外部库 ;)

【问题讨论】:

  • 我不想使用 jQuery 库或其他外部库 - 为什么不呢?任意数量的跨浏览器 ajax 库都可能解决此问题。
  • 我知道如果我使用 jQuery 会很容易,但出于非常特殊的原因我不能使用它;)
  • 您的 php 脚本是否输出正确的内容类型标头?我知道某些浏览器在收到错误的内容类型标头时可能会很挑剔
  • 关于 jQuery;如果它与 jQuery 一起使用,你可以 try 然后看看他们的源代码。为了浏览器兼容性,已经对 jQuery 进行了大量研究,因此向他们学习可能会很有趣:)

标签: php javascript xml ajax google-chrome


【解决方案1】:

使用跟随。

var parent = responseXml.getElementsByTagName("MYreply");
var resultvalue = parent[0].getAttribute('result');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2013-05-13
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多