js img图片加载失败,重新加载+断网检查

我们常常会遇到img加载图片的时候因为网络问题或者图片过大导致图片加载失败的问题,页面就因为这张蹦掉的图变得不美观。所以我们需要图片加载失败的时候重新加载图片

原文链接www.jianshu.com/p/f63425d22…

//js方法定义  
function resetImgUrl(imgObj,imgSrc,maxErrorNum){  
      if(maxErrorNum > 0){  
            imgObj.onerror=function(){  
              reSetImgUrl(imgObj,imgSrc,maxErrorNum-1);  
            };  
            setTimeout(function(){  
                imgObj.src=imgSrc;  
            },500);  
        }else{  
            imgObj.onerror=null;  
            imgObj.src="<%=basePath%>images/noImg.png";  
        }  
  
    }  
  
//调用  
<img onerror='resetImgUrl(this,this.src,3)' src='"+srcStr+"'/> 
//该逻辑摘自网络http://sunshuaij2ee.iteye.com/blog/1727993
复制代码

判断网络连接情况,重新连接网络时再请求图片

var onLine = true
var eventList = {} ;//用于储存待重新执行函数的事件列表
window.addEventListener('offline',function(){
    onLine = false;
})
window.addEventListener('online',function(){
    if(onLine == false){
       onLine = true; 
       reLine();
    }
})
//重新连接网络的时候重新调用事件列表对象里面的函数
function reLine(){
    for(var key in eventList){
        if(!eventList[key])continue
        var arg = eventList[key].arg;
        var thisOnFn = eventList[key].that;
        eventList[key].fun.apply(thisOnFn,arg);
        eventList[key] = null;
    }
}
//已经断网了,把函数存储到一个对象里面
function offlined(fun,arg,that){
    if(!onLine){
        //arg = arguments;
        var name = fun.name||'__new';
        eventList[name] = {};
        eventList[name].fun = fun;//原函数
        eventList[name].that = that;//原上下文对象
        eventList[name].arg = [].slice.call(arg);//原参数
        return true
    }
    return false
}
复制代码

测试一下(把代码复制到chrome的console里面运行)

function aa(){
    offlined(aa,arguments,this)
    for(var i=0 ; i<arguments.length;i++){
        console.log(arguments[i]);
    }
}
//断开网络再执行一下代码
aa(123,234,345)
//先输出一遍
123 234 345
//再连接上网络后看输出
123 234 345
复制代码

结合上面的图片重新加载逻辑

function resetImgUrl(imgObj,imgSrc,maxErrorNum){
    if(offlined(reSetImgUrl,arguments,this))return
    if(maxErrorNum > 0){  
        imgObj.onerror=function(){  
            reSetImgUrl(imgObj,imgSrc,maxErrorNum-1);  
        };  
        setTimeout(function(){  
            imgObj.src=imgSrc;  
        },500);  
    }else{  
        imgObj.onerror=null;  
        imgObj.src="<%=basePath%>images/noImg.png"; 
    }  
}
复制代码

文章首发地址 juejin.im/user/5a30c3…

涉及原创内容,转载请附注明出处

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现图片延迟加载可以使用以下代码: 1. 先将所有需要加载图片的src属性设置为一个空白图片或者占位符图片,例如: ```html <img class="lazy" data-src="图片真实路径" src="占位符路径"> ``` 2. 使用JavaScript获取所有需要延迟加载图片元素,并监听页面滚动事件: ```javascript var lazyLoadImg = document.getElementsByClassName('lazy'); var viewHeight = document.documentElement.clientHeight; function lazyLoad() { for(var i = 0, len = lazyLoadImg.length; i < len; i++) { var offsetTop = lazyLoadImg[i].getBoundingClientRect().top; if(offsetTop < viewHeight) { lazyLoadImg[i].src = lazyLoadImg[i].getAttribute('data-src'); lazyLoadImg[i].classList.remove('lazy'); } } } window.addEventListener('scroll', lazyLoad); ``` 3. 当滚动到图片位置时,将data-src属性赋值给src属性即可。 实现瀑布流加载可以使用以下代码: 1. 设置图片容器div的列数和图片间距,例如: ```css .waterfall { column-count: 4; column-gap: 20px; } ``` 2. 使用JavaScript获取所有需要加载图片,并计算每张图片的宽度和高度: ```javascript var waterfall = document.getElementsByClassName('waterfall')[0]; var waterfallImg = waterfall.getElementsByTagName('img'); var columnNum = 4; var imgWidth = (waterfall.offsetWidth - (columnNum - 1) * 20) / columnNum; var imgHeightArr = []; for(var i = 0, len = waterfallImg.length; i < len; i++) { var imgHeight = imgWidth * waterfallImg[i].naturalHeight / waterfallImg[i].naturalWidth; imgHeightArr.push(imgHeight); waterfallImg[i].style.width = imgWidth + 'px'; } ``` 3. 根据每张图片的高度,计算每列的高度,并将图片插入到最短的一列: ```javascript function minIndex(arr) { var min = arr[0]; var index = 0; for(var i = 1, len = arr.length; i < len; i++) { if(arr[i] < min) { min = arr[i]; index = i; } } return index; } for(var i = 0, len = waterfallImg.length; i < len; i++) { var minIndex = minIndex(imgHeightArr); waterfallImg[i].style.top = imgHeightArr[minIndex] + 'px'; waterfallImg[i].style.left = (imgWidth + 20) * minIndex + 'px'; imgHeightArr[minIndex] += imgHeightArr[i]; } ``` 4. 当新图片加载完成时,重复步骤2和步骤3即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值