我在做一个上传文件的时候有这样的一个功能:在页面上是原始的form表单上传,点击浏览按钮选择文件后,点击提交按钮,就会执行$("form").submit(),在这个函数中先显示一个lightbox提示框,这个提示框由几张背景图片构成,是在css 的background属性中设置的,弹出提示框后,return true,页面就开始上传文件。但是存在下面的问题:点击弹出框的时候,由于这个弹出框是lightbox的插件,背景包含3张图片,假设为a.png, b.png, c.png。那么浏览器会发出三个get请求去服务器下载这三张图片
get a.png
get b.png
get c.png
同时jquery.submit返回true,开始上传文件,发的是post 请求。
web会处理这三个请求,正确的顺序就是先收到a.png, b.png,c.png,post。
但是在火狐下,会出现收到a.png, post,b.png, c.png,在处理a.png后,就处理post请求了,没有处理到b.png,c.png,导致弹出窗口显示不完整。
大概代码结果如下:
原有代码:
$("form").submit(function(){
    showLightbox();  // 这里会发起get请求去下载a.png, b.png, c.png
    return true;
})
修改代码:
$("form").submit(function(){
    showLightbox();  // 这里会发起get请求去下载a.png, b.png, c.png
    for(var i=0; i < 99999999; i++){;}   // 模拟sleep操作,先保证a.png,b.png,c.png的请求能被web处理。
    return true;  // 最后返回,让浏览器去上传文件
})
修改后在Firefox下没有问题的,但是这种方式在IE8下直接弹出那个影响性能的提示框了。
请问有人有解决方式没?

解决方案 »

  1.   

    如果这3个图片是固定的话,那么就先加载下来,然后弹出你的提示框。如果3个图片是随机的图片,那么当你点击submit按钮的时候先弹出框来(showLightbox();),然后在这个窗体里的图片的onload事件里判断是否所有的onload已经加载完了加载完的话就提交你的表单(也就是这个时候才submit);如果判断3个图片都加载完了,你可以再showLightbox函数内部设置一个变量表示需要加载的图片比如i=3
    然后你3个图片的onload事件都指向一个函数比如 bvar b =function(){
       i--;
    if(i==0)
    {
    submit
    }
    }
      

  2.   

    这个我尝试在html代码里先link了,所以缓存是有的,但是因为css里设置了background属性,所以仍然会去请求,此时web回复http304,那么浏览器才会使用缓存里的图片。关键问题是那三张图片的请求与post请求顺序错乱了,在post先发出来后,就阻塞住了,get请求都处理不了。所以lightbox的背景图片就没显示出来。
      

  3.   


    同上。已经有缓存了,但是一样会发请求,只有发出请求了,webserver回复http 304,浏览器才会使用缓存的图片。但是如果能强制让浏览器使用缓存,连get请求都不发出来的话,应该能解决问题。