我正在创建一个邮件列表脚本,利用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
});
}
答案 0 :(得分:4)
您的startThread()
函数名称具有误导性,因为Web浏览器中的JavaScript不仅包含单线程,而且与页面呈现共享相同的线程。
由于您正在使用async=false
,$.ajax
调用将成为阻止函数,这将阻止页面呈现线程,从而使UI无响应。
引用jQuery documentation(强调添加):
<强>异步强>
默认值:true
默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。 请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。
可能的解决方案:
$.ajax
请求。如果可能,请使用async=true
。