`

JavaScript判断远程图片是否存在,加载完成:onerror 属性- & jQuery实现(如果因为网络或图片的原因发生异常,则显示该图片)~

阅读更多
根据此属性用js建立图像对象:

格式:

图像对象名称=new Image([宽度],[高度])

图像对象的属性:

border complete height hspace lowsrc name src vspace width readyState

图像对象的事件:

onabort onerror onkeydown onkeypress onkeyup onload onreadystatechange



程序代码

var img=new Image();

img.onload=function(){alert("img is loaded")}; //它在图像完全载入到内存之后调用。

img.onerror=function(){alert("error!")};//它在图像载入失败后调用,图像载入失败不会调用onload事件。

img.src="image1.jpg";//开始加载图片,加载图片是异步过程。

function show(){alert("body is loaded");};

window.onload=show;



运行上面的代码后,在不同的浏览器中进行测试,发现IE和FF是有区别的,在FF中,img对象的加载包含在body的加载过程中,既是img加载完之后,body才算是加载完毕,触发window.onload事件。

在IE中,img对象的加载是不包含在body的加载过程之中的,body加载完毕,window.onload事件触发时,img对象可能还未加载结束,img.onload事件会在window.onload之后触发。

根据上面的问题,考虑到浏览器的兼容性和网页的加载时间,尽量不要在Image对象里放置过多的图片,否则在FF下会影响网页的下载速度。当然如果你在 window.onload之后,执行预加载函数,就不会FF中的问题了。



对于onload事件的绑定,不要放在src=’……’语句后面,因为加载图片的速度可能很快,如果图片加载完毕后,绑定onload事件的代码还没来得及执行,就会造成绑定到onload事件的函数没机会执行。其他事件的绑定也要注意这一点。



代码简化后如下:

var img = new Image();
img.src = “test.gif”;
img.onload = function(){
    alert(this.src);
    //other     
};

简单看过以后貌似这段代码没有什么问题,可是IE下就不是能正常的运行。不管怎么检测,IE根本不会理会,不过还是找到了解决的方法,原理如下:
图片下载时,浏览器会把图片缓存起来,再次加载此图片时就会从缓冲区里加载。
那么如果图片已经在缓存区了,是不是从缓冲区里加载的图片就不触发onload事件呢?
测试……

var img = new Image();
img.onload = function(){
    alert(this.src);
    //other   
};
img.src = “test.gif”;

测试成功!

结论:应该把onload写到src前面,先告诉浏览器图片加载完要怎么处理,再让它去加载图片。 所以,不是IE浏览器不会触发onload事件,而是因为加载缓冲区的速度太快,在没有告诉它加载完要怎么办时,它已经加载完了。反过来说,firefox明显更智能一些,加入onload事件后,firefox浏览器会检测缓冲区是否已经有此图片,有的话直接就触发此事件!

img 判断图片加载完成:

?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
</head>
<body>
<script>

//判断浏览器
var Browser=new Object();
Browser.userAgent=window.navigator.userAgent.toLowerCase();
Browser.ie=/msie/.test(Browser.userAgent);
Browser.Moz=/gecko/.test(Browser.userAgent);

//判断是否加载完成
function Imagess(url,imgid,callback){  
    var val=url;
    var img=new Image();
    if(Browser.ie){
        img.onreadystatechange =function(){
            if(img.readyState=="complete"||img.readyState=="loaded"){
                callback(img,imgid);
            }
        }      
    }else if(Browser.Moz){
        img.onload=function(){
            if(img.complete==true){
                callback(img,imgid);
            }
        }      
    }  
    //如果因为网络或图片的原因发生异常,则显示该图片
    img.onerror=function(){img.src='http://www.baidu.com/img/baidu_logo.gif'}
    img.src=val;
}

//显示图片
function checkimg(obj,imgid){
document.getElementById(imgid).src=obj.src;
}
//初始化需要显示的图片,并且指定显示的位置
window.onload=function(){
    Imagess("http://pic.cnblogs.com/avatar/a46603.jpg","img1",checkimg);
    Imagess("http://pic.cnblogs.com/avatar/a46603.jpg","img2",checkimg);
    Imagess("http://pic.cnblogs.com/avatar/a46603.jpg","img3",checkimg);
    Imagess("http://pic.cnblogs.com/avatar/a46603.jpg","img4",checkimg);
    Imagess("http://pic.cnblogs.com/avatar/a46603.jpgdddddddddddddddddddddddd","img5",checkimg);
}
</script>
<img id="img1" src="loading.gif" width="100" height="100" />
<img id="img2" src="loading.gif" width="100" height="100" />
<img id="img3" src="loading.gif" width="100" height="100" />
<img id="img4" src="loading.gif" width="100" height="100" />
<img id="img5" src="loading.gif" width="100" height="100" />
</body>
</html>

jQuery实现:

<!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.org/1999/xhtml">
<head>
    <title>无标题页</title>
    <script language="javascript" type="text/javascript" src="http://www.mainaer.com/JS/jquery-1-3-2.js"></script>
</head>
<body>


<div>
<img src="http://www.mainaer.com/skin/maps/4.png" />
<img src="http://www.mainaer.com/skin/maps/5_R.png" />
<img src="http://www.mainaer.com/skin/maps/6.png" />
<img src="http://www.mainaer.com/skin/maps/7.png" />
<img src="http://www.mainaer.com/skin/maps/8.png" />
</div>
<div id="msgTool">

</div>

<script language="javascript" type="text/javascript">
     
     $(function (){
      
          $("img").each(function (i,e){
              var imgsrc = $(e).attr("src");
              $(e).load(function(){
                   $("<p> ok "+ $(e).width()+":"+$(e).height()+"</p>").appendTo("#msgTool");
                }).error(function() {
                   $("<p> error "+ imgsrc +"</p>").appendTo("#msgTool");
                   $(e).attr("src","http://www.mainaer.com/uploadfiles/mainaer/nopic.gif");
                }) ;
         
          });
      });
      
     
</script>
</body>
</html>
转载自http://www.cnblogs.com/dudu837/archive/2010/11/10/1874000.html
分享到:
评论

相关推荐

    基于jquery实现的Flash加载远程图片带进度条显示效果.zip

    这个压缩包"基于jquery实现的Flash加载远程图片带进度条显示效果.zip"似乎包含了一个示例,该示例利用jQuery与Flash技术结合,实现了在加载远程图片时动态显示进度条的效果。这在用户界面设计中是一种优秀的用户体验...

    jquery电子文档chm

    访问第一个匹配元素的样式属性。 -------------------------------------------------------------------------------- Return a style property on the first matched element. 返回值 String 参数 name (String...

    JavaScript和jQuery实战手册源码--the missing manual

    JavaScript和jQuery是Web开发中的两大重要工具,它们的结合使得前端交互变得更加生动和高效。《JavaScript和jQuery实战手册源码--the missing manual》是一本旨在帮助开发者深入理解并熟练运用这两种技术的书籍。这...

    vue动态加载外部依赖js代码实现

    ### Vue动态加载外部JS代码实现 #### 概述 在前端开发中,有时我们需要动态地加载外部JavaScript库或脚本文件。特别是在构建大型Vue应用程序时,可能会遇到需要按需加载某些功能的情况,例如第三方库、API接口等。...

    Jquery 帮助文档

    - `$(document).ready()`:确保DOM加载完成后再执行代码,避免因DOM未加载完全而引发的问题。 - `.each()`:遍历jQuery对象中的每个元素,执行指定函数。 - `.find()`:查找jQuery对象内的子元素。 - `.html()`, `....

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -为Button,MenuItem(MenuButton,MenuHyperLink),AccordionLink,TreeNode,Image(如果ImageUrl为空,则取Icon的值)增加Icon属性。 +2009-09-15 v2.1.1 -修正不能动态修改AccordionPane属性Items的BUG。 +为...

    ajax jquery的使用

    这通常通过 CDN(内容分发网络)链接或下载到本地后引用实现: ```html &lt;script src="https://code.jquery.com/jquery-3.6.0.min.js"&gt;&lt;/script&gt; ``` ### 2. jQuery 对象与 DOM 元素 在 jQuery 中,我们使用 `$` ...

    jquery1.7.2中文手册

    jQuery是一个强大的JavaScript库,它的核心理念是“Write Less, Do More”,通过简洁的API接口,让开发者能够更高效、更简便地操作网页DOM元素,实现丰富的交互效果和动态功能。 1. **选择器(Selectors)** ...

    50个Jquery经典实例

    **jQuery 是一个高效、简洁且功能丰富的 JavaScript 库,它极大地简化了网页的交互和动画效果的实现。本文将深入探讨50个jQuery经典实例,这些实例覆盖了jQuery的多种核心功能,包括DOM操作、事件处理、动画效果、...

    jquery-api-1.7

    jQuery提供了丰富的文档处理方法,如$(document).ready()用于在DOM加载完成后执行函数,确保所有元素都已准备就绪。$.load()用于异步加载HTML片段并插入到指定元素中。$.getScript()则用于动态加载JavaScript文件。 ...

    Jquery API

    **jQuery API 中文版详解** jQuery 是一个广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画以及Ajax交互。jQuery API 提供了一系列丰富的函数和方法,使得JavaScript编程变得更加简洁高效。以下是对...

    jQueryEasyUi培训文档.pdf

    ### jQuery EasyUI 培训文档知识点概览 #### 一、Accordion(手风琴面板) **1.1 概述** Accordion 组件是 jQuery EasyUI 中的一个非常实用的插件,它允许用户轻松地创建可折叠的手风琴面板。这对于节省页面空间...

    jquery 最新API 文档,非常全面

    离线版的jQuery API文档是开发者的重要参考资料,无论是在没有网络连接的环境中,还是为了快速查找和理解API用法,都能提供极大便利。通过深入学习并熟练掌握这些知识点,可以提升JavaScript编程效率,创建出更加...

    jquery ajax 框架

    在jQuery中,AJAX(Asynchronous JavaScript and XML)技术被封装得易于理解和使用,使得开发者能够轻松实现异步数据加载,提升用户体验。 ### jQuery AJAX 基础 - **$.ajax()**:这是jQuery中最核心的AJAX方法,...

    jQuery 1.2 中文文档6-21更新

    jQuery是JavaScript库中的一个经典之作,它极大地简化了JavaScript的DOM操作、事件处理、动画设计以及AJAX交互。本文将详细解析"jQuery 1.2 中文文档6-21更新"这一资源所涵盖的关键知识点。 一、jQuery基础 1. ...

    jQuery1.2版文档

    - **事件委托**:使用 `delegate()` 或 `on()` 方法实现事件委托,提高性能并简化代码。 - **事件解绑**:`unbind()` 方法用于解除事件绑定,`undelegate()` 解除事件委托。 ### 4. 动画效果 jQuery 的动画效果是...

    jQuery特效小例子

    例如,一个常见的例子可能是使用jQuery实现图片轮播效果,涉及选择器选取图片元素,动画控制切换,以及定时器实现自动播放。 总之,jQuery以其简洁的语法和强大的功能,成为前端开发者的得力工具。掌握jQuery特效的...

    jQuery1.4.1 API 中文参考手册

    《jQuery1.4.1 API 中文参考手册》是一份为开发者提供的详尽指南,它涵盖了jQuery库在1.4.1版本中的各种函数、方法和事件,是快速理解和使用jQuery的强大工具。这份手册通常以CHM(Compiled Help Manual)格式提供,...

    javascript检测是否联网的实现代码

    如果加载失败,则`onerror`事件会被触发,代表网络不可用。这种方法虽然简单,但存在一个问题:如果设备处于局域网内且无法访问外部网络,这种方法将无法正确判断设备是否真正连接到互联网。 2. 使用`navigator.on...

    jQuery表单验证插件Validform

    4. **处理验证结果**:你可以监听`beforeSubmit`和`onError`等事件来处理表单提交前的验证结果,以及错误发生时的行为。 **三、实例演示** ```html &lt;input type="text" id="username" data-rule="required;...

Global site tag (gtag.js) - Google Analytics