2014-03-24 23 views
0

您好,我必须执行像ajax正在进行时,然后不允许用户执行页面刷新的执行。jQuery Ajax,当Ajax正在进行时,防止刷新按钮

这里是代码我有

$('#submit').click(function() { 
     $(function() { 
     $(".col1").mask("Generating csv...."); //This will generate a mark, Here i would like to prevent the user from doing any sort of operation. 
     var to = $('#filters_date_to').val(); 
     var from = $('#filters_date_from').val(); 
     $.ajax({ 
      url:"../dailyTrade/createCsv?filters[date][to]="+to+"&filters[date][from]="+from,success:function(result){ 
       if(result) { 
        $(".col1").unmask(); //Here we can unlock the user from using the refresh button. 
        window.location = '../dailyTrade/forceDownload?file='+result; 
        setTimeout('location.reload(true);',5000); 
       } 
      } 
      }); 

     }); 
    }); 

任何建议。

+0

如果你指的是浏览器的“刷新”按钮,那么你**不应该**做到这一点。 – Praveen

+0

可能的共享:http:// stackoverflow。com/questions/11094887 /防止用户重新加载页面使用jQuery的或JavaScript,http://stackoverflow.com/questions/3527041/prevent-any-form-of-page-refresh-using- jQuery的 - JavaScript的 –

回答

0

我怀疑你是否应该那样做。

$(window).bind('beforeunload',function(){ 
    return 'are you sure you want to leave?';  
}); 

如果你在谈论你的网页上刷新“HTML按钮”,可以很容易地完成。就在您进行ajax调用之前,请禁用刷新按钮,然后启用ajax调用的成功/错误功能。

禁用按钮

$("#refreshBtn").attr("disabled", "disabled"); 

启用按钮

$("#refreshBtn").removeAttr("disabled"); 
+0

当你开始输入新的问题时重新加载页面SO功能呢?然后,如果你确定,你会得到提示。如果不是,则不会发生重新加载。所以也许有办法强制不重新加载。 – szpic

+0

你可以使用'beforeunload'事件来做到这一点。 – Yasser

+0

我使用了$(window).bind,这样我就可以在ajax请求完成后解除绑定,谢谢Yasser –

2

你可以做的最好的是使用onbeforeunload有消息说,一个请求正在进行,并要求他们,如果他们一定要呈现给用户他们想继续。

例如

var req; 

window.onbeforeunload = function() { 
if(req) { 
    return 'Request in progress....are you sure you want to continue?'; 
} 
}; 


//at some point in your code 
req = //your request... 

您不能以任何方式阻止用户使用JS或其他任何方式离开您的页面。

+0

+1正确的方式来处理这种情况:) – Praveen

+0

是的,但用户仍然可以执行页面刷新。 – DRAX

+0

@DRAX - 的确如此,但绝对没有办法阻止它们,就像没有什么可以阻止它们关闭浏览器或按计算机上的电源按钮一样。 – Adam

0

你不能通过插入JavaScript代码来做到这一点。

只有我能想到的方法是:

  1. 使用同步Ajax调用,在这样的浏览器应冻结(但是它会通知脚本花费太长时间来处理和用户将能够阻止用户执行)
  2. 写的浏览器插件,将修改浏览器的行为(例如,防止为您预先设定的网址耳目一新页)

两种方式都是丑陋,我不建议这样做。


,因此它可以恢复执行,如果页面已经被刷新(使用HTML5的localStorage)你应该修改你的脚本。

http://www.w3schools.com/html/html5_webstorage.asp


在你的情况,我会把在localStorage的简单状态(布尔)检查做了ajax调用发生与否。如果确实发生了,那么只需再次调用相同的URL即可获得文件名。但是在服务器端(如果你还没有做过),你应该实现缓存,所以当两次调用同一个url时,你不需要创建两个单独的文件,它可以是同一个文件(服务器在硬件上要轻得多资源)。

+1

应该注意的是,同步ajax调用不会停止Chrome浏览。它不会像FF那样处理它 –