博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
html+js实现图片预加载,lightbox底层原理。
阅读量:5777 次
发布时间:2019-06-18

本文共 2418 字,大约阅读时间需要 8 分钟。

hot3.png

在前端设计时,为了让某县页面的图片即使缓存到浏览器中,一般使用预加载技术,但更为确切的应该称为异步加载,因为对线程不会造成阻塞。

图片是网站开发部分中的静态资源,当浏览器网络请求到图片时会首先缓存,然后根据url hash值载入到<img>中

相关链接 

核心代码

function loadImage(id,src,callback){var imgloader= new window.Image(); //当图片成功加载到浏览器缓存imgloader.onload =function(evt)  {    if(typeof(imgloader.readyState)=='undefined')    {       imgloader.readyState = 'undefined';    }     //在IE8以及以下版本中需要判断readyState而不是complete    if ((imgloader.readyState=='complete'||imgloader.readyState=="loaded")||imgloader.complete)     {      callback({'msg':'ok','src':src,'id':id});    }else{      imgloader.onreadystatechange(evt);    }};//当加载出错或者图片不存在imgloader.onerror = function(evt){  callback({'msg':'error','id':id});}//当加载状态改变                       imgloader.onreadystatechange = function(e){     //此方法只有IE8以及一下版本会调用 } imgloader.src=src;   }

深情的测试一下吧。

  
  异步(预加载)加载图片  
 
function loadImage(id,src,callback){   var imgloader= new window.Image(); //当图片成功加载到浏览器缓存  imgloader.onload =function(evt)    {    if(typeof(imgloader.readyState)=='undefined')     {  imgloader.readyState = 'undefined';     } //在IE8以及以下版本中需要判断readyState而不是complete   if ((imgloader.readyState=='complete'||imgloader.readyState=="loaded")||imgloader.complete)      {       //console.log('width='+imgloader.width+',height='+imageloader.height);//读取原始图片大小      callback({'msg':'ok','src':src,'id':id});   }else{     imgloader.onreadystatechange(evt);   }};imgloader.onerror = function(evt){   callback({'msg':'error','id':id});};                        imgloader.onreadystatechange = function(e) {  //此方法只有IE8以及一下版本会调用  }; imgloader.src=src;}var loadResult = function(data){   data =   data ||{} ;   if(typeof(data.msg)!='undefined')   { if(data.msg=='ok') {             //这里使用了id获取元素,有点死板,建议读者自行扩展为css 选择符             document.getElementById(''+data.id).src=data.src;                   }else{     //这里图片加载失败,我们可以显示其他图片,防止大红叉     document.getElementById(''+data.id).src='unload.png'; }   }}var surl = 'http://web.2008php.com/2014_Website_appreciate/2014-10-31/20141031133134.jpg'; loadImage('display_images',surl,loadResult);

注意:这种用法过于简单,没有发挥出性能,请读者自行改造后,预加载20张1024*780图片,然后自动播放。如果是预加载的,播放时看不见卡顿或显示不完全的现象。

--------------------------------------------------------------------------------

目前,很多主流的图片展示库如 lightbox.js,facybox.js等底层就是依据这种原理实现的,有兴趣的读者可以使用一下这些第三方框架。

try doing it.

转载于:https://my.oschina.net/ososchina/blog/339982

你可能感兴趣的文章
“人工智能”60多年前就有了,为什么现在才火?
查看>>
def
查看>>
MYSQL 连表查询及别名用法
查看>>
如何快速学习单片机?聊聊单片机学习基础
查看>>
新个税扣缴细则明确:工资薪金所得适用累计预扣法
查看>>
WEB服务器的配置及在其所拼通物理机中查看
查看>>
ping ,time,TTL详解
查看>>
Mirai变种预警
查看>>
如何压缩word文档的大小
查看>>
选择云桌面你的出发点是什么
查看>>
花生日记涉传销,给了互联网企业什么启示
查看>>
详解区块链中EOS的作用。
查看>>
我的友情链接
查看>>
Oracle Statspack报告中各项指标含义详解
查看>>
mysql-error 1236
查看>>
server-sent-event使用流信息向客户端发送数据
查看>>
sshd_config设置参数笔记
查看>>
循序渐进Docker(一)docker简介、安装及docker image管理
查看>>
CentOS 6.2 安装 Samba
查看>>
jsp页面修改后浏览器中不生效
查看>>