解决js图片加载时出现404的问题

运营网站久了之后,无法避免会出现图片404的情况,原因可能是图片文件本来就不存在或目前不存在。常见的解决方案是将404图片隐藏或者是替换为默认的图片。 
img标签事件属性
img标签可使用的时间属性有:
onabort, onbeforeunload, onblur, onchange, onclick, oncontextmenu, ondblclick, ondrag, ondragend, ondragenter, ondragleave, ondragover, ondragstart, ondrop, onerror, onfocus, onkeydown, onkeypress, onkeyup, onload, onmessage, onmousedown, onmousemove, onmouseover, onmouseout, onmouseup, onmousewheel, onresize, onscroll, onselect, onsubmit, onunload
img标签常用的事件如下:

onerror:图像加载过程中发生错误时被触发。
onabort:图片加载的时候,用户通过点击停止加载时触发,通常在这里触发一个提示:“图片正在加载”。
onload:当图片加载完成之后触发。
1. 对图片监听onerror事件

<img src="someimage.png" onerror="imgError(this);" /> 

// 原生JS:
function imgError(image){
 // 隐藏图片
 image.style.display = 'none';
 // 替换为默认图片
 // document.getElementById("img").setAttribute("src", "images/demo.png");
} 

// 使用jQuery处理:
function imgError(image){
 $(image).hide();
 // $(this).attr("src", "images/demo.png");
}

注意:需要将处理函数定义在head,防止图片加载出错时没有读取到处理函数
 2. 使用jQuery监听error

// 通常不会再HTML里面内联js,可以使用.error对图片进行监听处理
$('#test img').error(function() {
 $(this).hide();
 // $(this).attr("src", "images/demo.png");
});

注意:jQuery加载需要在img前,处理函数需在img后
3. 使用函数处理

// 原生JS解决方案
function $id(id) {
 return !id || id.nodeType === 1 ? id : document.getElementById(id);
}
function isType(o, t) {
 return (typeof o).indexOf(t.charAt(0).toLowerCase()) === 0;
} 

// 主要逻辑
function image(src, cfg) {
 var img, prop, target;
 cfg = cfg || (isType(src, 'o') ? src : {}); 

 img = $id(src);
 if (img) {
  src = cfg.src || img.src;
 } else {
  img = document.createElement('img');
  src = src || cfg.src;
 } 

 if (!src) {
  return null;
 } 

 prop = isType(img.naturalWidth,'u') ? 'width' : 'naturalWidth';
 img.alt = cfg.alt || img.alt; 

 // Add the image and insert if requested (must be on DOM to load or
 // pull from cache)
 img.src = src; 

 target = $id(cfg.target);
 if (target) {
  target.insertBefore(img, $id(cfg.insertBefore) || null);
 } 

 // Loaded?
 if (img.complete) {
  if (img[prop]) {
   if (isType(cfg.success,'f')) {
    cfg.success.call(img);
   }
  } else {
   if (isType(cfg.failure,'f')) {
    cfg.failure.call(img);
   }
  }
 } else {
  if (isType(cfg.success,'f')) {
   img.onload = cfg.success;
  }
  if (isType(cfg.failure,'f')) {
   img.onerror = cfg.failure;
  }
 } 

 return img;
}

以上函数有许多用处:
1. 获取图片信息:图片是否可下载,图片宽高

image('img',{
 success : function () { alert(this.width + "-" + this.height); },
 failure : function () { alert('image 404!'); },
}); 

// 验证资源是否下载
image('images/banner/banner_2.jpg', {
 success : function () {console.log('sucess')},
 failure : function () {console.log('failure')},
 target : 'myContainerId',
 insertBefore : 'someChildOfmyContainerId'
}); 

2. 下载并插入图片

var report = $id('report'),
 callback = {
  success : function () {
   report.innerHTML += '<p>Success - ' + this.src + ' ('+this.offsetWidth+'x'+this.offsetHeight+')</p>';
  },
  failure : function () {
   report.innerHTML += '<p>Failure - ' + this.src + ' ('+this.offsetWidth+'x'+this.offsetHeight+')</p>';
  },
  target : 'target'
 }; 

image('img', callback);
image('images/banner/banner_2.jpg', callback); 

以上就是js针对图片加载时出现404问题的解决办法,希望大家有所收获。

(0)

