0

xmlファイルがあり、その内容を1秒ごとに特定のhtml divにロードしたいのですが、xmlファイルを解析するjavascriptの部分は次のとおりです。

function getEntries() {

    if (window.XMLHttpRequest)
        req = new XMLHttpRequest();
    req.onreadystatechange = handleReq;
    req.open("GET", "entries.xml", true);
    req.send(null);

}
function handleReq() {
    if (req.readyState == 4)
        document = req.responseXML;
    var states = document.getElementsByTagName("entry");
    for (i = 0; i < states.length; i++) {
        currentState = states[i];
        document.getElementById("LogArea").innerHTML = "<table><tr><td><b>Name:</b></td><td>"
                + currentState.getAttribute("umessage");
        +"</td></tr><tr><td><b>Message:</b></td><td>"
                + currentState.getAttribute("uname");
        +"</td></tr></table>";
    }
}

そしてここにxmlファイルがあります:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<entries>
<entry umessage="aaaaaaaa" uname="aaaaaaa" />
<entry umessage="Hello everybody" uname="John" />
<entry umessage="Hello everybody" uname="Smith" />
<entry umessage="Hello everybody" uname="Knuth" />
</entries>

これがhtmlの部分です。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body bgcolor="yellow" onload='setInterval("getEntries()",1000)'>
<div id="LogArea" align="left">
</div>
</body>
</html>

問題は、指定されたdivに何もロードされておらず、firebug内にエラーが存在しないことです。

4

3 に答える 3

5

HTMLではなくXMLを参照するようdocumentに上書きしようとしています。function handleReq()これが成功するか失敗するかにかかわらず、それはまだ機能しません。

まず、document非同期でロードしたXMLに設定しようとします。コメントで述べたように、これはおそらく失敗します(私のテストでは、ChromeもIE 9もdocumentこの方法で上書きすることを許可しませんでした)。

document = req.responseXML;
var states = document.getElementsByTagName("entry");

失敗した場合は、HTMLページでタグをstates探しています(意図したものではありません)。<entry>成功した場合は、2行後に問題が発生します。これは、document魔法のようにXMLではなくHTMLページになることを期待しているためです。

document.getElementById("LogArea").innerHTML = ...
  • --のプロパティである変数名を使用しないでwindowください。XML応答をなどの別の名前で呼び出しますvar xmldoc = ...

  • グローバル変数は使用しないでください。関数変数を定義するvar whatever = ...代わりにを使用する必要があります。whatever = ...

  • 他の人が述べたように、これsetTimeout(String, ...)は悪い習慣であり、非推奨です。関数はJavaScriptの本格的なオブジェクトであるため、関数自体を渡すだけです(引用符や括弧は使用しないでください)。

  • の本体全体がブロックfunction handleReq()の内側にある必要がありif (req.readyState == 4)ます(最初の行だけではありません)。リクエストがまだ終了していない場合は、何もしたくありません。

于 2013-03-23T19:15:30.093 に答える
2

使用する

setInterval(getEntries,1000)

evaledとなる文字列を渡す代わりに、関数名を直接渡します。

この回答に記載されているように、追加の問題がhandleReqメソッドにあります。

document = req.responseXML;

これはドキュメントを置き換えます。つまり、次の数行は、もう存在しないものを参照しています。

于 2013-03-23T19:12:53.237 に答える
2

最初のパラメータとして文字列を渡すことは悪い/減価償却されます。代わりに、次のいずれかを使用してください。

setInterval(getEntries, 1000);

または、パラメータを渡す必要がある場合:

setInterval(function(){ getEntries('foo') }, 1000);

それではおそらく問題は解決しませんが、覚えておくことが重要です。

于 2013-03-23T19:13:35.590 に答える