0

在我的 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 页面加载两次?

4

3 回答 3

1

为语句尝试一个 elseif(xmlhttp.readyState == 4 && xmlhttp.status == 200)以查看在 readystate 4 之前 ajax 调用是否进入另一个状态。也许只需放入alert(xmlhttp.readyState);else 看看会发生什么。

于 2013-08-10T06:33:05.013 回答
0

我没有找到双重触发的原因,恢复到前一天的代码快照并非常增量地重新编码工作更为方便,并且我不再出现双重加载症状。我对我添加的功能采取了不同的方法,并以某种方式绕过了导致双重发布的任何原因。我目前没有时间找出导致双重发布的原因,但稍后会比较文件。

于 2013-08-11T05:13:16.987 回答
0

在使用我的一个 Apache Cordova 项目时,我也面临同样的问题。不幸的是,我仍然不明白为什么代码会执行两次,但是在 200 状态之后清除你的 div 对我的情况有帮助。

这是示例:

if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
     $('#divId').empty();   //Clear the div
     // Now start your code
}

不能说其他连锁反应,但它对我有用。

于 2016-12-13T06:13:09.463 回答