要实现ajax文件上传,我使用以下代码,这在Firefox中工作正常,但在IE中失败。我需要同步操作;为此我用过:
$.ajaxSetup({ async: false });
//file upload code in ajax call
for ( i = 0; i < fileCnt; i++ ) {
if ( $('#addFile' + i ).length > 0 ) {
$.ajaxSetup({ async: false });
$('#addFile'+i).ajaxForm( options );
$('#addFile'+i).submit();
console.log( files );
}
}
使用setTimeout修改代码
for(i=0;i<fileCnt;i++){
if ($('#addFile'+i).length > 0) {
$('#addFile'+i).ajaxForm(options);
$('#addFile'+i).submit();
window.setTimeout($('#addFile'+(i+1)).bind($('#addFile'+(i+1))), 0.1);
console.log(files);
}
}
我的控制台在Firefox中显示文件信息,但未在IE中显示。
请帮帮我。
答案 0 :(得分:1)
ajaxForm 插件使用Iframe而不是ajax进行文件上传 所以使用async参数是没用的
答案 1 :(得分:0)
使用asynchronous:false 确实锁定了IE中的UI(还有一些 其它浏览器)。在这种情况下,即使你告诉它显示 图片,它可能没有时间实际这样做(浏览器 通常在UI锁定之前排队这些东西)因为 同步通话。
最好的答案可能不是使用同步呼叫,而是使用同步呼叫 使用iframe垫片或其他东西来制作页面上的所有内容 呼叫正在进行时无法点击。同步调用锁定 所有与IE相关的IE流程,而不仅仅是您的页面, 而iframe垫片只会使你的页面不可点击(并提供 你有机会展示一些有点暗淡的东西。 这也很容易。
setTimeout call (directly, or via one of Prototype's useful wrappers
like Function#defer and Function#delay; Function#defer is just
Function#delay with a 0.1 delay time)