1

AJAXを学び始めたばかりの初心者の質問で申し訳ありません。

「myName」テキストが変更されたときに divMessage コンテンツが継続的に変更される原因を正確に理解したいと思います。

1) Javascript 関数プロセスが常に「リッスン」しているように見えますが、これは通常の Javascript の動作ですか、または「プロセス」を繰り返し呼び出すトリガーはありますか? 2) 「body onload」に割り当てた関数が繰り返し実行されるというのは本当ですか? この繰り返し実行の頻度は? 3) 関数プロセスを 1 回だけ実行したい場合はどうすればよいですか?

4) ボディが 1 回しかロードされないと思っているので、混乱しています。しかし、「body onload」の後に関数「process」が呼び出され、関数 process が divMessage を変更して「body」を変更し、本質的に「body onload」を再び通過させてから「process」を再度行うためですか?など..?

ご協力いただきありがとうございます。

<head>
  <script type="text/javascript" src="quickstart.js"></script>
</head>
<body onload='process()'>
  Server wants to know your name:
  <input type="text" id="myName" />
  <div id="divMessage" />
</body>

これがquickstart.js処理パーツです

function process()
{
  // proceed only if the xmlHttp object isn't busy
  if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
  {
    // retrieve the name typed by the user on the form
    name = encodeURIComponent(
    document.getElementById("myName").value);
    // execute the quickstart.php page from the server
    xmlHttp.open("GET", "quickstart.php?name=" + name, true);
    // define the method to handle server responses
    xmlHttp.onreadystatechange = handleServerResponse;
    // make the server request
    xmlHttp.send(null);
  }
}

  // callback function executed when a message is received from the server
  function handleServerResponse()
  {
    // move forward only if the transaction has completed
    if (xmlHttp.readyState == 4)
    {
      // status of 200 indicates the transaction completed successfully
      if (xmlHttp.status == 200)
      {
        xmlResponse = xmlHttp.responseXML;
        xmlDocumentElement = xmlResponse.documentElement;
        helloMessage = xmlDocumentElement.firstChild.data;

        // display the data received from the server
        document.getElementById("divMessage").innerHTML =
                  '<i>' + helloMessage+ '</i>';
      }
    }
  }

そしてquickstart.php

<?php
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
echo '<response>';
$name = $_GET['name'];

// generate output depending on the user name received from client
$userNames = array('YODA', 'AUDRA', 'BOGDAN', 'CRISTIAN');
if (in_array(strtoupper($name), $userNames))
  echo 'Hello, master ' . htmlentities($name) . '!';
else if (trim($name) == '')
  echo 'Stranger, please tell me your name!';
else
  echo htmlentities($name) . ', I don't know you!';

echo '</response>';
?>
4

1 に答える 1

0

シャットダウンしてこれを再度実行しようとすることで答えが見つかりました。コメントアウトしたものの、handleServerResponse() から 1 秒ごとに「プロセス」を呼び出す追加のコードがキャッシュされていたことが判明しました。

// display the data received from the server
    document.getElementById("divMessage").innerHTML =
              '<i>' + helloMessage+ '</i>';
    setTimeout('process()', 1000);

申し訳ありません。レッスンは、各コード変更をテストする前にブラウザのキャッシュをクリアすることです:)したがって、この関数が他の場所から呼び出されているかどうかを確認するというアドバイスは正しいと思います。とにかく、これを理解しようとしている間、私は多くのことを読み、多くのことを学びました. どうもありがとう@pst!

于 2012-08-16T15:09:23.957 に答える