当前位置: 代码迷 >> JavaScript >> js兑现网页图片延时加载的原理和代码
  详细解决方案

js兑现网页图片延时加载的原理和代码

热度:191   发布时间:2012-10-29 10:03:53.0
js实现网页图片延时加载的原理和代码

?

大家如果使用firebug去查看的话就会发现,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页

?

?

大家如果使用firebug去查看的话就会发现,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对于比较长的页面来说,这个方案是比较好的。
实现原理
把所有需要延时加载的图片改成如下的格式:

  1. < img ? lazy_src = "图片路径" ? border = "0" /> ?

?

?

然后在页面加载时,把所有使用了lazy_src的图片都保存到数组里,然后在滚动时计算可视区域的top,然后把延时加载的图片中top小于当前可视区域(即图片出现在可视区域内)的图片的src的值用lazy_src的来替换(加载图片)
代码

?

?

  1. lazyLoad=( function ()?{? ?
  2. var ?map_element?=?{};? ?
  3. var ?element_obj?=?[];? ?
  4. var ?download_count?=?0;? ?
  5. var ?last_offset?=?-1;? ?
  6. var ?doc_body;? ?
  7. var ?doc_element;? ?
  8. var ?lazy_load_tag;? ?
  9. function ?initVar(tags)?{? ?
  10. doc_body?=?document.body;? ?
  11. doc_element?=?document.compatMode?==? 'BackCompat' ???doc_body:?document.documentElement;? ?
  12. lazy_load_tag?=?tags?||?[ "img" ,? "iframe" ];? ?
  13. }; ?
  14. ?
  15. ? ?
  16. function ?initElementMap()?{? ?
  17. var ?all_element?=?[];? ?
  18. //从所有相关元素中找出需要延时加载的元素? ?
  19. for ?( var ?i?=?0,? ?
  20. len?=?lazy_load_tag.length;?i?<?len;?i++)?{? ?
  21. var ?el?=?document.getElementsByTagName(lazy_load_tag[i]);? ?
  22. for ?( var ?j?=?0,? ?
  23. len2?=?el.length;?j?<?len2;?j++)?{? ?
  24. if ?( typeof (el[j])?==? "object" ?&&?el[j].getAttribute( "lazy_src" ))?{? ?
  25. element_obj.push(all_element[key]);? ?
  26. }? ?
  27. }? ?
  28. }? ?
  29. ? ?
  30. for ?( var ?i?=?0,? ?
  31. len?=?element_obj.length;?i?<?len;?i++)?{? ?
  32. var ?o_img?=?element_obj[i];? ?
  33. var ?t_index?=?getAbsoluteTop(o_img); ?
  34. //得到图片相对document的距上距离? ?
  35. if ?(map_element[t_index])?{? ?
  36. map_element[t_index].push(i);? ?
  37. }? else ?{? ?
  38. //按距上距离保存一个队列? ?
  39. var ?t_array?=?[];? ?
  40. t_array[0]?=?i;? ?
  41. map_element[t_index]?=?t_array;? ?
  42. download_count++; //需要延时加载的图片数量? ?
  43. }? ?
  44. }? ?
  45. ? ?
  46. };? ?
  47. function ?initDownloadListen()?{? ?
  48. if ?(!download_count)? return ;? ?
  49. var ?offset?=?(window.MessageEvent?&&?!document.getBoxObjectFor)???doc_body.scrollTop:?doc_element.scrollTop;? ?
  50. //可视化区域的offtset=document的高+? ?
  51. var ?visio_offset?=?offset?+?doc_element.clientHeight;? ?
  52. if ?(last_offset?==?visio_offset)?{? ?
  53. setTimeout(initDownloadListen,?200);? ?
  54. return ;? ?
  55. }? ?
  56. last_offset?=?visio_offset;? ?
  57. var ?visio_height?=?doc_element.clientHeight;? ?
  58. var ?img_show_height?=?visio_height?+?offset;? ?
  59. for ?( var ?key? in ?map_element)?{? ?
  60. if ?(img_show_height?>?key)?{? ?
  61. var ?t_o?=?map_element[key];? ?
  62. var ?img_vl?=?t_o.length;? ?
  63. for ?( var ?l?=?0;?l?<?img_vl;?l++)?{? ?
  64. element_obj[t_o[l]].src?=?element_obj[t_o[l]].getAttribute( "lazy_src" );? ?
  65. }? ?
  66. delete ?map_element[key];? ?
  67. download_count--;? ?
  68. }? ?
  69. }? ?
  70. setTimeout(initDownloadListen,?200);? ?
  71. };? ?
  72. function ?getAbsoluteTop(element)?{? ?
  73. if ?(arguments.length?!=?1?||?element?==? null )?{? ?
  74. return ? null ;? ?
  75. }? ?
  76. var ?offsetTop?=?element.offsetTop;? ?
  77. while ?(element?=?element.offsetParent)?{? ?
  78. offsetTop?+=?element.offsetTop;? ?
  79. }? ?
  80. return ?offsetTop;? ?
  81. }? ?
  82. function ?init(tags)?{? ?
  83. initVar(tags);? ?
  84. initElementMap();? ?
  85. initDownloadListen();? ?
  86. };? ?
  87. return ?{? ?
  88. init:?init? ?
  89. }? ?
  90. })(); ?

?

?

?

使用方法:把页面上需要延时加载的图片src改成为lazy_src,然后把上面的js放到body最后面,然后调用:lazyLoad.init();
调戏的方法可以使用firebug来查看一时图片是否是延时加载。
另外:
如果你的页面上存在有内容切换的栏目的话,可能在切换时切换的内容里的图片可能会不显示,处理的方法是在内容时单独图片加载处理,如:
///切换内容的代码…

?

  1. chlid.find( "img[init_src]" ).each( function (){? ?
  2. $( this ).attr( "src" ,$( this ).attr( "init_src" ));? ?
  3. $( this ).removeAttr( "init_src" );? ?
  4. ? ?
  5. });?

?

?

  相关解决方案