在我的 Ajax 代码的 onreadystatechange 内联函数中,我调用 window.location 并将 GET 参数传递给新网页。
由于某种原因,该新页面上的 php 代码快速连续执行两次。我不认为这是正确的行为。
这是 javascript 中的 Ajax 代码:
// this is called from the 'onclick()' handler of a normal (non-'submit') button
function findUserData()
{
var user = document.getElementById('zer').value;
var pwd = document.getElementById('pwd').value;
var xmlhttp;
if(window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
else
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
var theResponseText = "rText";
xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
theResponseText = xmlhttp.responseText;
alert("responseText is >>>" + theResponseText + "<<< that.");
if( theResponseText == 'notfound')
{
alert("No data found with that user name/password.")
//return;
}
else if( theResponseText == 'found')
{
alert("Data was found with that user name/password.")
window.location = "postData.php?datapull=1";
//return;
}
}
else // EDIT -- ADDED THIS TO CHECK FOR OTHER (readyState, status) PAIRS
{
alert("the readyState is: " + xmlhttp.readyState
+ " and the status is: " + xmlhttp.status);
}
}
var ajaxText = "checkForData.php?zer=" + user + "&pwd=" + pwd;
xmlhttp.open("GET", ajaxText, true);
xmlhttp.send();
}
(php 文件“checkForData.php”只是在数据库中查找用户名/密码组合(“zer”和“pwd”)以查看该用户/密码在数据库中是否有任何记录,如果有则返回“找到”记录。在我对这段代码的测试中,我输入了一个有效的用户用户/密码组合,并且 checkForData.php 代码成功返回“找到”作为响应文本。)
这是 postData.php:
<?php
if(isset($_GET['datapull']))
{
echo '<script type="text/javascript">'
. 'alert("We just got a redirect form the Ajax code")</script>';
$datapull = $_GET['datapull'];
if($datapull == 1)
{
echo '<script type="text/javascript">'
. 'alert("about to pull data")</script>';
}
}
?>
我知道 onreadystatechange 内联函数没有执行两次,因为当内联函数执行时我有一个 alert() 框(见上文),并且该警报框只出现一次并报告 “使用该用户名/密码找到数据。 "
我看到的输出是:
0) 我得到一个 alert() 框,上面写着“responseText is >>>found<<< that”。 然后我得到一个 alert() 框,上面写着“使用该用户名/密码找到数据”。
1) 我收到一个 alert() 框,上面写着“我们刚刚从 Ajax 代码中获得了重定向”
2) 然后我看到一个 alert() 框,上面写着“即将提取数据”
3)然后我得到第二个警告框,上面写着“我们刚刚从 Ajax 代码中获得了重定向”
4)接下来,另一个警告框,上面写着“即将提取数据”
有什么我可以改变的,使 window.location() 导致我的 postData.php 代码只执行一次?为什么 postData.php 页面加载两次?