当前位置: 首页 > 科技观察

三种Javascript图片预加载方式详解

时间:2023-03-14 09:02:28 科技观察

预加载图片是提升用户体验的好方法。图片已预加载到浏览器中,因此访问者可以流畅地浏览您的网站并享受极快的加载时间。这对于图片占比较大的图库和网站来说是非常有利的。它确保图像可以快速无缝地发布,还可以帮助用户在浏览您的网站内容时获得更好的用户体验。本文将分享三种不同的预加载技术来增强网站性能和可用性。方法一:用css和JavaScript实现预加载图片的预加载有多种实现方式,包括使用css、JavaScript以及两者的各种组合。这些技术可以根据不同的设计场景设计相应的解决方案,非常高效。简单使用CSS可以轻松高效地预加载图像。代码如下:#preload-01{background:url(http://domain.tld/image-01.png)no-repeat-9999px-9999px;}#preload-02{background:url(http:///domain.tld/image-02.png)no-repeat-9999px-9999px;}#preload-03{background:url(http://domain.tld/image-03.png)no-repeat-9999px-9999px;}将这三个ID选择器应用于(X)html元素,我们可以通过CSSbackground属性将图像预加载到离屏背景上。只要这些图像的路径保持不变,当在网页的其他地方调用它们时,浏览器将在渲染期间使用预加载(缓存)的图像。简单、高效且不需要任何JavaScript。虽然高效,但该方法仍有改进的空间。使用此方法加载的图像将与页面上的其他内容一起加载,从而增加页面的整体加载时间。为了解决这个问题,我们添加了一些JavaScript代码来延迟预加载,直到页面加载完毕。代码如下:functionpreloader(){if(document.getElementById){document.getElementById("preload-01").style.background="url(http://domain.tld/image-01.png)no-repeat-9999px-9999px";document.getElementById("preload-02").style.background="url(http://domain.tld/image-02.png)no-repeat-9999px-9999px";document.getElementById("preload-03").style.background="url(http://domain.tld/image-03.png)no-repeat-9999px-9999px";}}functionaddLoadEvent(func){varoldonload=window。负载;if(typeofwindow.onload!='function'){window.onload=func;}else{window.onload=function(){if(oldonload){oldonload();}func();}}}addLoadEvent(预加载器);在脚本的第一部分,我们使用类选择器获取元素并在其上设置背景属性以预加载不同的图像。在脚本的第二部分,我们使用addLoadEvent()函数来延迟preloader()函数的加载时间,直到页面加载完毕。如果JavaScript在用户的浏览器中无法正常工作,会发生什么情况?很简单,不会预加载图片,当页面调用图片时,会正常显示。方法二:仅使用JavaScript实现预加载上面的方法有时候确实效率很高,但是在实际实现过程中我们逐渐发现它会消耗太多的时间。相反,我更喜欢使用纯JavaScript来实现图像预加载。下面是两种在所有现代浏览器中都能完美运行的预加载方法。JavaScript代码段1只需简单编辑加载所需图片的路径和名称即可,实现简单:

这种方法对于预加载大量图像特别有用。我的画廊网站使用了这种技术并预加载了50多张图片。将此脚本应用于登录页面,只要用户输入登录帐户,大部分图库图像就会被预加载。JavaScript代码段2这个方法和上面的方法类似,也可以预加载任意数量的图片。将以下脚本添加到任意网页中,根据程序说明进行编辑。
可以看到,每次加载图片的时候,都需要创建一个变量,比如"img1=newImage();”,以及图片来源地址声明,如“img3.src=“../path/to/image-003.gif”;”。参考这个模式,你可以加载任意数量的图片。我们进一步改进了方法。将此脚本包装在一个函数中,并使用addLoadEvent()来延迟预加载,直到页面加载完毕。functionpreloader(){if(document.images){varimg1=newImage();varimg2=newImage();varimg3=newImage();img1.src="http://domain.tld/path/to/image-001.gif";img2.src="http://domain.tld/path/to/image-002.gif";img3.src="http://domain.tld/path/to/image-003.gif";}}functionaddLoadEvent(func){varoldonload=window.onload;if(typeofwindow.onload!='function'){window.onload=func;}else{window.onload=function(){if(oldonload){oldonload();}func();}}}addLoadEvent(预加载器);方法三:使用Ajax实现预加载上面给出的方法似乎还不够酷,下面我们来看一个使用Ajax实现图片预加载的方法。此方法使用DOM不仅预加载图像,还预加载CSS、JavaScript和其他相关内容。与直接使用JavaScript相比,使用Ajax的好处是JavaScript和CSS的加载不会影响当前页面。该方法简单高效。window.onload=function(){setTimeout(function(){//XHRtorequestajsandaCSSvarxhr=newXMLHttpRequest();xhr.open('GET','http://domain.tld/preload.js');xhr.send('');xhr=newXMLHttpRequest();xhr.open('GET','http://domain.tld/preload.css');xhr.send('');//preloadimagenewImage().src="http://domain.tld/preload.png";},1000);};上面的代码预加载“preload.js”、“preload.css”和“preload.png”。1000ms超时是为了防止脚本挂起,导致正常页面出现功能问题。接下来我们看看如何用JavaScript实现加载过程:window.onload=function(){setTimeout(function(){//referencetovarhead=document.getElementsByTagName('head')[0];//anewCSSvarcss=document.createElement('link');css.type="text/css";css.rel="stylesheet";css.href="http://domain.tld/preload.css";//anewJSvarjs=document.createElement("script");js.type="text/javascript";js.src="http://domain.tld/preload.js";//preloadJSandCSShead.appendChild(css);head.appendChild(js);//preloadimagenewImage().src="http://domain.tld/preload.png";},1000);};这里我们通过DOM创建三个元素,实现三个文件的预加载。如上所述,使用Ajax,加载文件不会应用于加载页面。从这一点来看,Ajax方法优于JavaScript。