如何停止预加载?

Posted

技术标签:

【中文标题】如何停止预加载?【英文标题】:How can i stop preloading? 【发布时间】:2012-01-24 18:57:51 【问题描述】:

我正在使用下面的函数在我的 ajax 页面上预加载图像。我的页面包含图片库。但是当我单击另一个画廊链接时,我需要停止预加载当前画廊。有什么帮助吗?谢谢...

已经解决了...这是带有示例的工作代码...

<html>
<head>
<script type="text/javascript">

(function($) 
    imgList = [];
    $.extend(
        preload: function(imgArr, option) 
            var setting = $.extend(
            init: function(loaded, total) ,
            loaded: function(img, loaded, total) ,
            loaded_all: function(loaded, total) ,
            cancel: function() 
        , option);
            setting.cancel(imgList);
            var total = imgArr.length;
            var loaded = 0;
            setting.init(0, total);
            for(var i in imgArr) 
                imgList.push($("<img />")
                .attr("src", imgArr[i])
                .load(function() 
                    var loadedImg=$("img[src='"+$(this).attr("src")+"']");
                    if(loadedImg.attr("width")==undefined)
                        $("img[src='"+$(this).attr("src")+"']").attr(
                          width: this.width,
                          height: this.height
                        );
                    ;
                    loaded++;
                    setting.loaded(this, loaded, total);
                    if(loaded == total) 
                        setting.loaded_all(loaded, total);
                        imgList = [];
                    ;
                )
            );
        
        
    );
)(jQuery);    

function preload(arr,preloaderFunc,preloaderCompleteFunc)
    $.preload(arr, 
        init: function(loaded, total) 
            var percent=(100/total)*loaded;
            eval(preloaderFunc+"("+percent+")");
        ,
        loaded: function(img, loaded, total) 
            var percent=(100/total)*loaded;
            eval(preloaderFunc+"("+percent+")");
        ,
        loaded_all: function(loaded, total) 
           eval(preloaderCompleteFunc+"()")
        ,
        cancel: function(imgList) 
            if(imgList.length>0) 
                for(var i in imgList) 
                    console.log("remove:"+imgList[i])
                       imgList[i].unbind("load").remove();
                
                imgList  = [];
            ;
        
    ); 
;

function preloader(percent)
   $(".loaderBar").stop().animate( "width" : percent+"%" , 500)
;

function initPreloadImgs()
    if($('.preloadImgs').length != 0) 
       $('.preloadImgs').not(".preloadImgs-ok").each(function(index) 
            $(this).addClass("preloadImgs-ok");
            var preloaderFunc=hasClassVal($(this),"preloaderFunc:");
            var preloaderCompleteFunc=hasClassVal($(this),"preloaderCompleteFunc:");
            clearClass($(this),"preloaderFunc:");
            clearClass($(this),"preloaderCompleteFunc:");
            var preloadThem=[];
            $('.preloadImgs').find("img").each(function()
                preloadThem.push($(this).attr("src"));
            );
            if(preloadThem.length==0)
                eval(preloaderCompleteFunc+"()");
            else
                preload(preloadThem,preloaderFunc,preloaderCompleteFunc);
            ;
       );
    ;
;

function preloaded()
   $(".main").fadeIn(1000);
;

function hasClassVal(obj,val)
     var classes=$(obj).attr("class")!=undefined?$(obj).attr("class").split(" "):"";
     var valLength=val.length;
     var getVal=""
     for(var i in classes) 
         var optz=classes[i];
         if(optz.length>valLength)        
           if(optz.substr(0,valLength) == val)
               getVal = optz.substr(valLength);
               break;
           ;
         ;
     ;
     return getVal;
;

</script>
</head>
<body>
   <div class="loader"><div class="loaderBar"></div></div>
   <div class="main preloadImgs preloaderFunc:preloader preloaderCompleteFunc:preloaded" style="display:none;">
      <img src="assets/001.jpg"/>
      <img src="assets/002.jpg"/>
      <img src="assets/003.jpg"/>
   </div>
</body>
</html>

【问题讨论】:

【参考方案1】:

您所能做的就是释放现有的图像参考。是否丢弃正在进行的图像请求将取决于浏览器的内部实现。清除事件处理程序至少会阻止您在加载图像时对其进行处理。您可以通过向对象添加cancel() 方法来清除所有引用,如下所示:

cancel: function() 
    for (var i = 0; i < imgList.length; i++) 
        // clean up any jQuery data and event handlers associated with this object
        imgList[i].remove();
    
    // clear out the imgList so all former array elements can be garbage collected
    imgList = [];

【讨论】:

我很确定您不必执行.unbind()。致电.remove() 应该会为您解决这个问题。 另外,你真的不应该在数组上使用for (var i in imgList) 形式。它迭代了一个对象的所有属性,它可以包括除了数组元素之外的东西。应该使用直接数组索引来迭代数组,以仅使用for (var i = 0; i &lt; array.length; i++) 或更新的.foreach() 获取数组值。【参考方案2】:

如果将加载器放在一个类中,则可以在单击链接时创建一个加载器。任何以前的加载器都可以获得一个告诉它停止加载的属性。

类似这样的:

function Loader(gallery)

  this.terminated = false;

  this.load = function()
  
    // Loading code.
    for (loop condition)
    
      // break if this.terminated becomes true.
    
  


var loader = null;
function preloadGallery(gallery)

  // Tell the previous one to stop.
  if (loader !== null)
    loader.terminated = true;
  // Start the new one.
  loader = new Loader(gallery);

顺便说一句,在我看来,您使用的预加载技术与通常不同。看看this page。

【讨论】:

以上是关于如何停止预加载?的主要内容,如果未能解决你的问题,请参考以下文章

Spotify API,预加载封面艺术

用于预加载整个流的 Html 音频标签

javascript中的HTML5视频完整预加载

nuxt 如何预加载大图片

IE 不支持 as3 预加载器操作

如何知道在右舷层的钴上完成了预加载?