预载入和JavaScriptImage对象_第1页
预载入和JavaScriptImage对象_第2页
预载入和JavaScriptImage对象_第3页
预载入和JavaScriptImage对象_第4页
预载入和JavaScriptImage对象_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、预载入和JavaScript Image()对象2010-04-13 12:37:04|分类: 默认分类 |字号订阅 很多high-res图像真的可以使 Web 站点更加整洁。但是它们也会使站点的访问速度变慢图像是文件,文件使用带宽,带宽直接与等待时间相关。是该了解如何通过一个叫做图像预载入 (preloading)的技巧来提高 Web 站点的访问速度的时候了。图像预载入对于浏览器载入图像 来说,只有在对图像发送一个 HTTP请求之后,它们才会被浏览器载入,对图像的 HTTP 请求要么使用 img 标记,要么通过方法调用实现。如果使用 JavaScript 脚本来处理在 mouseover 事

2、件时交换图像,或者在一段时间之后自动更改图像,那么在从服务器获取图像时可能要等上几秒钟到几分钟的时间。如果使用一个慢速的 Internet 连接,或者要获取的图像非常大,或者其它一些情况,这种现象就特别明显;这样,延迟就造成你不能达到自己期望的效果。一些浏览器采用一些 措施来缓解这一问题,比如试图通过在本地缓存中存储图像,从而使随后对图像的调用能够立即被满足;但是在图像第一次被调用时依然会存在一些延迟。预载入是 在需要图像之前将其下载到缓存的一种方法。通过这一措施,当真正需要图像时,它就可以被立即从缓存中取出,从而能够立即显示。Image() 对象预载入图像最简单的方法是在 JavaScrip

3、t 中实例化一个新 Image() 对象,然后将需要载入的图像的 URL 作为参数传入。假设我们有一个图像叫做/htmldata/2006-06-26 /heavyimagefile.jpg,在用户的鼠标放到一个已经显示的图像之上时,我们希望显示这个图像。为了预载入这一图像从而得到较快的响应时 间,我们简单地创建一个 Image() 对象 heavyImage,然后在 onLoad() 事件处理器中将其同时载入。function preloader()heavyImage = new Image();heavyImage.src = http:/www.w

4、/htmldata/2006-06-26/heavyimagefile.jpg;请 注意,图像标记本身不能处理 onMouseOver() 和 onMouseOut() 事件,这就是上例中 标记被包含在一个 标记之中的原因, 标记支持这两个事件类型。使用数组载入多个图像在 实际应用中,我们可能需要预载入多个图像,而不止一个;例如,在一个包含多个图像翻卷的菜单栏中,或者在我们试图创建平滑效果时,都需要预载入多个图像。 其实这并不困难,只要使用 JavaScript 的数组即可实现,如下例所示:function preloader()/ countervar i = 0;/ cre

5、ate objectimageObj = new Image();/ set image listimages = new Array();images0=image1.jpgimages1=image2.jpgimages2=image3.jpgimages3=image4.jpg/ start preloadingfor(i=0; i=3; i+)imageObj.src=imagesi;在 上面的例子中,我们定义一个变量 i和一个 Image() 对象 imageObj。然后定义了一个新数组 images,每个数组元素存储要被预载入的图像。最后,创建一个 for() 循环来处理整个数组,

6、并将每个元素赋给 Image() 对象,这样将其载入到缓存中。onLoad() 事件处理器像很多 JavaScript 的其它对象一样,Image() 对象也有一些事件处理器。其中最有用的一个肯定是 onLoad() 处理器,它在图像完全载入之后调用。这个事件处理器可以与一个自定义函数联系起来,以在图像完全载入之后执行一些特定的任务。下面的例子说明了这一点,在 这个例子中,首先在图像载入时显示一个“please wait”屏幕,然后在载入完成时将浏览器转到一个新的 URL。/ create an image objectobjImage = new Image(); / set what ha

7、ppens once the image has loaded objImage.onLoad=imagesLoaded(); / preload the image fileobjImage.src=/htmldata/2006-06-26/images/image1n.gif;/ function invoked on image loadfunction imagesLoaded()document.location.href=index2.html;Please wait, loading images.当然,你还可 以创建一个图像数组然后在其上进

