`
ariyue
  • 浏览: 345323 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

javascript图片浏览器的核心:图片预加载

阅读更多
来源:热爱斯诺克的程序员 - 博客园

  网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考虑流量的话,大可以像 pconline一样每个页面只显示一张图片,让用户每看一张图片就需要重新下载一下整个页面。不过,在web2.0时代,更多人愿意用 .来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图片。

  知道了一张图片的地址,需要把它在一个固定大小的html容器(可以是div等)里边显示出来,最重要的当然是需要知道这张即将显示的图片的宽和高,然后再结合容器的宽和高,按照一定的缩放比例使图片显示出来。因此,实现图片预加载就成为图片浏览器的核心功能了。

  做过图片翻转效果的朋友其实都知道,要让图片轮换的时候不出现等待,最好是先让图片下载到本地,让浏览器缓存起来。这时,一般都会用到js里边的Image对象。一般的手段无非这样:

function preLoadImg(url) {
var img = new Image();
img.src = url;
}

  通过调用preLoadImg函数,传入图片的url,就能使图片预先下载下来了。实际上,这里用到的预下载功能也和这基本一致。图片预下载下来后,通过 img的width和height属性,就能知道图片的宽和高了。但是需要考虑到,在做图片浏览器功能时,图片都是实时显示的。比如你点了显示的按钮,这个时候才会调用上边类似的代码来加载图片。因此,如果你直接用img.width的时候,图片还没有完全下载下来。因此,需要用一些异步的方法,等到图片下载完毕的时候才会再对img的width和height进行调用。

  实现这样的异步方法实际上不难,图片的下载完毕事件也很简单,就是简单的onload事件。因此,我们可以写出下面的代码:

function loadImage(url, callback) {
var img = new Image();
img.src = url;

img.onload = function(){ //图片下载完毕时异步调用callback函数。
callback.call(img); // 将callback函数this指针切换为img。
};
}

  好了,再来写一个测试用例。

function imgLoaded(){
alert(this.width);
}
<input type="button" value="loadImage" .click="loadImage('aaa.jpg',imgLoaded)"/>

  在firefox中测试一下,发现不错,果然和预想的效果一样,在图片下载后,就会弹出图片的宽度来。无论点击多少次或者刷新结果都一样。

  不过,做到这一步,先别高兴太早——还需要考虑一下浏览器的兼容性,于是,赶紧到ie里边测试一下。没错,同样弹出了图片的宽度。但是,再点击load的时候,情况就不一样了,什么反应都没有了。刷新一下,也同样如此。

  经过对多个浏览器版本的测试,发现ie6、opera都会这样,而firefox和safari则表现正常。其实,原因也挺简单的,就是因为浏览器的缓存了。当图片加载过一次以后,如果再有对该图片的请求时,由于浏览器已经缓存住这张图片了,不会再发起一次新的请求,而是直接从缓存中加载过来。对于 firefox和safari,它们视图使这两种加载方式对用户透明,同样会引起图片的onload事件,而ie和opera则忽略了这种同一性,不会引起图片的onload事件,因此上边的代码在它们里边不能得以实现效果。

  怎么办呢?最好的情况是Image可以有一个状态值表明它是否已经载入成功了。从缓存加载的时候,因为不需要等待,这个状态值就直接是表明已经下载了,而从http请求加载时,因为需要等待下载,这个值显示为未完成。这样的话,就可以搞定了。

  经过一些分析,终于发现一个为各个浏览器所兼容的Image的属性——complete。所以,在图片onload事件之前先对这个值做一下判断即可。最后,代码变成如下的样子:

function loadImage(url, callback) {
var img = new Image(); //创建一个Image对象,实现图片的预下载
img.src = url;

if (img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数
callback.call(img);
return; // 直接返回,不用再处理onload事件
}

img.onload = function () { //图片下载完毕时异步调用callback函数。
callback.call(img); //将回调函数的this替换为Image对象
};
};

  经过这么一番折腾,总算是让各个浏览器都能满足我们的目标了。虽然代码很简单,但是却把图片浏览器中最核心的问题解决掉了,接下来你所要做的,仅仅是图片如何呈现的问题了。
分享到:
评论

相关推荐

    网络图片浏览器核心代码

    用户体验是图片浏览器的关键,包括快速加载、平滑滚动、预加载机制、手势操作、全屏查看、图片放大缩小等功能,都需要精心设计和实现。 综上所述,“网络图片浏览器核心代码”涵盖了多个IT领域的技术,包括前端...

    js图片预加载

    图片预加载的核心思想是利用JavaScript动态创建`<img>`元素,设置其`src`属性为待加载图片的URL,从而触发浏览器下载图片。一旦图片加载完成,浏览器会将图片缓存,当用户滚动到相应位置或触发特定事件时,图片能...

    图片浏览器——JS

    4. 图片预加载:为了避免用户在切换图片时出现延迟,可以使用JavaScript预先加载下一张或多张图片。 5. 兼容性和性能优化:考虑到不同浏览器的兼容性问题,可能需要使用polyfill或条件语句来确保代码在各种环境下都...

    Jquery实例--图片预加载

    图片预加载的核心在于,在图片实际显示之前,提前发起请求获取图片数据。这样当用户滚动到相应位置或点击按钮显示图片时,图片已经存在于浏览器的缓存中,可以立即展示,提高了页面的响应速度。 以下是一个基本的...

    图片预加载插件preloadjs

    preloadjs 是一款强大的JavaScript库,专为实现资源预加载而设计,包括图片、音频、字体等。在本文中,我们将深入探讨preloadjs的功能、使用方法以及其在实际项目中的应用。 ### 1. preloadjs 简介 preloadjs 是由...

    js浏览器可视范围图片加载.rar

    5. **优化**:为了进一步提升性能,可以预加载部分即将进入视口的图片,或者在图片离开视口时取消加载,以节省资源。 6. **兼容性处理**:考虑到老旧浏览器可能不支持某些特性,如Intersection Observer API,需要...

    JS加载load图片jquery.LoadImage图片预加载(逐渐加载)demo

    "JS加载load图片jquery.LoadImage图片预加载(逐渐加载)demo"这个项目就是针对这个问题提供的一种解决方案,它利用JavaScript和jQuery库来实现图片的预加载和逐渐加载,从而提高网页的加载速度和用户交互体验。...

    高速浏览器

    1. 快速加载:高速浏览器通过优化渲染引擎,能够快速解析HTML、CSS和JavaScript,使得网页加载速度显著提升。这可能涉及到预加载、预渲染等技术,以便用户在点击链接后迅速看到内容。 2. 资源管理:高效的内存管理...

    解析javascript图片懒加载与预加载的分析总结

    2. JavaScript预加载:通过JavaScript动态创建图片元素,并设置其src属性值。图片加载完成后再将图片元素添加到页面中。 3. HTML预加载:通过在HTML中添加img标签,但不设置其src属性,然后通过JavaScript设置src来...

    网页图片浏览器js实现

    1. **图片预加载**:为了提供流畅的浏览体验,图片浏览器会预先加载一部分图片,避免用户在切换图片时出现明显的延迟。这可以通过创建`Image`对象并设置其`src`属性来实现,即使图片并未立即显示,也可以开始下载。 ...

    带有图片预加载技术的jquery图片幻灯代码.rar

    图片预加载技术是该插件的核心特性。它是指在用户实际看到图片之前,浏览器就已经开始下载后续或可能需要的图片。这样做的好处在于减少延迟,提高用户体验。在网络连接不稳定或者速度较慢的情况下,如果没有预加载,...

    jQuery基于modernizr.js瀑布流图片预加载动画特效

    通过使用modernizr,我们可以检测用户浏览器是否支持CSS3的transform、transition等关键特性,这对于实现瀑布流布局和图片预加载动画至关重要。如果浏览器不支持这些特性,modernizr会添加相应的CSS类到HTML元素,...

    jQuery图片浏览器源码

    6. 图片预加载:在用户切换图片之前预先加载下一张图片,确保流畅的浏览体验。 7. 自定义样式:开发者可以根据需求自定义界面样式和布局。 三、jQuery实现图片浏览器的技术细节 1. DOM操作:jQuery提供了方便的API...

    以AJAX方式加载图片=异步加载图片,先显示个图片的占位图片 此技术常见于漫画网站.zip

    在网页开发中,异步加载图片(以AJAX方式加载图片)是一种常见的优化技术,尤其在处理大量图片的场景下,比如漫画...通过合理利用占位图片、图片预加载和浏览器缓存机制,可以显著优化用户体验,同时减轻服务器负担。

    jquery.LoadImage图片预加载.zip

    预加载机制能够在用户滚动页面或者点击某个链接之前,就开始下载图片,这样当用户实际需要查看图片时,图片已经存在于浏览器缓存中,可以迅速显示,避免了页面加载中的空白期,提升了用户的浏览体验。 该插件的核心...

    原生无依赖预加载插件

    预加载技术的核心是预先获取用户可能需要但尚未立即使用到的资源,如图片、音频、视频或脚本,以便在实际需要时能够更快地加载和执行,减少页面加载延迟。 在JavaScript开发中,预加载常用于处理异步资源加载,避免...

    ASP.NET图片预加载 实例

    预加载技术的核心是预先载入用户可能会需要的图片,这样当用户滚动页面或点击某个链接时,图片可以快速地显示出来,避免了因网络延迟而造成的视觉空白。在本实例中,我们将探讨如何在ASP.NET环境中实现图片的懒加载...

    JS制作的图片浏览器

    如果希望实现更高级的功能,如幻灯片自动播放、图片预加载或者键盘导航,我们可以扩展这个基础模型。例如,可以设置一个定时器来定期调用`showNextImage()`,实现自动切换效果: ```javascript var ...

    Jquery 图片浏览器

    1. **图片预加载**:为了提高用户体验,图片浏览器会预先加载下一张图片,避免用户在切换时等待加载时间。 2. **事件处理**:利用jQuery的事件处理机制,监听用户的点击、滑动等操作,触发相应的图片切换。 3. **...

    jQuery实现的图片异步加载和预加载特效源码.zip

    - **132689888867742744**:这个文件名可能是JavaScript或CSS文件,可能是实现异步加载和预加载特效的核心代码。通常,它会包含处理图片加载逻辑的函数,以及可能的配置选项。 4. **实践应用**: - **适应性**:...

Global site tag (gtag.js) - Google Analytics