在我的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'),看看该用户/密码是否在数据库中有任何记录并返回 “找到”如果他们有记录。在我对此代码的测试中,我输入了一个有效的用户user / pwd组合,checkForData.php代码成功返回'found'作为responseText 。)
这是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>';
}
}
&GT;
我知道onreadystatechange内联函数不执行两次,因为我在内联函数执行时有一个alert()框(见上文),并且该警报框只出现一次并报告< strong>“使用该用户名/密码找到数据。”
我看到的输出是:
0)我收到一个alert()框,上面写着“responseText&gt;&gt;&gt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 然后我收到一个警告()框,上面写着“使用该用户名/密码找到数据。”
1)我收到一个alert()框,上面写着“我们刚刚从Ajax代码中获得了重定向”
2)然后我看到一个alert()框,上面写着“即将提取数据”
3)然后我得到第二个警告框,上面写着“我们刚刚从Ajax代码中获得了重定向”
4)接下来,另一个警告框显示“即将提取数据”
有什么我可以改变来使window.location()导致我的postData.php代码只执行一次?为什么postData.php页面会加载两次?
答案 0 :(得分:1)
在if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
语句中尝试使用else来查看ajax调用是否在readystate之前进入另一个状态4.也许只需将alert(xmlhttp.readyState);
放入else中,看看会发生什么。
答案 1 :(得分:0)
我没有找到双触发的原因,更方便的是恢复到前一天的代码快照并且非常逐步地重新编码工作,并且我不再获得双重加载症状。我对我添加的功能采取了不同的方法,并以某种方式绕过了导致双重帖子的任何内容。我目前没有时间弄清楚是什么原因导致了双重帖子,但稍后会对文件进行区分。
答案 2 :(得分:0)
在使用我的一个Apache Cordova项目时,我也遇到了同样的问题。不幸的是,我仍然不明白为什么代码执行两次,但在200状态后清除你的div对我的情况有帮助。
以下是示例:
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
$('#divId').empty(); //Clear the div
// Now start your code
}
不能说其他涟漪效应,但它对我有用。