熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

js圖片延遲加載的實現方法及思路

2013-11-15 12:10:19  來源: JSP教程 
這裡延遲加載的意思是拖動滾動條時在圖片出現在浏覽器顯示區域後才加載顯示  

  大概的實現方式是
在頁面的load沒有觸發之前把所有的指定id的元素內的img放入到imgs中將所有的圖片的src值放入到一個新建的_src屬性中把src設置為指定的顯示圖片
然後在documentbody的scroll事件觸發時循環計算imgs中的img元素位置是否正好在浏覽器顯示框范圍內如果是則將img元素的_src屬性的值賦給src這樣圖片就能顯示出來
這 裡比較麻煩地方是如何計算img的位置獲得元素的相對於頁面的絕對位置通常是用offsetLeft和offsetTop但這兩個屬性是元素的 offsetParent指向的元素的相對位置 如果offsetParent所指的元素是設置了浮動的或使用絕對定位那麼offsetLeft來獲得絕對位置就不正確呢
在這裡我是將元素的所有父級元素的offsetTop之和來獲得文檔絕對位置的

復制代碼 代碼如下:
//取元素的頁面絕對 X位置
        var getLeft = function(El){
            var left = ;
            do{
                left += EloffsetLeft;
            }while((El = EloffsetParent)nodeName != BODY);
            return left;
        };
        //取元素的頁面絕對 Y位置
        var getTop = function(El){
            var top = ;
            do{
                top += EloffsetTop;
            }while((El = EloffsetParent)nodeName != BODY);
            return top;
        };

  
在設置窗口的scroll事件時ie使用是documentdocumentElement而其他的浏覽器都使用document
 接下來是要獲得浏覽器顯示窗口現對於文檔的位置用了下面的代碼來計算

復制代碼 代碼如下:
//讀取滾動條的位置和浏覽器窗口的顯示大小
             var top = isGoo ? documentbodyscrollTop : documentdocumentElementscrollTop
                 left = isGoo ? documentbodyscrollLeft :documentdocumentElementscrollLeft
                 width = documentdocumentElementclientWidth
                 height = documentdocumentElementclientHeight;

  
谷歌浏覽器要通過body來獲得scrollTop而其他浏覽器通過documentElement
 最後迭代判斷img的位置並顯示圖片

復制代碼 代碼如下:
//對所有圖片進行批量判斷是否在浏覽器顯示區域內
            for(var i= ; i < imgslength; i++){
                var _top = getTop(imgs[i])_left = getLeft(imgs[i]);
                //判斷圖片是否在顯示區域內
                if( _top >= top &&
                    _left >= left &&
                    _top <= top+height &&
                    _left <= left+width){
                    var _src = imgs[i]getAttribute(_src);
                    //如果圖片已經顯示則取消賦值
                    if(imgs[i]src !== _src){
                        imgs[i]src = _src;
                    }
                }
            }

  
可以運行的代碼

復制代碼 代碼如下:

  
<!DOCTYPE html PUBLIC "//WC//DTD XHTML Transitional//EN" "
<html>
<head>
<title>js圖片延遲加載</title>
</head>
<body>
<table id="out" style="height:px;">
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
</table>
<table id="out" style="width:px">
<tr>
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
</tr>
</table>
</body>
</html>
  <script type="text/javascript">
        function delayload(option){
            //讀取參數
            //圖片未加載時顯示的圖片
            var src = optionsrc ? optionsrc :
            //指定那些id下的img元素使用延遲顯示
                id = optionid ? optionid : [];
            //圖片列表
            var imgs = [];
            //獲得所有的圖片元素
            for(var i= ; i < idlength ; i++){
                var idbox = documentgetElementById(id[i])_imgs;
                if(idbox && (_imgs = idboxgetElementsByTagName(img))){
                    for(var t= ; t < _imgslength ; t++){
                        imgspush(_imgs[t]);
                    }
                }
            }
            //將所有的圖片設置為指定的loading圖片
            for(var i= ; i < imgslength ; i++){
                //圖片本來的圖片路徑放入_src中
                imgs[i]setAttribute(_srcimgs[i]src);
                imgs[i]src = src;
            }
            //取元素的頁面絕對 X位置
            var getLeft = function(El){
                var left = ;
                do{
                    left += EloffsetLeft;
                }while((El = EloffsetParent)nodeName != BODY);
                return left;
            };
            //取元素的頁面絕對 Y位置
            var getTop = function(El){
                var top = ;
                do{
                    top += EloffsetTop;
                }while((El = EloffsetParent)nodeName != BODY);
                return top;
            };
            //是否為ie並讀出ie版本
            var isIE = !!navigatoruserAgentmatch(/MSIEbs*([][]);/img);
            isIE && (isIE = RegExp$);
            //是否為chrome
            var isGoo = !!navigatoruserAgentmatch(/AppleWebKitb/img);
            //獲得可以觸發scroll事件的對象
            var box = isIE ? documentdocumentElement : document;
            //body元素的scroll事件
            var onscroll = boxonscroll = function(){
                //讀取滾動條的位置和浏覽器窗口的顯示大小
                var top = isGoo ? documentbodyscrollTop : documentdocumentElementscrollTop
                    left = isGoo ? documentbodyscrollLeft :documentdocumentElementscrollLeft
                    width = documentdocumentElementclientWidth
                    height = documentdocumentElementclientHeight;
                //對所有圖片進行批量判斷是否在浏覽器顯示區域內
                for(var i= ; i < imgslength; i++){
                    var _top = getTop(imgs[i])_left = getLeft(imgs[i]);
                    //判斷圖片是否在顯示區域內
                    if( _top >= top &&
                        _left >= left &&
                        _top <= top+height &&
                        _left <= left+width){
                        var _src = imgs[i]getAttribute(_src);
                        //如果圖片已經顯示則取消賦值
                        if(imgs[i]src !== _src){
                            imgs[i]src = _src;
                        }
                    }
                }
            };
            var load = new Image();
            loadsrc = src;
            loadonload = function(){
                onscroll();
            };
        }
        delayload({id:[outout]src:});
      </script>


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20432.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.