「PHP、MySQL、JavaScriptの学習-O'Reilly」で非常に基本的なAJAXプログラミングを行っています。JavaでテキストまたはAJAXを使用したページを取得する非常に基本的なプログラムがいくつかあります。私はW3Schools.comサイトを使用して、AJAXでXML形式のドキュメントを取得する方法について詳しく学ぼうとしています。私が学んでいることに関連する2つの質問があります。
http://www.w3schools.com/dom/dom_loadxmldoc.aspのコードを使用すると、以下のスニペットを含むXMLドキュメントを返すことができます。
function loadXMLDoc(dname)
{
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
}
else
{
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.open("GET",dname,false);
xhttp.send();
return xhttp.responseXML;
}
//called this way
xmlDoc=loadXMLDoc("books.xml");
ただし、これを機能させるには、非同期をfalseに設定する必要があります。asyncをtrueに設定すると、nullが返されます。だから私の最初の質問は、これがXMLドキュメントを返すために非同期がfalseでなければならないのはなぜですか?
2番目の質問ですが、本のコードとWebサイトのコードを組み合わせようとすると、スニペットは次のようになります。
<body>API Call output
<div id='output'>will be here</div>
<script>
out = ""
xmlDoc = getResponse()
users = xmlDoc.getElementsByTagName('username')
for (count = 0; count < users.length ; count++)
{
out += "Username: " + users[count].childNodes[0].nodeValue + '<br />'
}
document.getElementById('output').innerHTML = out
function ajaxRequest()
{
try //good browser
{
var request = new XMLHttpRequest()
}
catch(e1)
{
try // IE6+
{
request = new ActiveXObject("Msxml2.XMLHTTP")
}
catch(e2)
{
request = false
}
}//end catch(e1)
return request
}
function getResponse()
{
params = "apikey=test"
request = new ajaxRequest()
request.open("POST", "processapi.php", true)
request.setRequestHeader("Content-type",
"application/x-www-form-urlencoded")
request.setRequestHeader("Content-length", params.length)
request.setRequestHeader("Connection", "close")
request.onreadystatechange = function()
{
if (this.readyState == 4)
{
if (this.status == 200)
{
if (this.responseXML != null)
{
return this.responseXML
}
else alert("Ajax error: No data received")
}
else alert( "Ajax error: " + this.statusText)
}
}
request.send(params)
}
</script>
</body>
「TypeError:xmlDocisundefined」というエラーが表示されます。asyncをtrueまたはfalseに設定した関数getResponse()では機能しませんが、xmlDocisundefinedエラーが発生します。xmlDocは、loadXMLDoc()の戻り値に設定される前に、最初の例(w3schools.comから)の他の場所で定義されておらず、正常に機能します。ajaxRequest()は本の外にあり、getResponse()のほとんどすべてが本の外にありますが、私はそれをgetResponse()関数に入れました。processapi.phpは、このスクリプトから呼び出されたときにXMLドキュメントをエコーするだけです。
最初の例で非同期が機能しないのはなぜですか?また、2番目の例でxmlDocが定義されていないのはなぜですか?どんな助けでも大歓迎です。