img的complete和onload

简介: HTML DOM complete 属性定义和用法:complete 属性可返回浏览器是否已完成对图像的加载。如果加载完成,则返回 true,否则返回 fasle。语法:imageObject.complete Image onload 事件定义和用法:onload 事件在图片加载完成后立即执行。

HTML DOM complete 属性

定义和用法:

complete 属性可返回浏览器是否已完成对图像的加载。

如果加载完成,则返回 true,否则返回 fasle。

语法:

imageObject.complete

 

Image onload 事件

定义和用法:

onload 事件在图片加载完成后立即执行。

语法

onload="JavaScriptCode"

 

complete只是HTMLImageElement对象的一个属性,而onload则是这个Image对象的load事件回调,前者不能准确的在事件发生时进行异步回调并且在浏览器的兼容性上也有些问题。

 这两者,只有img.complete可以判断图片加载完成,img.onload并不能判断图片是否加载完,而是在加载完毕之后,直接运行onload绑定的函数。

 

img加载完成就会解除onload事件,src是异步加载图片的,如果在绑定事件前就已经加载完成,onload事件不会触发。img.complete是一直都有的属性,加载完成后为true。

 

img.onload是当一张图片被加载完成后所触发的事件
实现图片显示功能;
<div>
<img id="img"/>
</div>

js部分:img.src="图片";
img.onload=showImg;
function showImg(){
   代码部分。。。。

}

对于 complete 属性来讲,IE是根据图片是否显示过来判断,就是说当加载的图片显示出来后,complete 属性的值才为 true ,否则一直是 false ,和以前是否加载过该张图片没有关系,即和缓存没有关系!这里要注意,显示与否和img.style.display无关;

JS部分: alert(img.complete);----->false
img.src="图片";
alert(img.complete);------->//如果上面“图片”获取的时间比JS代码顺序执行的时间要长,那么这里就是false,否则就是true。

 

下面看一个例子:
<input type="button" name="" value="载入图片" onclick="addImg('tt.jpg')" />
<script type="text/javascript">
    function addImg(isrc){
        var Img = new Image();
        Img.src = isrc;
        Img.onload = function () {
              document.body.appendChild(Img);
        }
    }
</script>

当页面打开后,点击按钮后,会显示tt.jpg,但是如果重复点击会怎样呢?在IE中,除了第一次加载 图片时候显示正常,之后再点击就没有反应了,刷新也一样。FF中,每点击一次加载一张该图片。而这是什么原因呢?是因为在IE中只执行了一次onload或者是缓存的问题吗?先改写一下代码,

<input type="button" name="" value="载入图片" onclick="addImg('tt.jpg')" />
<script type="text/javascript">
    function addImg(isrc){
        var Img = new Image();
        Img.onload = function (){
              document.body.appendChild(Img);
        }
        Img.src = isrc;
    }
</script>

现在再点击图片,就正常了,由此可见不是因为IE没有触发onload事件,而是因为IE中加载缓冲区的速度太快,以至于没有运行到img.onload的时候,图片已经被加载完毕了。因此,可以先告诉浏览器如何处理这张图片,然后再制定这张图片的来源。一般情况下,可以用complete来判断图片是否加载完毕。对于 complete 属性来讲,IE是根据图片是否显示过来判断,就是说当加载的图片显示出来后,complete 属性的值才为true ,否则一直是false ,和以前是否加载过该张图片没有关系,即和缓存没有关系!可以写如下的函数来做到各个浏览器中预加载图片的兼容性。

var imgLoad = function (url) {
    var img = new Image();
    img.src = url;
    if (img.complete) {
        callback(img.width, img.height);
    } else {
        img.onload = function () {
            callback(img.width, img.height);
            img.onload = null;
        };
    };
};

 

相关文章
|
移动开发 前端开发 JavaScript
VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
|
存储 安全 开发工具
GitHub 支持双因素认证(2FA)
【9月更文挑战第29天】
2247 6
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
1376 3
|
JSON 自然语言处理 前端开发
实操|基于抽象语法树(AST)的代码问题修复
文章介绍了如何通过抽象语法树(AST)技术自动化地解决前端代码治理中的具体问题,特别是针对大量存在的未使用变量或函数参数等问题。
|
C语言
【51单片机】用汇编语言实现点灯、闪烁
【51单片机】用汇编语言实现点灯、闪烁
462 1
|
存储 机器学习/深度学习 物联网
云计算的物联网应用:智能化转型的关键
本文探讨了物联网(IoT)与云计算的结合及其在数据处理中的应用。物联网通过连接设备进行数据交换,而云计算提供资源处理和存储。核心概念包括物联网的无线通信、传感、微控制器及数据技术,以及云计算的虚拟化、分布式计算、存储和网络技术。两者协同工作,云计算助力物联网处理大量数据,实现高效分析。文章还介绍了数据预处理、分析(如统计学、机器学习、深度学习)和应用的算法,以及数据应用的实例,展示了如何在智能家居系统中运用这些方法。未来,面对大数据、安全与隐私、实时性及边缘计算的挑战,物联网与云计算将继续发展。
2225 2
|
JavaScript 关系型数据库 MySQL
❤Nodejs 第二章(Node连接本地数据库)
【4月更文挑战第2天】本文介绍了如何使用Node.js连接本地MySQL数据库。首先,提到了在MySQL官网下载安装数据库和使用Navicat for MySQL进行数据库管理。接着,通过`yarn add mysql`在项目中安装数据库依赖。然后,创建`app.js`文件,设置数据库连接参数,并建立连接进行查询操作。遇到导入模块的错误后,修改导入方式为CommonJS语法。
676 1
|
安全 数据安全/隐私保护 云计算
云开发的优缺点是什么
云开发的优缺点是什么
|
Linux 网络安全 Python
解决方案:Centos7运行Django项目报错no module named _ssl
解决方案:Centos7运行Django项目报错no module named _ssl
409 0
|
前端开发 JavaScript Serverless
【web前端技术】dicebear一句话生成头像
【web前端技术】dicebear一句话生成头像
734 0