-5

では、javascript HTTPRequestを使用して、「chem_vocab.xml」というXMLドキュメントを読み込もうとしています。しかし、関数を実行しようとしても、何も起こりませんでした。故障が発生している場所を確認できるように、alert()行をいくつか配置しました。次の間に問題があるようです。

alert("Beginning Loading");

alert("XML Loaded");

このページは「BeginningLoading...」を正しく警告しますが、「XMLloaded」は警告しません。私の問題はどこにありますか?

function load_vocab(){
alert("Beginning Loading...");
var xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","chem_vocab.xml",true);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML; 

alert("XML loaded");

var x=xmlDoc.getElementsByTagName("wordlist")[0];
x= x.getElementsByTagName("word")[0];
word = x.getElementsByTagName("spelling")[0].childNodes[0].nodeValue;
definition = x.getElementsByTagName("definition")[0].childNodes[0].nodeValue;

alert("XML parsing successful");

document.getElementById('spelling').innerHTML = word;
document.getElementById('definition').innerHTML = definition;

}

4

3 に答える 3

4

あなたのコード:

xmlhttp.open("GET","chem_vocab.xml",true);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML; 

Ajax リクエストは非同期です。したがって、送信後すぐにプロパティを読み取ることはできません。( の値はnull/undefined になります。)代わりに、コールバック内から実行する必要があります。.responseXMLxmlDocreadystatechange

あなたは Ajax の経験がないようなので、サードパーティの Ajax ライブラリ (jQuery や、汎用ライブラリを使用しない場合はminiajaxなど) を検討してください。

于 2012-08-16T18:21:23.053 に答える
1
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      xmlDoc=xmlhttp.responseXML; 

      alert("XML loaded");

      var x=xmlDoc.getElementsByTagName("wordlist")[0];
      x= x.getElementsByTagName("word")[0];
      word = x.getElementsByTagName("spelling")[0].childNodes[0].nodeValue;
      definition = x.getElementsByTagName("definition")[0].childNodes[0].nodeValue;

      alert("XML parsing successful");
      document.getElementById('spelling').innerHTML = word;
      document.getElementById('definition').innerHTML = definition;
    }
  }

あなたのコードは非同期です。できるようになる前に、応答を待つ必要がありますxmlDoc=xmlhttp.responseXML;。そのため、イベントのイベント ハンドラーを追加しonreadystatechangeて、応答が得られるようにする必要があります。それが上記のコードが行うことです

于 2012-08-16T18:21:35.550 に答える
0

Asynchronously を呼び出し、Synchronously が返されることを期待しています。このコードを使用すると、呼び出しが非ブロックになるため、応答をロードすることはありません。

xmlhttp.open("GET","chem_vocab.xml",true); // True means non-blocking, you need a listener

したがって、これは常に null になります。

xmlDoc=xmlhttp.responseXML; 

このドキュメントに従って、迅速かつ汚い修正を行います。

xmlhttp.open('GET', 'chem_vocab.xml', false);
xmlhttp.send(); // because of "false" above, will block until the request is done 
                // and status is available. Not recommended, however it works for simple cases.

if (xmlhttp.status === 200) {
  console.log(request.responseText);
  xmlDoc=xmlhttp.responseXML;
}
于 2012-08-16T18:24:58.637 に答える