-2

为了实现 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 中没有显示。

请帮我。

4

2 回答 2

1

ajaxForm插件使用 Iframe 而非 ajax 进行文件上传。
所以使用异步参数是没用的

于 2013-10-11T09:12:29.187 回答
0

使用 asynchronous: false确实会锁定 IE(和其他一些浏览器)中的 UI。在这种情况下,即使您已经告诉它显示图像,它也可能没有时间在 UI 锁定之前实际执行该操作(浏览器通常将这些事情排队),因为同步调用。

最好的答案可能是不使用同步调用,而是使用 iframe shim 或其他东西来使页面上的所有内容在调用过程中都无法点击。同步调用会锁定 该 IE 进程中与 UI 相关的所有内容,而不仅仅是您的页面,而 iframe shim 只会使您的页面无法点击(并为您提供显示内容有点暗淡或其他内容的机会)。这也很容易。

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)
于 2013-10-11T09:33:02.677 回答