我的用户报告的意外JavaScript操作

时间:2009-03-07 20:39:54

标签: javascript browser

我的用户一直在抱怨他们没有显示链接。对我来说,我已经在几个浏览器上对它进行了测试,它对我有用。

应该发生的是一个进程是通过AJAX使用JQuery启动的,一旦完成,我会继续通过AJAX检查服务器已经完成了多少进程以及进程完成后我给他们看了一个链接。但是很多用户告诉我,它会向他们显示链接,并且会很快消失,显示为100.0%

我看不出我是如何解决这个问题的,我希望你们能帮助我写一些傻瓜证明,以便始终显示链接!

以下是相关代码(已缩短)。

var startTime;
var continueTime;
var done = false;
function convertNow(validURL){
       startTime = setTimeout('getStatus();', 6000); 
       $.ajax({
       type: "GET",
       url: "main.php",
       data: 'url=' + validURL + '&filename=' + fileNameTxt,
       success: function(msg){
      done = true;     
      $("#loading").hide("slow");
      $("#done").html("LINK SHOWN HERE");   
       }//function

     });//ajax

}//function convertNow
function getStatus()
{       
        if(done==false){            
        $.ajax({
        type: "POST",
        url: "fileReader.php",
        data: 'textFile=' + fileNameTxt,
        success: function(respomse){
        textFileResponse = respomse.split(" ");
        $("#done").html("PROGRESS SHOWN HERE IN PERCENTAGES");
        }
        });//ajax
        continueTime = setTimeout('getStatus();', 3000); 
        }
}

全部谢谢

P.S。我之前有这个问题,并且给出了在函数中使用条件的想法,但是当它应该具有!!时无效!

更新

我的一些用户使用的是他们正在使用的操作系统和浏览器,他们通常会说Mac OS和Firefox或Safari。不确定该解决方案是否有帮助。

2 个答案:

答案 0 :(得分:1)

用户描述的行为表明success函数的getStatus回调是在convertNow之后调用的。您应该在此回调中测试done变量

function getStatus(){
    if(done==false){
        $.ajax({
            type: "POST",
            url: "fileReader.php",
            data: 'textFile=' + fileNameTxt,
            success: function(respomse){
                // FIX : Already done, just ignore this callback
                if (done) return;

                textFileResponse = respomse.split(" ");
                $("#done").html("PROGRESS SHOWN HERE IN PERCENTAGES");

                // BONUS : call getStatus only when previous ajax call is finished
                continueTime = setTimeout('getStatus();', 3000);
            }
        });//ajax
    }
}

编辑:此解决方案应该可以防止错误在大多数时间出现,但仍有机会。唯一可以确定的方法是从convertNow中删除回调,并让getStatus中的回调在处理完成时设置链接(不要忘记只允许一次调用getStatus一次,请参见上面的“BONUS”修改。

答案 1 :(得分:0)

如果永远不会将done设置回false,那么在第二次调用convertNow时就会出现报告的行为。

由于convertNow中的ajax调用使用GET而不是POST,因此只要参数与之前的调用相同,浏览器就可能返回缓存结果。