「単純な」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 の「安全でないヘッダー 'content-length' の設定を拒否しました」を参照)。実際、Chrome では実行時にエラーが発生しますが、これらの行を削除すると、IE および Firefox でもアプリケーションが失敗します。
では、Ajax/POST リクエストを作成し、関連する XML レスポンスを取得する相互互換性のある方法は何でしょうか?
PS: jQuery ライブラリやその他の外部ライブラリは使いたくない ;)