JavaScript for循环使UI无响应

时间:2010-09-03 08:50:46

标签: javascript jquery for-loop

我正在创建一个邮件列表脚本,利用ajax(async = false)以块的形式发送电子邮件。

基本上这个循环是这样的:

var i = 0;
for(i;i<num_rows;i=i+mxt){
    if($("#panic").val()=='1'){
        break;
    }
    perc = (i*100)/num_rows;
    startThread(i,perc);
}

Tha panic值是由一个按钮设置的,问题是在循环期间(有效)我​​无法与页面交互。

我做错了什么?

谢谢

修改

function startThread(i,perc){
l_a = i;
l_b = mxt;

headers = '&mail_from='+mail_from+'&mail_from_name='+mail_from_name+'&mail_subject='+mail_subject;

$.ajax({  
    type: "POST", url: "ajax/thread.php", data: "l_a="+l_a+"&l_b="+l_b+headers, 
    success: function(html){ $("#progressbar").progressbar({value: perc}); },
    async: false
 });
}

1 个答案:

答案 0 :(得分:4)

您的startThread()函数名称具有误导性,因为Web浏览器中的JavaScript不仅包含单线程,而且与页面呈现共享相同的线程。

由于您正在使用async=false$.ajax调用将成为阻止函数,这将阻止页面呈现线程,从而使UI无响应。

引用jQuery documentation(强调添加):

  

<强>异步

     

默认值:true

     

默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。 请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。

可能的解决方案:

  • 在一个JSON对象中捎带您的数据,并只发送一个$.ajax请求。如果可能,请使用async=true