使用jQuery .load()预加载页面?

时间:2011-07-28 02:47:48

标签: javascript jquery

我有一个页面,其中有一些弹出窗口显示页面上每个项目的详细信息。当用户单击按钮时,将显示弹出窗口(这是一个jQuery对话框)。对话框的html是从另一个页面/网址中提取的。我使用jQuery的.load()方法。第一次将页面加载到对话框中时,浏览器需要几秒钟,这是我老板不想要的。

我试图异步预加载这些页面,但我无法让它工作。页面被阻止,直到所有加载发生。我尝试了三种不同的方式:

//1
$('.transactions-preloader').each(
    function(index, Element){
    var id = Element.id.replace('details-dialog', '');
        $(this).load( "/" + id + "/1/" + period + ".html" );
    }
);

//2
$('.transactions-preloader').each(
    function(index, Element){
        var id = Element.id.replace('details-dialog', '');
        $.ajax({
              url: "/" + id + "/1/" + period + ".html",
              async: true,
              cache: false,
              success: function(html){
                  $("#"+Element.id).html(html);
              }
             });
    }
);

//3
$('.transactions-preloader').each(
    function(index, Element){
        var id = Element.id.replace('details-dialog', '');
        $.get( "/" + id + "/1/" + period + ".html", function(data) {
            $("#"+Element.id).html(data);
        });
    }
);

这三种方法都可以正常工作,除非它们在负载发生时都会阻塞页面。

关于如何进行异步预加载的任何想法?

3 个答案:

答案 0 :(得分:0)

试试这个不会挂起浏览器。

$('.transactions-preloader').each(
    function(index, Element){
    setTimeout(function(){
      var id = Element.id.replace('details-dialog', '');
          $(this).load( "/" + id + "/1/" + period + ".html" );
      }
   }, 10);
);

答案 1 :(得分:0)

如果您知道文件的路径,那么经典的预加载器脚本可能很有用:

var loadImages = (function() {
  var imageArray = [];

  // imagePaths is an array of image paths
  return function(imagePaths) {
    var i = imagePaths.length;
    var image;

    while (i--) {
      image = new Image();
      image.src = imagePaths[i];
      imageArray.push(image);
    }
  }
}());

每当您加载页面的新部分时,将数组中的图像路径传递给该函数。你可以每次都清理imageArray,一旦加载了图像,它们就不需要留在数组中,但是它们必须挂起足够长的时间来加载。

答案 2 :(得分:0)

$(window).load(function() {
    // preloading code
    })

这将在您的页面(包括所有帧,图像等)加载后调用预加载。

请注意,这是jquery load event handler,而不是load function