1

很抱歉这个新手问题,刚开始学习AJAX。

我想了解以下究竟是什么导致 divMessage 内容在“myName”文本更改时不断变化。

1)似乎Javascript函数进程一直在“监听”,这是正常的Javscript行为,还是有任何触发器重复调用“进程”?2)我们分配给“body onload”的任何功能是否会重复执行?这种重复执行的频率是多少?3)如果我们想要单次执行函数流程,该怎么做?

4)我很困惑,因为我认为身体只会加载一次。但是否因为在“body onload”之后调用了函数“process”,而函数 process 又通过更改 divMessage 来修改“body”,本质上让它再次通过“body onload”,然后再次“process”, ETC.. ?

非常感谢您的帮助!

<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

通过关闭并尝试再次运行它找到了答案。事实证明,我注释掉了额外的代码,但被缓存了,每 1 秒从 handleServerResponse() 调用“进程”:

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

对于那个很抱歉。教训是在测试每个代码更改之前清除浏览器缓存:) 所以我想检查这个函数是否从任何其他地方调用的建议是正确的。无论如何,我读了很多书,并在试图弄清楚这一点时学到了很多东西。非常感谢@pst!

于 2012-08-16T15:09:23.957 回答