8、行循环操作,预载入每个图像,然后在每一阶段跟踪被载入图像的数目。一旦所有图像载入完毕,根据事件处理器的程序逻辑,它 就可以将浏览器带入下一个页面(或者执行其它任务)。预载入和多状态菜单现在,如何在实际应用程序中使用 所有你学到的理论?下面的这段代码是我最近偶尔编写的一个菜单栏,这个菜单栏由一些按钮(图像链接)组成,每个按钮具有三种状态:正常、悬停和点击。因为 按钮具有多种状态,所以很有必要使用图像预载入,以保证菜单的状态能够快速地反应。清单A中的代码说明了实现方法。清单A 中的HTML 代码设置了一个由四个按钮组成的菜单,每个按钮具有三种状态:正常、悬停和点击。需求如下:# 当鼠标移动到一个正

9、常状态下的按钮之上时,它变为悬停状态。在鼠标离开之后,按钮恢复为正常状态。# 在鼠标点击一个按钮时,按钮变为点击状态。在其它按钮被点击之前,它将保留这一状态。# 如果一个按钮被点击,其它按钮的状态都不能为点击状态。其它按钮只能为悬停状态或正常状态。# 在同一时间只能有一个按钮被点击。# 在同一时间只能有一个按钮处于悬停状态。第一个任务是设置数组,用于保存菜单每个状态的图像。与这些数组元素对应的 img 也在 HTML 文档正文(body)中创建,并顺序地命名。请注意,数组值的索引是从0开始的,虽然对应的 img 元素的命名是从1开始的这样就需要在脚本后面的部分进行计算调整。函数 preload

10、Image() 负责将所有的图像存储到缓存中,以使鼠标运动的响应时间最小。for() 循环用于迭代第一步创建的图像,并在每次迭代中预载入一个图像。函 数 resetAll() 提供了一种快捷的方式来将所有图像重置为它们的正常状态。这是必要的,因为在一个项被点击时,被点击的项变为点击状态之前,菜单中的所有其它项都必须置为 正常状态。函数 setNormal()、setHover() 和 setClick() 用于将特定图像(将图像编号以一个参数传给每个函数)的状态相应地改变为正常、悬停和点击。因为被点击的图像在其它对象被点击之前必须保留它的状态(参见 第二个规则),所以它们临时不响应鼠标移动;这

11、样,setNormal() 和 setHover() 函数的代码就只会改变目前不是处于点击状态的按钮的状态。前面介绍的只是很多预载入图像的一种方法,这种方法可以帮助你提高 JavaScript 效果的响应速度。你可以自由地在你的站点中使用前面给出的方法,如果有必要,你可以根据自己的需要修改上面的代码。祝你好运!avascript image对象/2010/08/29/javascript-image%E5%AF%B9%E8%B1%A1/javascript images文档对象Image是图片对象,而document.images 是一个数组,包含了文

12、档中所有的图片()。要 引用单个图片,可以用document.imagesx。如果某图片包含“name”属性,可以使用“document.imagesname”这种方法来引用图片。在IE 中,如果某图片包含ID属性,可以直接使用“imageID”来引用图片。单个 Image 对象的属性name; src; lowsrc; width; height; vspace; hspace; border 这些属性跟标记里的同名属性是一样的。在 Netscape 里,只有src属性可以改,通过对 src 属性赋值,可以实时的更改图片。可以定义 Image :var myImage = new Image

13、(); 或 var myImage = new Image();通常我们用javascript的 imagePreload 来预读图片一 般这种对象只有一个用:预读图片(preload)。因为当对对象的 src 属性赋值的时候,整个文档的读取、JavaScript 的运行都暂停,让浏览器专心的读取图片。预读图片以后,浏览器的缓存里就有了图片的 Copy,到真正要把图片放到文档中的时候,图片就可以立刻显示了。现在的网页中经常会有一些图像连接,当鼠标指向它的时候,图像换成另外一幅图像,它们 都是先预读图像的。预读少量图片的 JavaScript 例子:var imagePreload = new