相关推荐

  • 原生js和jquery实现图片轮播淡入淡出效果

    图片轮播有很多种方式,这里采用其中的 淡入淡出形式 js原生和jQuery都可以实现,jquery因为封装了很多用法,所以用起来就简单许多,转换成js使用,其实也就是用js原生模拟出这些用法. 但不管怎样,构造一个最基本的表现层是必须的 简单的图片轮播一般由几个部分构成. 对于淡入淡出式 1.首先是个外围部分(其实也就是最外边的整体wrapper) 2.接着就是你设置图片轮播的地方(也就是一个banner吧) 3.然后是一个图片组(可以用新的div 也可以直接使用 ul-->li形式) 4.然后

  • Javascript实现图片加载从模糊到清晰显示的方法

    1.背景介绍 在网络相册应用中用户查看照片是最朴素的需求,当网络比较慢的时候查看照片等待的时间是比较长的,用户体验会很差. 2.现状 现在加载照片的方法主要有一下两种: (1)最原始的方式在html页面直接用img标签加载显示照片.该方法在网络速度比较慢或者要显示的照片比较大的时候会页面出现空白的等待过程,并且不能开始给用户看到照片大概的情况,用户体验比较不好 (2)在html页面先用img标签加载显示照片的缩略图,同时用javascript隐藏的加载照片的原图,等照片大图加载完成后再将原图显示

  • js如何实现淡入淡出效果

    淡入淡出效果,在日常项目中经常用到,可惜原生JS没有类似的方法,而有时小的页面并不值得引入一个jQuery库,所以就自己写了一个,已封装,有用得着的朋友,可以直接使用.代码中另附有一个设置元素透明度的方法, 是按IE规则(0~100)设置, 若改成标准设置方法(0.00~1.00),,下面使用时请考虑浮点精确表达差值. 参数说明: fadeIn()与fadeOut()均有三个参数,第一个是事件, 必填:第二个是淡入淡出速度,正整数,大小自己权衡,可选参数:第三个, 是指定淡入淡出到的透明度值(类

  • js控制淡入淡出示例代码

    相对来说可以让初学者看一下,并不太实用,可能jquery4条语句就能解决,但是原生相对有参照性,了解最终原理才是关键. 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o

  • JavaScript控制图片加载完成后调用回调函数的方法

    本文实例讲述了JavaScript控制图片加载完成后调用回调函数的方法.分享给大家供大家参考.具体分析如下: 这段代码可以控制指定区域内的图片加载完成后执行指定的回调函数. 复制代码 代码如下: function when_images_loaded($img_container, callback) { /* do callback when images in $img_container (jQuery object) are loaded. Only works when ALL ima

  • js实现图片加载时候逐渐出现的杂色效果

    虽然本效果与马赛克有些差别,但可从思路上为你提供一份参考. 图片逐渐出现杂色效果 image1.filters.item(0).apply() image1.filters.item(0).transition = 12 image1.Style.visibility = "" image1.filters(0).play(2.0) [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

  • JavaScript实现页面滚动图片加载(仿lazyload效果)

    为什么写这篇文章? 1.优化页面很实用的方法,技术实现不难: 2.搜索了相关内容的文章,好像都是用jQuery的方法,可是如果不用jQuery的站长难道就不能用这种方法了么: 3.做技术分享也是在让更多人帮自己测试,因为这个本人木有在项目中实际用到,都是自己琢磨的,所有如果有问题请大家指出,先谢谢了: 4.这个月的博客还没写: 5.刚好木有工作任务,此时不写更待何时... 现在的页面大多都具有的特点 - 内容丰富,图片较多:像我们经常浏览的淘宝,京东,团购网站之类的(本人网购控,属于一个月不在网

  • js判断图片加载完成后获取图片实际宽高的方法

    本文实例讲述了js判断图片加载完成后获取图片实际宽高的方法.分享给大家供大家参考,具体如下: 通常,我们会用jq的.width()/.height()方法获取图片的宽度/高度或者用js的.offsetwidth/.offsetheight方法来获取图片的宽度/高度,但这些方法在我们通过样式设置了图片的宽高后获取的就不是图片的实际宽高,这显然在有些时候不是我们想要的结果,那么有没有一种方法来获取这样的实际宽高呢?答案是有的.下面的代码就能解决这样的问题: <img src="01.jpg&q

  • js实现图片加载淡入淡出效果

    本文实例为大家分享了js图片加载淡入淡出效果展示的具体代码,供大家参考,具体内容如下 HTML代码 首先是图片标记的写法: <img data-src="/path/to/image.jpg" alt=""> 需要将图片的地址放到 data-src 属性里,而src值填写默认的一张图片. CSS代码 所有具有data-src属性的图片,我们将其初始显示状态为不可见,通过透明度来调节: img { opacity: 1; transition: opaci

  • 原生js实现fadein 和 fadeout淡入淡出效果

    js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG). 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (ele.style.opacity != undefined) { ///兼容FF和GG和新版本IE ele.style.opacity = opac

随机推荐