onreadystatechange导致php代码执行两次

时间:2013-08-10 05:09:32

标签: php javascript ajax window.location onreadystatechange

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

3 个答案:

答案 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
}

不能说其他涟漪效应,但它对我有用。