14、Image();imagePreload.src = 001.gif;imagePreload.src = 002.gif;imagePreload.src = 003.gif;大量图片预读则用下面的方式:function imagePreload() var imgPreload = new Image(); for (i = 0; i arguments.length; i+) imgPreload.src = argumentsi; imagePreload(001.gif, 002.gif, 003.gif, 004.gif, 005.gif);=在Im Donkey看到倔倔死磕Jav

15、ascript之放大镜 写的不错,思路很清晰。另外的收获是发现了js的Image对象,他是这么用的:function getImageSize(imageEl) var i = new Image();i.src = imageEl.src;return new Array(i.width, i.height);他利用这个函数取得imageEl的width和height。真的很新奇,以前居然不知道js还有Image对象,前几天曾见过ECMAScript 5 在Gecko 1.9.1添加的native JSON对象看来真是生有涯,而学无涯啊。Image 对象在JavaScript 1.1 (i.

16、e. since Netscape Navigator 3.0)引入,我们通过浏览器看到的图像都是通过一个数组显示出来的,这个数组成为images,他是document对象的一个属性。网页中的图像均会 被自动看作图像对象,并依顺序,分别表示为document.images0,document.images1 另外我们可通过给图像一个name属性来访问,如:这样我们就可以通过document.myImage 或者document.imagemyImage来访这个对象。image 对象现在一般常用来预加载一些图片,先将其装入 DOM,等到需要的时候,直接调用,省掉等待的时间,直接显示出来。Java

17、Script 里的 Image 对象可以很好的实现这一需求,在 FF 下通过 alert(img对象) 可以看到“object HTMLImageElement“内容,Image 对象可以直接利用 append 添加到 body 里面去,调用十分方便。图像对象:建立图像对象:格式:图像对象名称=new Image(宽度,高度)图像对象的属性:border complete height hspace lowsrc name src vspace width图像对象的事件:onabort onerror onkeydown onkeypress onkeyup onload需要注意的是:src

18、属性一定要写到 onload 的后面,否则程序在 IE 中会出错。参考代码:var img=new Image();img.onload=function()alert(img is loaded);img.onerror=function()alert(error!);img.src=/img.gif;function show()alert(body is loaded);window.onload=show;运行上面的代码后,在不同的浏览器中进行测试,发现 IE 和 FF 是有区别的,在 FF 中,img 对象的加载包含在 body 的加载过程中

19、,既是 img 加载完之后,body 才算是加载完毕,触发 window.onload 事件。在 IE 中,img 对象的加载是不包含在 body 的加载过程之中的,body 加载完毕,window.onload 事件触发时,img 对象可能还未加载结束,img.onload 事件会在 window.onload 之后触发。根据上面的问题,考虑到浏览器的兼容性和网页的加载时间,尽量不要在 Image 对象里放置过多的图片,否则在 FF 下会影响网页的下载速度。当然如果你在 window.onload 之后,执行预加载函数,就不会有 FF 中的问题了。例子见 javascript dom中的Im

20、age对象图像预加载js 实现图片预加载 (js操作 Image对象属性complete ,事件onload 异步加载图片)通过js操纵DOM很多情况下都是为了实现和当前页html元素的异步载入,我谈谈对Image对象的一些认识。看个例子:当包含上述代码的页面打开时并不载入 “tt.jpg” ,当点击按钮时候才载入。当载入完成后触发onload事件显示到页面上。如果你是第一次加载 “tt.jpg 这张图片的话,运行正常。点击按钮加载并显示一张图片,如果重复点击会怎么样呢?IE、Opera中,除了第一次加载 图片时候显示正常,之后再点击就没有反应了,刷新也一样。难道它们只触发一次 ”onload

21、“ 事件?是缓存机制?FF、Chrom中,每点击一次加载一张该图片。稍微修改下:运行后发现,奇怪的事情发生了。所有的浏览器都一致了,都是每点击一次加载一张图片。这又是什么原因?由此可以见 IE、Opera 执行过程中并不是只触发一次 onload 事件!联想一下 Image 对象的一些属性看看,complete、readyState(IE专属值uninitialized,complete) (为防止缓存影响效果请更换图片名称!)经 过以上测试,可以看出一些不同点,对于 complete 属性来讲,IE是根据图片是否显示过来判断,就是说当加载的图片显示出来后,complete 属性的值才为 tr

