0

私は学校のプロジェクトを行っていますが、これまでのところ、このスクリプトをコピーしてここに貼り付けて、物事を「機能させる」ことがたくさんありました。ある行のコードを別の行と比較して違いを探す以外に、自分が何をしているのかまったくわかりません。

いくつかの値を返す JavaScript があります。単純な Web ページ形式の場合は正常に動作しますが、より複雑なページに挿入すると動作しなくなります。

ページの最後に数値の行を表示し、1000 ミリ秒ごとに更新する必要がありますが、Temp() を表示するだけです...

data.xml を確認しましたが、PIC プロトタイプのボタンなどを押すと、これらの値が更新されています。

単純な Web ページと複雑なページの両方に同じ ajax.js ファイルを使用しています。見落とし</p></div>タグのような単純なものだと思いますが、私の目には見えないようです。

コードを見て、私が見逃しているものを確認してもらえますか? ありがとう!

ajax.js

        var xhr;

        function getXMLHttpRequest(){

        try { return new ActiveXObject("Msxm12.XMLHTTP"); } catch(e){}; 
        try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e){};  
        try { return new XMLHttpRequest(); } catch(e){};    

        return null;
        }

        function parseHttpResponse(){

            if(xhr.readyState == 4){

                if(xhr.status == 200){

                document.getElementById("T0").innerHTML=xhr.responseText;
                }
                else
                {

                }
            }
        }

        function getTemp(){
        xhr = getXMLHttpRequest();

        xhr.open("GET", "data.xml", true);
        xhr.onreadystatechange = parseHttpResponse;
        xhr.send(null);
        }



        setInterval("getTemp()", 1000);

シンプルなウェブページ - これはうまく機能します

            <html>
        <head><title>Ajax test - index1</title>

        <script src="ajax.js" type="text/javascript">
        </script>

        </head>

        <body onload="getTemp();">
            <h2>Headline</h2>
            <p>Paragraph</p>
            <div id='T0'>Loading Temp0...</div> 
        </body>
        </html>

「複雑な」Web ページ - これを使用すると喜びが得られない

                <!DOCTYPE html>
            <html>
            <head>
            <title>Elex267-Webpage</title>

            <script src="ajax.js" type="test/javascript">
            </script>

            <link rel="stylesheet" href="myStyle.css" type="text/css" >



            </head>

            <body onload="getTemp();">
            <!-- Banner at Top of Page ***********************************-->
            <div style="background-color:blue; color:white;font-size:30px;">

            <img src="Pics/camosun-white.png" alt="CamosunPNG" width="200" height="70" align="left">
            <div align="center"style="margin-left:50%">Elex 267 Web Demo
            <br>
            Microchip TCP/IP Stack v3.02</div>
            </div>
            <!--*********************************************************-->
            <!--NavBar Code *********************************************-->
            <div class="nav">
            <ul>
            <li><a href="index.htm">Home</a></li>
            <li><a href="features.htm">Features</a></li>
            <li><a href="about.htm">About</a></li>
            </ul>
            </div>
            <!--***************************************************-->
            <p>
            Welcome to the Elex 267 Demo Web Server for [Name Here].<br>
            </p>
            <p>
            This web page is being run on the NM101 NorthMicro Pic Prototype Board with the LCD/Keypad and Network modules.
            <br>
            This web page refreshes the data every 3 seconds.
            </p>
            <center>
            <img border="5" src="http://www.northmicro.com/GFX/nm110nm120onproto.jpg" alt="NM110 Proto Pic" width="200" height="200" >
            </center>
            <br>
            <div id="feedback" style="width:500px;float:left;">
            &nbsp;&nbsp;&nbsp;&nbsp;Pot RA0:   1022 <br>
            &nbsp;&nbsp;&nbsp;&nbsp;Pot RA1:   223 
            <br><br>
            &nbsp;&nbsp;&nbsp;&nbsp;Switch RA2: <img src="Pics/SwitchUp.gif" alt="SwitchOff" width="20" height="20" align="top">
            <br><br>
            &nbsp;&nbsp;&nbsp;&nbsp;LEDs:&nbsp;&nbsp;RB6  <img src="Pics/LEDOff.gif" alt="LED_Off" width="20" height="20" align="top"> &nbsp;&nbsp;RB5   <img src="Pics/LEDOn.gif" alt="LED_On" width="20" height="20" align="top">  
            </div>

            <div id="input" style="width=50%;margin-left:50%;">
            <b>Commands</b><br>
            <button align="left" type="button" onclick="alert ('RB5 Activated')">Toggle RB5</button>
            <br>
            <button align="left" type="button" onclick="alert ('RB6 Activated')">Toggle RB6</button>
            </div>
            <br><br>
                <div id='T0'>Loading Temp0...</div> 
            </body>
            </html>
4

1 に答える 1

2
setInterval("getTemp()", 1000);

この行では意味がなく、問題の原因である可能性があります。この呼び出しはgetTemp、この呼び出しが返された後から開始して、毎秒呼び出されます。getTemp関数では、変数を再利用して、毎回xhr新しいXMLHttpRequestインスタンスを作成しています。それだけでは必ずしも問題ではありません ("Msxm12.XMLHTTP"間違っているように見える は別として、おそらく であるはずです"Msxml2.XMLHTTP")。

ただし、前のリクエストが応答を受信したかどうかに関係なく、各呼び出しでgetTemp新しい要求を発行しています(3 番目の引数は、非同期の要求応答処理を意味します)。これを考慮してください。クライアントがサーバーの応答を待っているため、リスナーが呼び出されていない (またはその部分が実行されていない) 可能性があります。ここで、1 秒のタイマーが作動し、再度呼び出して、リスナー コードで使用される値を上書きます。クロージャーがあり、バインドされた変数であるため、既に競合状態が発生しています。truereadystatechangereadyState == 4getTemp xhrxhr

さらに、HTTP クライアントは (RFC 2616 に従って) SHOULD NOT (RFC 2616 による) であり、適切に設計された Web ブラウザーは、同じサーバーまたはプロキシに対して指定された数 (デフォルト: 2 から 8) を超える持続的な HTTP 接続を開いたままにしておくことはありません。そのため、ドキュメントが複雑になり、並行してロードする必要のあるリソースが増えるほど、このアプローチは失敗する可能性が高くなります。

呼び出しを削除し、プロパティを更新する行の下にsetInterval(…)呼び出しを追加する必要があります (要求が成功した場合)。これにより、新しい要求が発行されるようになります。新しいリクエストを発行する前に、少なくとも が (FINISHED) になるまで待つ必要があります。次の呼び出しまで 1 秒待ちたいので、 を使用します。getTemp()innerHTMLstatus == 200readyState4window.setTimeout("getTemp()", 1000)

)そのコードをきれいに印刷する、つまり関数本体とブロック コンテンツを適切な量の空白でインデントし、たとえば と の間に空白を追加すると、理解に役立つはずです{。コードのフォーマットの多くを自動化できる Eclipse JavaScript Development Tools のようなエディターがあります。

その後、デバッガーの使用方法を学び (Firefox には Firebug を使用します。他のブラウザーの新しいバージョンには 1 つが組み込まれています)、コード、特にgetTempおよびにブレークポイントを設定する必要がありparseHttpResponseます。コードをステップ実行して (注意:をステップ オーバーして send()から続行し、 のブレークポイントで実行が停止するようにしますparseHttpResponse)、何が起こっているかを確認します。幸運を。

于 2012-11-18T02:32:24.580 に答える