`
sealbird
  • 浏览: 570568 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

预加载与JavaScript的Image()对象 (转)

阅读更多
http://www.blogjava.net/sinoly/archive/2007/09/14/145161.html

     预加载与JavaScript的Image()对象 (转)
       很多高分辨率的图像真的能够扮靓一个Web网站。但是它们也可能会降低网站的(响应)速度——图像都是文件,文件就要占用带宽,而带宽与等待时间直接相关。现在是你进行自我学习,了解如何利用一种叫做图像预加载的小技巧给网站提速的时候了。

图像的预加载

       浏览器通常的工作方式是:只有当要求加载图像的HTTP请求被发送的时候,图像才会被加载,而不论它是被动地通过<img>标记加载,还是主动地通过方法调用加载。所以,如果你有一段JavaScript,需要在鼠标悬停的时候切换图像,或者在超时之后自动地更换图像,那么你就可能会在从服务器取回图像的时候随时碰到等待,时间会从数秒钟到几分钟不等。当你以较慢的速度连接到Internet上的时候,或者被取回的图像非常巨大的时候,这种状况尤其显著,而这种数据延迟通常都会毁掉你所期望的效果。

        有些浏览器会试图转嫁这一问题,比如把图像保存在本地缓冲区里,这样以后对它的调用就能够很快进行了,但是需要第一次调用图像的时候仍然会产生延迟。预加载是一项在需要图像之前就把它下载到缓冲区里的技术。通过这种方式,当真的需要图像的时候,它可以被从缓冲区里取出来,并立即显示出来。

Image()对象
        预加载图像最简单的方法用JavaScript将一个新的Image()对象实例化,并把你想要预加载的图像的URL传递给它。假设我们有一个叫做http://www.host01.com/Get/jsp/00040004/heavyimagefile.jpg的图像,我们希望,当用户把鼠标放在一个已经显示过的图像上的时,系统能够显示出这个图像。为了预加载这个图像,以便实现更快的响应时间,我们只用创建一个新的Image()对象,将其命名为heavyImage,并使用onLoad()事件处理程序把它同时加载到页面上。



1   < html >< head >< script  language  = "JavaScript" >  function  preloader()   {heavyImage  =   new  Image(); heavyImage.src = " http://www.host01.com/Get/jsp/00040004/heavyimagefile.jpg " ;} </ script ></ head >< body  onLoad ="javascript:preloader()" >< a  href ="#"  onMouseOver ="javascript:document.img01.src='http://www.host01.com/Get/jsp/00040004/heavyimagefile.jpg'" >< img  name ="img01"  src =http://www.host01.com/Get/jsp/00040004/"justanotherfile.jpg" ></ a ></ body ></ html > 
2  
 


          要注意的是,图像标记自身并不会处理onMouseOver()和onMouseOut()事件,这就是为什么上面例子里的<img>标记被放在一个<a>标记里,后者的确加入了对这些事件类型的支持。
用数组加载多个图像


           在实际操作中,你可能需要预加载一幅以上的图像;例如,在包含有多个图像翻滚(rollover)的菜单条里,或者如果你正在尝试创建平滑的动态效果。这并不困难;你所需要做的就是使用JavaScript的数组,就像下面例子里的一样:


1   < script language = " JavaScript " > function  preloader()   {  //  counter var i = 0; // create object imageObj = new Image(); // set image list images = new Array(); images[0]="image1.jpg" images[1]="image2.jpg" images[2]="image3.jpg" images[3]="image4.jpg" // start preloading for(i=0; i<=3; i++) { imageObj.src=images[i]; } 
2  }   </ script > 


         在上面的例子里,你先定义变量i和叫做imageObj的Image()对象。然后定义一个叫做images[]的新数组,在这个数组里,每个数组元素都保存着需要预加载的图像来源。最后,创建一个for()循环,让它在数组里循环,并将它们中的每一个都指派给Image()对象,这样就能够把它预加载到缓冲区里。
onLoad()事件处理程序
        就和JavaScript里的其它很多对象一样,Image()对象也带有多个事件处理程序。这其中最有用的毫无疑问的就是onLoad()处理程序了,它会在完成图像加载的时候被调用。这个处理程序可以与自定义的函数一起使用,以便在完成图像加载之后进行特定的任务。下面的例子通过在图像加载的时候显示“请等待(please wait)”提示信息来说明这个问题,然后在图像完成加载之后就向浏览器发送一个新的URL。



  < html >< head >< script  language ="JavaScript" >  //  create an image objectobjImage = new Image(); // set what happens once the image has loaded objImage.onLoad=imagesLoaded(); // preload the image fileobjImage.src='http://www.host01.com/Get/jsp/00040004/images/image1n.gif';// function invoked on image loadfunction imagesLoaded(){ document.location.href='index2.html';}</script></head><body>Please wait, loading images</body></html> 




       当然,你还可以创建一个图像数组,对它进行循环,预加载每个图像,并在每个阶段对已加载图像的数量保持跟踪。一旦加载了所有的图像,事件处理程序就能够按照设定把浏览器带到下一个页面(或者进行其他的任务)。

预加载与多状态菜单

          现在,把你刚刚学到的理论付诸真正的实践怎么样?下面一部分内容就是我碰巧编写的一段代码——一个由多个按钮(图像链接)组成的菜单条——其中每个按钮都可能处于三种状态中的一种:正常(normal)、hover(悬停)和点击(click)。由于所有的按钮都有多个状态,所以就有必要使用图像预加载来确保菜单能够根据其切换到的状态进行快速的响应。列表A里的代码就说了这一点。

           列表A里的HTML代码会建立一个由四个按钮组成的菜单条,每个按钮都有三种状态:正常、悬停和点击。其要求如下:

          但鼠标移动到处于正常状态的按钮上时,按钮会变为悬停状态。当鼠标移开的时候,按钮又会恢复到正常状态。当鼠标点击按钮的时候,按钮就会变为点击状态。它会一直保持这个状态,直到另外一个按钮被点击。如果有一个按钮被点击,那么其他的按钮就都不能处于点击状态。其他的按钮只能够处于悬停或者正常状态。一次只能有一个按钮可以被点击。一次只能有一个按钮处于悬停状态。
        第一项任务是建立保存有菜单每个状态的图像的数组。与这些数组元素相对应的<img>元素也都在HTML文档的主体里被创建,并按顺序命名。要注意的是,对数组值的索引是从0开始的,而相应的<img>元素是从1开始命名的——这就需要在脚本后面的一段里进行某种计算上的调整。

        PreloadImages()函数会负责把所有的图像都加载到缓冲区里,这样的话对鼠标移动的响应时间会被减到最小。一个for()循环被用在第一步里创建的图像里进行迭代,并预加载每一个图像。

            ResetAll()函数是把所有图像恢复都到它们正常状态的方便方法。这是有必要的,因为当菜单的项目被点击的时候,菜单里其他所有的项目都必须在被点击项目能够切换到点击状态之前恢复到正常状态。

        SetNormal()、setHover()和setClick()函数负责把特定图像(图像的编号被作为函数的自变量进行传递)的来源分别改为正常、悬停或者点击状态。由于被点击的图像必须一直保持点击状态,直到另外一个图像被点击(见第二项要求),所以它们暂时不会对鼠标移动作出反应;这样的话,如果按钮还不是处在点击状态,那么setNormal()和setHover()函数所包括的代码就只能用来改变按钮的状态。

         上面所提到的预加载只是提高你JavaScript效果响应时间的多种方法之一。就在你的网站上使用上面列出的技巧,并根据你的要求在需要的地方更改它们吧。祝你好运!

分享到:
评论

相关推荐

    js 利用image对象实现图片的预加载提高访问速度

    大量采用高解析度的图像的确可以让一个Web站点容光焕发。但同样也会造成站点访问速度下降——图片是文件,文件就要占用带宽,而带宽直接同访问... Image()对象 最简单的图像预装载办法是使用JavaScript新建一个新的Im

    blur-image, 在需要预加载的图像上,用于使模糊效果变得模糊的插件.zip

    blur-image, 在需要预加载的图像上,用于使模糊效果变得模糊的插件 模糊图像用于对需要预加载的图像产生模糊效果的插件。就像 medium 所做的: 安装使用 Bowerbower install --save blur-image然后,你只需将...

    js中Image对象以及对其预加载处理示例

    不显示在文档中的 Image 对象 对于不显示在文档中的 Image 对象时用 var 语句定义的: 代码如下: var myImage = new Image();或 var myImage = new Image(&lt;图片地址字符串&gt;); 然后就可以像一般 Image 对象一样...

    react-preload-image:预加载和淡入图像。 可选支持延迟加载

    :high_voltage: React预加载图像从背景颜色或占位符图像预加载和淡入图像。 对延迟加载的可选支持,以便在滚动到视图中时加载图像。 使用并在没有浏览器支持(咳嗽、IE、咳嗽)时退回到简单的预加载。用法使用yarn ...

    学习JavaScript图片预加载模块

    图片预加载的原理并不难,当给一个Image对象设置src属性后,图片就开始加载。给Image对象指定事件要位于设置src属性之前。 涉及到的内容 1.需要预加载的图片并不仅仅只是一张,通常将所有图片的信息保存在一个数组...

    再谈javascript图片预加载技术(详细演示)

    而本文所提到的预加载技术主要是让javascript快速获取图片头部数据的尺寸。一段典型的使用预加载获取图片大小的例子: 代码如下: var imgLoad = function (url, callback) { var img = new Image(); img.src = url; ...

    javascript图片预加载实例分析

    本文实例讲述了javascript图片预加载的方法。分享给大家供大家参考。具体如下: lightbox类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如filick相册的全屏效果)。javascript...

    javascript简单实现图片预加载

    简单的图片预加载 reloader.js 代码如下: var images = new Array();   function preloadImages(){  for (i=0; i &lt; preloadImages.arguments.length; i++){  images[i] = new Image();  images[i].src = ...

    gulp-preload-image:通过 CSS、Javascript 或 HTML 操作预加载图像的 gulp 扩展

    gulp-preload-image 是一个 Gulp 扩展,通过 CSS3(以及即将到来的 HTML 和 Javascript)作为管道的一部分将图像预加载添加到项目中。 使用。 var preload = require ( 'gulp-preload-image' ) ; 应用程序接口 预...

    多种js图片预加载实现方式分享

     显而易见我们使用img标签或者通过标签的background-image属性都可以实现图片的预加载。但是为了避免初次载入过多图片影响体验。一般最好在文档渲染完成以后再加载(使用[removed]等)。  2.纯js实现预加载 空城计...

    simple-image-preloader:一个简单的网页图片预加载器

    简单图像预加载器一个简单的网页图片预加载器

    【JavaScript源代码】JavaScript canvas实现加载图片.docx

    JavaScript canvas实现加载图片  本文实例为大家分享了JavaScript canvas实现加载图片的具体代码,供大家参考,具体内容如下 代码: &lt;!DOCTYPE html&gt;  &lt;html&gt;   &lt;head&gt; &lt;meta charset="utf-8"&gt; &lt;title&gt;...

    image-loader:各种图片预加载助手

    图像加载器用于图像预加载的简单帮助模块: 通过 url 预加载图像为加载的 img 标签设置 css 类(“加载”) 将预加载的图像附加为 img 或将其设置为 css 背景用于检查图片加载状态。 ####安装在您的项目中包含...

    walter.js:预加载具有 Promise 风格的图像

    Walter.js 是一个 Javascript 库,可以执行您在预加载图像时通常执行的所有常见操作。 这样Walter.js出口基础上的承诺和事件至极,你可以订阅了解每个图像的状态,一个简单的API。 应用程序接口 预加载一张图片 ...

    imageReady:javascript图片预加载,检测图片加载完成的组件(图片延迟加载)

    javascript图片预加载,监测图片加载完成,获取图片真实尺寸的组件(图片延迟加载) 如何使用 // 首先在页面中引入imageReady.js /** * @param img string|Image 图片url或者Image对象 * @param onready Function ...

    react-img-preload:用于图像预加载的高阶React组件

    用于图像预加载的高阶React组件 高阶React组件,可轻松处理组件中使用的图像的不同加载状态。 如果要在加载图像时在屏幕上显示某些内容,或者如果无法加载所需的图像,则可以提供一些默认图像,这可能会派上用场。...

    JavaScript详解(第2版)

     12.3.2 预加载图片和Image()构造函数   12.3.3 随机显示图片和onClick事件   12.3.4 图片地图与JavaScript   12.4 缩放图片以适应窗口   12.5 幻灯简介   12.5.1 带有控制按钮的简单幻灯展示   ...

    js预载入和JavaScript Image()对象使用介绍

    为了解决在canvas使用drawImage()时,遇到img对象来不及加载的问题; 我最终在html文档加载中,使用了下面"数组加载图像的办法”解决,如果有其他方法,请给予指点!

    image-preloader:预加载图像

    图像预加载器 预加载图像 执照 麻省理工学院

    plugin-image:图像预加载插件

    插件图像图像预加载插件

Global site tag (gtag.js) - Google Analytics