22、ue ,否则一直是 false ,和以前是否加载过该张图片没有关系,即和缓存没有关系!但是其它浏览器表现出来的确不一样,只要以前加载过该图,浏览器有缓存,complete 就为 true ,这和IE的 readyState 属性的表现一致!至此,可以肯定的是所有的浏览器都会缓存图片!可是上面的问题到底是什么原因导致的呢?众所周知,从缓存里加载东西的速度是很快的,那么在.Img.src = isrc;Img.onload = .的过程中,难道 IE、Opera 加载的速度快到,来不及追加事件?这回加载一张根本不存在的图片看看效果:可 以肯定的是所有浏览器都不触发 onload 事件。从是否缓存或

23、已经加载过图片的角度讲,IE、Opera表现正常,complete 始终为 false ;IE的 readyState 始终为uninitialized 。令人疑惑的是FF,其中 Iplete 的值一直是 true ;更令人困惑的是 Chrom,它是在最初 new Imgttmt() 的时候 Iplete 值为 false。而之后 Iplete 值就一直为 true 了!如果换一张从来没有加载过的图片,FF和Chrom 的行为就一致了,都是一开始加载时, Iplete 值为false, 之后为 true!测试的过程

24、中还发现,脚本的执行顺序的确会影响到类似于 onload 等事件的追加,如果在其显示后在追加事件就没有什么实际意义了!基于 javascript 这种解释性语言的特性,在追加事件的时候一定要注意把事件追加在触发该事件的句柄之前。JS实现图片预加载2012-03-07 10:05:31 我来说两句 收藏 我要投稿 网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考虑流量的话,大可以像pconline一样每个页面只显示一张图片,让用户每看 一张图片就需要重新下载一下整个页面。不过,在web2.0时代,更多人愿意用javascript来实现一个图片浏览器,让用户无需等待过长的时间就能 看到

25、其他图片。知道了一张图片的地址,需要把它在一个固定大小的html容器(可以是div等)里边显示出来,最重要的当然是需要知道这张即将显示的图片的宽和高,然后再结合容器的宽和高,按照一定的缩放比例使图片显示出来。因此,实现图片预加载就成为图片浏览器的核心功能了。做过图片翻转效果的朋友其实都知道,要让图片轮换的时候不出现等待,最好是先让图片下载到本地,让浏览器缓存起来。这时,一般都会用到js里边的Image对象。一般的手段无非这样:function preLoadImg(url) var img = new Image();img.src = url;通过调用preLoadImg函数,传入图片的ur

26、l,就能使图片预先下载下来了。实际上,这里用到的预下载功能也和这基本一致。图片预下载下来 后,通过 img的width和height属性,就能知道图片的宽和高了。但是需要考虑到,在做图片浏览器功能时,图片都是实时显示的。比如你点了显示的按钮,这 个时候才会调用上边类似的代码来加载图片。因此,如果你直接用img.width的时候,图片还没有完全下载下来。因此,需要用一些异步的方法,等到图片 下载完毕的时候才会再对img的width和height进行调用。实现这样的异步方法实际上不难,图片的下载完毕事件也很简单,就是简单的onload事件。因此,我们可以写出下面的代码:function loadI

27、mage(url, callback) var img = new Image(); img.src = url; img.onload = function() /图片下载完毕时异步调用callback函数。 callback.call(img); / 将callback函数this指针切换为img。 ;好了,再来写一个测试用例。function imgLoaded() alert(this.width);在firefox中测试一下,发现不错,果然和预想的效果一样,在图片下载后,就会弹出图片的宽度来。无论点击多少次或者刷新结果都一样。不过,做到这一步,先别高兴太早还需要考虑一下浏览器的兼容性

