image的加载事件(onload)和加载状态(complete)
之前做过这样一个需求,要让商家页的商家图片按照图片外面box的大小等比例缩放。之前的想法是在页面中先输出图片的src,然后在页面底部初始化js,然后在js中写相应的可以使图片按照box的大小等比例缩放的函数。要实现图片的等比例缩放要做到以下几点,
第一,得到图片的width和height
第二,比较图片的width和height与box的width的height的大小,共有四种情况,
# 如果图片的width和height均小于box的width和height,那么直接让图片上下左右居中即可,
#
如果图片的width大于box的width,height小于box的height,让图片按照宽度等比例缩放,然后垂直居中,
#
如果图片的height大于box的height,width小于box的width,让图片按照高度等比例缩放,然后左右居中,
#
如果图片的width和height均大于box的width和height,那么分别计算图片的widht和height和box的width和height的比,用较小的值作为缩放的比例,然后上下左右居中即可。
第三,将得到的图片放入对应的img节点中即可
第二步和第三步都比较好实现,几个if..else循环即可搞定,但是对于第一步如何获得图片的width和height是个需要解决的关键性问题,之前
的想法是在页面中直接输入图片的src,然后再将图片进行等比例缩小,但是这样存在了一个问题,就是无论如何,图片都会先展示出来原来的大小,然后再等比
例缩小,这样在体验上非常不好,所以首先考虑到可以先让图片visiblility:hidden,然后在js计算完图片的大小的时候再让图片
visibility:visible,这样虽然可以实现效果但是存在一定的限制,因为在页面的代码全部加载完毕后,图片不一定加载完毕,如果是一张较小
的图片,那么这种方法可以很幸运的获得原始图片的高度和宽度,但是如果图片非常大,在图片还没有加载完毕,代码即运行结束,这样获得的图片的大小即不是真
实的值,所以现在存在的一个问题就是如何在图片完全加载完毕之后再获得图片的真实的高度和宽度。我们这时自然而然的想到了img对象的onload方
法,img.onload是当一张图片被加载完成后所触发的事件。下面看一个例子,
<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;
};
};
};
文章来自:http://blog.sina.com.cn/s/blog_73c8ed1901013k70.html
image的加载事件(onload)和加载状态(complete)的更多相关文章
- 搞清Image加载事件(onload)、加载状态(complete)后,实现图片的本地预览,并自适应于父元素内(完成)
onload与complete介绍 complete只是HTMLImageElement对象的一个属性,可以判断图片加载完成,不管图片是不是有缓存:而onload则是这个Image对象的load事件回 ...
- JQuery图片加载显示loading和加载失败默认图片
在很多时候我们需要用到图片加载功能,在网上搜资料后就想为了以后使用方便重新整理了下,结果如图: 最后一张是加载失败显示的图片,没找到合适的图片,先用他顶替. 页面引用 <div class=&q ...
- js 实现图片预加载 (js操作 Image对象属性complete ,事件onload 异步加载图片)
通过js操纵DOM很多情况下都是为了实现和当前页html元素的异步载入,我谈谈对Image对象的一些认识.看个例子:<input type="button" name=&qu ...
- JS事件 加载事件(onload)注意:1. 加载页面时,触发onload事件,事件写在<body>标签内。 2. 此节的加载页面,可理解为打开一个新页面时。
加载事件(onload) 事件会在页面加载完成后,立即发生,同时执行被调用的程序. 注意:1. 加载页面时,触发onload事件,事件写在<body>标签内. 2. 此节的加载页面,可理解 ...
- EF如何操作内存中的数据和加载外键数据:延迟加载、贪婪加载、显示加载
EF如何操作内存中的数据和加载外键数据:延迟加载.贪婪加载.显示加载 之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需 ...
- 深入理解DOM事件类型系列第六篇——加载事件
前面的话 提到加载事件,可能想到了window.onload,但实际上,加载事件是一大类事件,本文将详细介绍加载事件 load load事件是最常用的一个事件,当页面完全加载后(包括所有图像.java ...
- 从零开始学 Web 之 jQuery(一)jQuery的概念,页面加载事件
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 支持xhr浏览器:超时设定、加载事件、进度事件
各个浏览器虽然都支持xhr,但还是有些差异. 1.超时设定 IE8为xhr对象添加了一个timeout属性,表示请求在等待响应多少毫秒后就终止.再给timeout这只一个数值后,如果在规定的时间内浏览 ...
- js 动态加载事件的几种方法总结
本篇文章主要是对js 动态加载事件的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有些时候需要动态加载javascript事件的一些方法往往我们需要在 JS 中动态添 ...
随机推荐
- js => ES6一个新的函数写法
今天在网上参观到一个写法,返回字符串个个字母的个数 var arr='aaabbccaa'; var info = arr.split('').reduce((p, k) => (p[k]++ ...
- iOS 字号转换问题
一,ps和pt转换 px:相对长度单位.像素(Pixel).(PS字体) pt:绝对长度单位.点(Point).(iOS字体) 公式如下: pt=(px/96)*72. 二,字体间转换 1in = 2 ...
- sharepoint 提升权限报错
现象: sharepoint中提升权限是为了模拟管理员操作,但是对于普通用户对item的更新和删除照成错误 解决办法: 去掉权限升级 说明: 升级权限能不用尽量不用,同时也不好排查权限问题.
- include的用法例子,以及include+merge的用法例子
[include+LinearLayout]的使用例子 AndroidIncludeLayout.java package com.AndroidIncludeLayout; import andro ...
- Android开发学习——基础学习
在微信公众号上,发现一个自学android的一个文章,觉得不错.对其进行小小总结,整理给大家. 1. 基础UI学习 Button/TextView/EditText/CheckBox/ImageVie ...
- DropDownList默认选中
一.DropDownList默认选中 开始的笨方法: foreach (ListItem item in DropDownList1.Items) { ...
- IOS开发基础知识--碎片40
1:Masonry快速查看报错小技巧 self.statusLabel = [UILabel new]; [self.contentView addSubview:self.statusLabel]; ...
- Android 第一http请求访问慢,以后就快了的问题
android的服务端是用MVC+ef,第一次访问特别慢,第一次以后就快了. 在网上找了很多原因,解决不了.后来发现是应用程序池的问题,准确说是ef的问题,应用程序池被回收了,请求就慢了,
- Oracle Linux 5.7安装VMware Tools的问题
案例环境介绍: 虚拟机的版本:VMware® Workstation 8.0.3 build-703057 操作系统版本:Oracle Linux Server release 5.7 ...
- [转载]Linux Bond的原理及其不足
本文转自http://www.yunweipai.com/archives/1969.html 支持原创.尊重原创,分享知识! 在企业及电信Linux服务器环境上,网络配置都会使用Bonding技术做 ...