28、,于是,赶紧到ie里边测试一下。没错,同样弹出了图片的宽度。但是,再点击load的时候,情况就不一样了,什么反应都没有了。刷新一下,也同样如此。经过对多个浏览器版本的测试,发现ie6、opera都会这样,而firefox和safari则表现正常。其实,原因也挺简单的,就是因为浏览器 的缓存了。当图片加载过一次以后,如果再有对该图片的请求时,由于浏览器已经缓存住这张图片了,不会再发起一次新的请求,而是直接从缓存中加载过来。对于 firefox和safari,它们视图使这两种加载方式对用户透明,同样会引起图片的onload事件,而ie和opera则忽略了这种同一性,不会引

29、起图片的onload事件,因此上边的代码在它们里边不能得以实现效果。怎么办呢?最好的情况是Image可以有一个状态值表明它是否已经载入成功了。从缓存加载的时候,因为不需要等待,这个状态值就直接是表明已经下载了,而从http请求加载时,因为需要等待下载,这个值显示为未完成。这样的话,就可以搞定了。经过一些分析,终于发现一个为各个浏览器所兼容的Image的属性complete。所以,在图片onload事件之前先对这个值做一下判断即可。最后,代码变成如下的样子:function loadImage(url, callback) var img = new Image(); /创建一个Image对象,

30、实现图片的预下载 img.src = url; if (plete) / 如果图片已经存在于浏览器缓存,直接调用回调函数 callback.call(img); return; / 直接返回,不用再处理onload事件 img.onload = function () /图片下载完毕时异步调用callback函数。 callback.call(img);/将回调函数的this替换为Image对象 ;经过这么一番折腾,总算是让各个浏览器都能满足我们的目标了。虽然代码很简单,但是却把图片浏览器中最核心的问题解决掉了,接下来你所要做的,仅仅是图片如何呈现的问题了js图片延迟加载(兼容多

31、浏览器)这一款网页特效图片延迟加载,兼容ie6,7,8,firefox等,主要是通过网页特效 settimeout来实现等网页加载完后再来加载图片哦。我在页面加载的时候加载一堆小缩略图, 这么多小的缩略图标签循环平铺下来,当单击小的图片时,动态加载大的图片显示,就类似于淘宝的商品查看图片。页面上有一个标签: 为了节省流量,加快页面载入速度,先不加载大图,当用户单击小图时,动态加载一张大图显示。 复制代码 代码如下: function switch_image(im) document.getelementbyid(big-image).src=im; 这种方式在ie6,7外所有的浏览器工作都正

32、常,比如 ie8,firefox, opera, chrome, safari。 就是ie6,7这两个浏览器加载不了,单击小图的时候,有时候你能加载,有时候加载一半,有时候不能加载。 我以为问题出在src这个东西上面,有可能ie6,7修改src不能正确加载图片,于是尝试把切换函数修改为: document.getelementbyid(pic-box).innerhtml=; ie6,7还是不行,于是想,有可能是图片被缓存了,那么加上随机数: document.getelementbyid(pic-box).innerhtml=; ie6,7依然不行。 于是在想,可能是img用在innerht

33、ml里面出现的问题,所以,改成用 appendchild var img = document.createelement(img); img.src= im; document.getelementbyid(pic-box).appendchild(img); 还是不行。 再修改成用 new image来:var img = new image(); img.src= im; document.getelementbyid(pic-box).appendchild(img); 还是不行。 百思不得其解,想,难道ie6,7不能动态加载图片吗?难道是img标签的问题? 既然这样就换成背景图加载吧

34、,于是 document.getelementbyid(pic-box).style.background=url( + im + ); ie6,7依然不行,上面这么多方法除ie6,7外其他都是正常的。 只有不停的google,结果google到了: ie6,7只有在用这样 动态加载图片是才会出现这种情况,google到的一篇说明:有几个吃饱了没事儿干的老外反复试验发现这个问题是ie6中一个底层机制的bug,之后的版本已经解决了。 据说或者这样使用a标签的话并不能阻止a标签最后触发一个什么行为, 导致ie6会错误的认为页面刷新或者重定向了,并且中断了当前所有连接,这样新图片的加载就被aborted了。 当然这些吃饱了没事儿干的老外们也提出了各种匪夷所思复杂无比的解决方案。最简单的方法有两个,一个是这样使用a标签,另外一个就是用div替换a标签来用。实际上我发现不仅是ie6,ie7也同样有这个bug,还有,采用:并不能解

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论