别天真了,达成图片预加载的三大方法及优缺点分析

别天真了,第①方 CSS 并不安全

2018/03/07 · CSS ·
安全

原来的书文出处:
Jake   译文出处:[众成翻译

  • KING]()   

不久前一段时间,关于 经过 CSS 创造“keylogger”(键盘记录器)
的座谈很多。

些微人伸手浏览器厂商去“修复”它。有个外人则深远钻研,表示它仅能影响通过类
React 框架建立的网站,并指责
React。而实在的题材却在于认为第2方内容是“安全”的。

预加载图片是增高用户体验的2个很好点子。图片预先加载到浏览器中,访问者便可顺利地在您的网站上冲浪,并享受到不慢的加载速度。那对图片画
廊及图片占据极大比例的网站以来12分造福,它保障了图片非常快、无缝地宣布,也可协助用户在浏览你网站内容时得到更好的用户体验。本文将分享多个不一致的预加
载技术,来增长网站的质量与可用性。 

预加载图片是增高用户体验的二个很好措施。图片预先加载到浏览器中,访问者便可顺利地在您的网站上冲浪,并享受到相当的慢的加载速度。这对图片画廊及图片占据不小比例的网站以来十二分方便人民群众,它保险了图片一点也不慢、无缝地公告,也可帮忙用户在浏览你网站内容时获得更好的用户体验。本文将享受七个不等的预加载技术,来进步网站的属性与可用性。

预加载图片是拉长用户体验的1个很好方式。图片预先加载到浏览器中,访问者便可顺遂地在您的网站上冲浪,并分享到非常的慢的加载速度。那对图片画廊及图片占据非常的大比例的网站的话很是有益,它保险了图片飞快、无缝地发布,也可帮助用户在浏览你网站内容时取得更好的用户体验。本文将享用四个不等的预加载技术,来抓牢网站的习性与可用性。

其三方图片

<img src=”;

1
<img src="https://example.com/kitten.jpg">

假使自身将上述代码引入小编的文书中,即意味着信任
example.com。对方可能会去除财富,给自己3个404,导致网站不完全,从而破坏那种信任关系。也许,他们或许会用其余非预期的数量来代表小猫图片的数量。

唯独,图片的熏陶仅限于成分本身的始末区域。小编得以向用户解释并希望用户相信,“此处的内容出自
example.com,假如它有误,则是原站点的难点,并不是本站造成的”。但那一个题材早晚不会影响到密码输入框等剧情。

措施一:用CSS和JavaScript完成预加载

兑现预加载图片有无数办法,包涵运用CSS、JavaScript及二者的种种组合。这几个技术可根据差异规划场景设计出相应的解决方案,十三分便捷。

单纯运用CSS,可简单、高效地预加载图片,代码如下:

Html代码  

  1. #preload-01 { background: url() no-repeat -9999px -9999px; }  
  2. #preload-02 { background: url() no-repeat -9999px -9999px; }  
  3. #preload-03 { background: url() no-repeat -9999px -9999px; }
      

将那多少个ID选择器应用到(X)HTML成分中,大家便可通过CSS的background属性将图片预加载到屏幕外的背景上。只要那个图片的路径
保持不变,当它们在Web页面包车型大巴其余地点被调用时,浏览器就会在渲染进程中采取预加载(缓存)的图形。简单、高效,不必要任何JavaScript。 

该情势尽管高速,但仍有改善余地。使用该法加载的图形会同页面的任何剧情一起加载,增添了页面包车型大巴完整加载时间。为了化解这几个题材,大家扩张了有个别JavaScript代码,来推延预加载的时辰,直到页面加载达成。代码如下:

Js代码  

  1. // better image preloading  
  2. function preloader() {  
  3.     if (document.getElementById) {  
  4.         document.getElementById(“preload-01”).style.background = “url() no-repeat -9999px -9999px”;  
  5.         document.getElementById(“preload-02”).style.background = “url() no-repeat -9999px -9999px”;  
  6.         document.getElementById(“preload-03”).style.background = “url() no-repeat -9999px -9999px”;  
  7.     }  
  8. }  
  9. function addLoadEvent(func) {  
  10.     var oldonload = window.onload;  
  11.     if (typeof window.onload != ‘function’) {  
  12.         window.onload = func;  
  13.     } else {  
  14.         window.onload = function() {  
  15.             if (oldonload) {  
  16.                 oldonload();  
  17.             }  
  18.             func();  
  19.         }  
  20.     }  
  21. }  
  22. addLoadEvent(preloader);  

在该脚本的率先有的,大家得到使用类选择器的成分,并为其设置了background属性,以预加载分化的图纸。

该脚本的第1局地,大家应用addLoad伊夫nt()函数来延缓preloader()函数的加载时间,直到页面加载完成。

若果JavaScript不能够在用户的浏览器中平常运作,会发生什么样?很简单,图片不会被预加载,当页面调用图片时,不奇怪展现即可。 

主意一:用CSS和JavaScript达成预加载

艺术一:用CSS和JavaScript完结预加载

其三方脚本

JavaScript

<script src=”;

1
<script src="https://example.com/script.js"></script>

与图片相比较,第二方脚本则有越多的控制权。倘诺本身将上述代码引入笔者的文本中,则象征自己赋予了
example.com 完全控制自己的网站的权限。该脚本能:

  • 读取/修改页面内容。
  • 监听用户的全部交互。
  • 运营花费多量测算能源的代码(如 cryptocoin 挖矿程序)。
  • 通过向本站发请求,那样能附带用户的
    cookie,转载响应。(译注:盗取用户的 cookie 及其他数据)
  • 读取/修改本地存款和储蓄。
  • ……能够做别的对方想做的工作。

“本地存款和储蓄”格外主要。假使脚本通过 IndexedDB 或缓存 API
发起攻击,则正是在剔除脚本后,攻击仍大概在任何站点内继续存在。

比方你引入了其余站点的剧本,则必须断然相信对方及对方的警务装备能力。

若果你面临恶意脚本的口诛笔伐,则可安装 Clear-Site-Data
header(清空站点数据响应头)
清除站点全体数据。

形式二:仅使用JavaScript达成预加载

上述方法有时的确很迅速,但大家稳步发现它在事实上落到实处过程中会花费太多时间。相反,小编更欣赏使用纯JavaScript来完结图片的预加载。上面将提供三种那样的预加载方法,它们得以极雅观貌地下工作作于拥有现代浏览器之上。 

JavaScript代码段1

只需简单编辑、加载所急需图片的门径与名称即可,很简单达成:

Html代码  

  1. <div>  
  2.     <script type=”text/javascript”>  
  3.         <!–//–><![CDATA[//><!– 
  4.         var images = new Array() 
  5.             function preload() { 
  6.                 for (i = 0; i < preload.arguments.length; i++) { 
  7.                     images[i] = new Image() 
  8.                     images[i].src = preload.arguments[i] 
  9.                 } 
  10.             } 
  11.             preload( 
  12.                 “”, 
  13.                 “”, 
  14.                 “” 
  15.             ) 
  16.         //–><!]]>  
  17.      </script>  
  18. </div>  

该措施越发适用预加载大量的图纸。小编的画廊网站采纳该技术,预加载图片数量达50多张。将该脚本金和利息用到登录页面,只要用户输入登录帐号,当先49%画廊图片将被预加载。 

JavaScript代码段2

该措施与地点的点子类似,也能够预加载任意数量的图形。将下边的剧本添参预别的web页中,依据程序指令展开编写制定即可。

Html代码  

  1. <div>  
  2.     <script type=”text/javascript”>  
  3.         <!–//–><![CDATA[//><!–  
  4.         if (document.images) { 
  5.                 img1 = new Image(); 
  6.                 img2 = new Image(); 
  7.                 img3 = new Image(); 
  8.                 img1.src = “”; 
  9.                 img2.src = “”; 
  10.                 img3.src = “”; 
  11.             } 
  12.         //–><!]]>  
  13.     </script>  
  14. </div>  

 

正如所看见,每加载五个图片都亟待创制1个变量,如“img1 = new
Image();”,及图片源地址表明,如“img3.src
=“../path/to/image-003.gif”;”。参考该方式,你可遵照必要加载任意多的图片。

小编们又对该措施进行了改革。将该脚本封装入一个函数中,并使用
addLoad伊芙nt(),延迟预加载时间,直到页面加载完成。

Js代码  

  1. function preloader() {  
  2.     if (document.images) {  
  3.         var img1 = new Image();  
  4.         var img2 = new Image();  
  5.         var img3 = new Image();  
  6.         img1.src = “”;  
  7.         img2.src = “”;  
  8.         img3.src = “”;  
  9.     }  
  10. }  
  11. function addLoadEvent(func) {  
  12.     var oldonload = window.onload;  
  13.     if (typeof window.onload != ‘function’) {  
  14.         window.onload = func;  
  15.     } else {  
  16.         window.onload = function() {  
  17.             if (oldonload) {  
  18.                 oldonload();  
  19.             }  
  20.             func();  
  21.         }  
  22.     }  
  23. }  
  24. addLoadEvent(preloader);   

兑现预加载图片有无数办法,包罗运用CSS、JavaScript及彼此的各个组合。那么些技巧可依据分歧规划场景设计出相应的消除方案,十三分飞速。
无非施用CSS,可简单、高效地预加载图片,代码如下:

贯彻预加载图片有好多方法,包蕴动用CSS、JavaScript及互相的各样组合。那些技能可根据不相同规划场景设计出相应的解决方案,13分快速。
别天真了,达成图片预加载的三大方法及优缺点分析。只有利用CSS,可简单、高效地预加载图片,代码如下:
#preload-01 { background: url(image-01.png) no-repeat -9999px -9999px;
}
#preload-02 { background: url(image-02.png) no-repeat -9999px -9999px;
}
#preload-03 { background: url(image-03.png) no-repeat -9999px -9999px;
}
将那多少个ID选择器应用到(X)HTML元素中,大家便可经过CSS的background属性将图纸预加载到荧屏外的背景上。只要这个图片的不二法门保持不变,当它们在Web页面包车型地铁其余省方被调用时,浏览器就会在渲染进程中应用预加载(缓存)的图样。不难、高效,不须求别的JavaScript。
该格局即便高速,但仍有创新余地。使用该法加载的图样会同页面的其它情节一起加载,增添了页面的全部加载时间。为了消除那一个题材,大家扩展了某个JavaScript代码,来拖延预加载的岁月,直到页面加载完结。代码如下:
function preloader() {
        if (document.getElementById) {
                document.getElementById(“p1”).style.background =
“url(image-01.png) no-repeat”;
                document.getElementById(“p2”).style.background =
“url(image-02.png) no-repeat”;
                document.getElementById(“p3”).style.background =
“url(image-03.png) no-repeat”;
        }
}
function addLoadEvent(func) {
        var oldonload = window.onload;
        if (typeof window.onload != ‘function’) {
                window.onload = func;
        } else {
                window.onload = function() {
                        if (oldonload) {
                                oldonload();
                        }
                        func();
                }
        }
}
addLoadEvent(preloader);

第三方CSS

JavaScript

<link rel=”stylesheet” href=”;

1
<link rel="stylesheet" href="https://example.com/style.css">

比较图片,CSS 在力量上更接近脚本。像脚本一样,它适用于一体页面。它能够:

  • 删除/添加/修改页面内容。
  • 传说页面内容提倡呼吁。
  • 可响应二种用户交互。

即便 CSS 不可能改改本地存款和储蓄,也不可能经过 CSS 运转 cryptocoin
挖矿程序(恐怕是或许的,只是自小编不知底而已),但恶意 CSS
代码依然能导致非常的大的损失。

措施三:使用Ajax完结预加载

上面所提交的主意仿佛不够酷,那现在来看3个选取Ajax完成图片预加载的章程。该措施应用DOM,不仅仅预加载图片,还会预加载CSS、
JavaScript等皮之不存毛将焉附的事物。使用Ajax,比直接使用JavaScript,优越之处在于JavaScript和CSS的加载会潜移默化到当前页面,而Ajax不会,使用Ajax该格局不难、高效。

Js代码  

  1. window.onload = function() {  
  2.     setTimeout(function() {  
  3.         // XHR to request a JS and a CSS  
  4.         var xhr = new XMLHttpRequest();  
  5.         xhr.open(‘GET’, ”);  
  6.         xhr.send(”);  
  7.         xhr = new XMLHttpRequest();  
  8.         xhr.open(‘GET’, ”);  
  9.         xhr.send(”);  
  10.         // preload image  
  11.         new Image().src = “”;  
  12.     }, 1000);  
  13. };   

上边代码预加载了“preload.js”、“preload.css”和“preload.png”。1000微秒的逾期是为着避防脚本挂起,而致使健康页面出现作用难点。 

上边,我们看看怎么着用JavaScript来贯彻该加载过程:

Js代码  

  1. window.onload = function() {  
  2.     setTimeout(function() {  
  3.         // reference to <head>  
  4.         var head = document.getElementsByTagName(‘head’)[0];  
  5.         // a new CSS  
  6.         var css = document.createElement(‘link’);  
  7.         css.type = “text/css”;  
  8.         css.rel  = “stylesheet”;  
  9.         css.href = “”;  
  10.         // a new JS  
  11.         var js  = document.createElement(“script”);  
  12.         js.type = “text/javascript”;  
  13.         js.src  = “”;  
  14.         // preload JS and CSS  
  15.         head.appendChild(css);  
  16.         head.appendChild(js);  
  17.         // preload image  
  18.         new Image().src = “”;  
  19.     }, 1000);  
  20. };   

那边,大家透过DOM创制三个要向来贯彻多个文本的预加载。正如下边提到的那样,使用Ajax,加载文件不会选取到加载页面上。从那点上看,Ajax方法优越于JavaScript。

复制代码 代码如下:

在该脚本的率先某些,大家获取使用类选择器的成分,并为其安装了background属性,以预加载区别的图片。
该脚本的第①有的,大家选择addLoad伊芙nt()函数来推迟preloader()函数的加载时间,直到页面加载达成。
若果JavaScript不可能在用户的浏览器中符合规律运营,会发生什么样?很简短,图片不会被预加载,当页面调用图片时,符合规律展现即可。

键盘记录器

从滋生广大关切的代码初阶讲起:

input[type=”password”][value$=”p”] { background: url(‘/password?p’);
}

1
2
3
input[type="password"][value$="p"] {
  background: url(‘/password?p’);
}

假定输入框的 value 属性值以 p 结尾,上述代码将会向 /password?p
发起呼吁。每种字符都可触及那个操作,通过它能博取到很多多少。

默许意况下,浏览器不会将用户输入的值存储在 value
属性中,因而那种攻击必要正视有个别能共同这么些值的东西,如 React。

要应对那个标题,React
可用另一种共同密码字段的办法,或浏览器可限制那几个能匹配密码字段属性的选择器。可是,这可是是一种虚假的长治。你只化解了在相当景况下的该难题,而其余景况依旧。

假使 React 改为运用 data-value
属性,则该回应格局行不通。借使网站将输入框更改为
type="text",以便用户能够看来他俩正在输入的内容,则该回应形式行不通。假如网站创造了叁个
<better-password-input> 组件并揭示 value
作为品质,则该答复方法行不通。

别的,还有为数不少任何的基于 CSS 的攻击形式:

#preload-01 { background: url()
no-repeat -9999px -9999px; }   
#preload-02 { background: url()
no-repeat -9999px -9999px; }   
#preload-03 { background: url()
no-repeat -9999px -9999px; } 

办法二:仅使用JavaScript实现预加载

冰释的情节

body { display: none; } html::after { content: ‘HTTP 500 Server Error’;
}

1
2
3
4
5
6
7
body {
  display: none;
}
 
html::after {
  content: ‘HTTP 500 Server Error’;
}

以上是1个极端的例子,但想象一下,假使第1方仅对某一小部分用户那样做。不但你很难调节和测试,还会失去用户的深信。

更狡猾的措施如偶尔删除“购买”按钮,或重排内容段落。

将那八个ID采用器应用到(X)HTML元素中,大家便可通过CSS的background属性将图纸预加载到荧屏外的背景上。只要那一个图片的门径保持不变,当它们在Web页面包车型地铁任什么地方方被调用时,浏览器就会在渲染进度中运用预加载(缓存)的图形。简单、高效,不要求此外JavaScript。
该方式即使高效,但仍有创新余地。使用该法加载的图样会同页面包车型客车此外内容一起加载,扩大了页面包车型地铁一体化加载时间。为了缓解那几个难点,我们扩张了部分JavaScript代码,来推迟预加载的岁月,直到页面加载完成。代码如下:

上述方式有时的确很高效,但大家稳步察觉它在实质上落到实处进度中会成本太多时间。相反,小编更爱好使用纯JavaScript来完成图片的预加载。上面将提供二种那样的预加载方法,它们能够很美丽貌地下工作作于拥有现代浏览器之上。

丰盛内容

.price-value::before { content: ‘1’; }

1
2
3
.price-value::before {
  content: ‘1’;
}

哦,价格被标高了。

复制代码 代码如下:

JavaScript代码段1
<div class=”hidden”>
        <script type=”text/javascript”>
                <!–//–><![CDATA[//><!–
                        var images = new Array()
                        function preload() {
                                for (i = 0; i <
preload.arguments.length; i++) {
                                        images[i] = new Image()
                                        images[i].src =
preload.arguments[i]                                }
                        }
                        preload(
                               
“”,
                               
“”,
                               
“”
                        )
                //–><!]]>
        </script>
</div>
只需简单编辑、加载所需求图片的不二法门与名称即可,很不难完结:
该格局特别适用预加载大批量的图形。作者的画廊网站使用该技术,预加载图片数量达50多张。将该脚本金和利息用到登录页面,只要用户输入登录帐号,超过百分之二十五画廊图片将被预加载。 

挪动内容

.delete-everything-button { opacity: 0; position: absolute; top: 500px;
left: 300px; }

1
2
3
4
5
6
.delete-everything-button {
  opacity: 0;
  position: absolute;
  top: 500px;
  left: 300px;
}

上边包车型大巴按钮能做一些首要的操作,设置其为不可知,然后放在用户恐怕点击的地方。

值得庆幸的是,如果按钮的操作确实足够关键,网站恐怕会先出示确认对话框。但也不是不足绕过,只需利用越来越多的
CSS 来招摇撞骗用户点击 “分明” 按钮而不是“撤销”按钮即可。

假如浏览器确实接纳地点的对答办法消除“键盘记录器”的难题。攻击者只需在页面上找到三个非密码文本输入框(大概是寻觅输入框)并将其盖在密码输入框上即可。然后他们的口诛笔伐就又可用了。

// better image preloading @ <A
href=”>
function preloader() {   
    if (document.getElementById) {   
        document.getElementById(“preload-01”).style.background =
“url() no-repeat -9999px -9999px”;   
        document.getElementById(“preload-02”).style.background =
“url() no-repeat -9999px -9999px”;   
        document.getElementById(“preload-03”).style.background =
“url() no-repeat -9999px -9999px”;   
    }   
}   
function addLoadEvent(func) {   
    var oldonload = window.onload;   
    if (typeof window.onload != ‘function’) {   
        window.onload = func;   
    } else {   
        window.onload = function() {   
            if (oldonload) {   
                oldonload();   
            }   
            func();   
        }   
    }   
}   
addLoadEvent(preloader); 

JavaScript代码段2
<div class=”hidden”>
        <script type=”text/javascript”>
                <!–//–><![CDATA[//><!–
                        if (document.images) {
                                img1 = new Image();
                                img2 = new Image();
                                img3 = new Image();
                                img1.src =
“”;
                                img2.src =
“”;
                                img3.src =
“”;
                        }
                //–><!]]>
        </script>
</div>
该办法与地方的点子类似,也足以预加载任意数量的图片。将上面包车型大巴本子添参预其它Web页中,依据程序指令实行编辑即可。

读取属性

实质上,你须要操心的不光是密码输入框。你可能在性质中保留着此外的藏匿内容:

JavaScript

<input type=”hidden” name=”csrf” value=”1687594325″> <img
src=”/avatars/samanthasmith83.jpg”> <iframe
src=”//cool-maps-service/show?st-pancras-london”></iframe>
<img src=”/gender-icons/female.png”> <div></div>

1
2
3
4
5
<input type="hidden" name="csrf" value="1687594325">
<img src="/avatars/samanthasmith83.jpg">
<iframe src="//cool-maps-service/show?st-pancras-london"></iframe>
<img src="/gender-icons/female.png">
<div></div>

具备那几个都足以透过 CSS 选用器获取,且能发出请求。

在该脚本的第三有的,大家取得使用类采取器的因素,并为其设置了background属性,以预加载分化的图纸。
该脚本的第三有的,我们选取addLoad伊夫nt()函数来延缓preloader()函数的加载时间,直到页面加载完结。
假若JavaScript不能够在用户的浏览器中符合规律运转,会时有发生什么?极粗略,图片不会被预加载,当页面调用图片时,符合规律显示即可。

正如所看见,每加载2个图纸都须要创制贰个变量,如“img1 = new
Image();”,及图片源地址注解,如“img3.src =
“../path/to/image-003.gif”;”。参考该方式,你可依照必要加载任意多的图形。

监听交互

JavaScript

.login-button:hover { background: url(‘/login-button-hover’); }
.login-button:active { background: url(‘/login-button-active’); }

1
2
3
4
5
6
7
.login-button:hover {
  background: url(‘/login-button-hover’);
}
 
.login-button:active {
  background: url(‘/login-button-active’);
}

可将 hover 和 active 状态发送到服务器。通过适当的
CSS,你就能取获得用户意图。

主意二:仅使用JavaScript达成预加载

小编们又对该情势开始展览了革新。将该脚本封装入八个函数中,并使用
addLoad伊夫nt(),延迟预加载时间,直到页面加载达成。
function preloader() {
        if (document.images) {
                var img1 = new Image();
                var img2 = new Image();
                var img3 = new Image();
                img1.src = “”;
                img2.src = “”;
                img3.src = “”;
        }
}
function addLoadEvent(func) {
        var oldonload = window.onload;
        if (typeof window.onload != ‘function’) {
                window.onload = func;
        } else {
                window.onload = function() {
                        if (oldonload) {
                                oldonload();
                        }
                        func();
                }
        }
}
addLoadEvent(preloader);
方法三:使用Ajax完毕预加载

读取文本

JavaScript

@font-face { font-family: blah; src: url(‘/page-contains-q’)
format(‘woff’); unicode-range: U+85; } html { font-family: blah,
sans-serif; }

1
2
3
4
5
6
7
8
9
@font-face {
  font-family: blah;
  src: url(‘/page-contains-q’) format(‘woff’);
  unicode-range: U+85;
}
 
html {
  font-family: blah, sans-serif;
}

在那种情形下,假如页面内有 q
字符,则会发送请求。你能够为分裂的字符,并针对一定的要素,创设大气例外的书体。字体也足以涵盖
ligature(连字),所以你能够在早先检查和测试字符连串。你甚至足以经过
将字体技巧与滚动条检查和测试结合起来
来推测内容。

译注:关于 ligature(连字), 可查看 Wikipedia Typographic
Ligature

上述措施有时的确很高效,但大家逐步发现它在其实贯彻过程中会开支太多时间。相反,笔者更欣赏使用纯JavaScript来贯彻图片的预加载。上边将提供二种那样的预加载方法,它们得以很美丽地工作于拥有现代浏览器之上。

上面所提交的章程就像不够酷,那未来来看1个用到Ajax实现图片预加载的艺术。该方法应用DOM,不仅仅预加载图片,还会预加载CSS、JavaScript等有关的东西。使用Ajax,比直接选拔JavaScript,优越之处在于JavaScript和CSS的加载不会潜移默化到当下页面。该方法不难、高效。
window.onload = function() {
        setTimeout(function() {
                // XHR to request a JS and a CSS
                var xhr = new XMLHttpRequest();
                xhr.open(‘GET’, ”);
                xhr.send(”);
                xhr = new XMLHttpRequest();
                xhr.open(‘GET’, ”);
                xhr.send(”);
                // preload image
                new Image().src = “”;
        }, 1000);
};
地点代码预加载了“preload.js”、“preload.css”和“preload.png”。一千皮秒的晚点是为了避防万一脚本挂起,而造成健康页面出现作用难题。

其三方内容不安全

那么些只是自家所理解的有个别技巧,笔者深信不疑还有更加多。

其三方内容在其沙箱区域内部存储器有强有力的力量。一张图片或沙盒化的 iframe
仅在三个小范围内的沙箱中,但脚本和样式的界定却是你的页面,甚至是一切站点。

即便你担心恶意用户诱使你的网站加载第1方财富,能够通过
CSP
用作预防手段,其得以界定加载图片,脚本和体裁的来自。

你仍可以动用 Subresource Integrity(子财富全体性

来确定保障脚本/样式的剧情卓殊特定的 hash,不然将不加载。谢谢 Hacker
News上的Piskvorrr
提醒我!

假若您想明白越来越多如上述的 hack 技巧,包罗滚动条技巧,更加多消息请参阅
Mathias Bynens’ talk from
2014,Mike West’s talk from
2013,或 Mario Heiderich
et al.’s paper from
2012(PDF)。是的,那不是哪些新东西。

1 赞 1 收藏
评论

澳门葡京 1

JavaScript代码段1
只需简单编辑、加载所急需图片的途径与名称即可,很简单完毕:

上面,大家看看哪些用JavaScript来落实该加载进度:
window.onload = function() {
        setTimeout(function() {
                // reference to <head>
                var head = document.getElementsByTagName(‘head’)[0];
                // a new CSS
                var css = document.createElement(‘link’);
                css.type = “text/css”;
                css.rel  = “stylesheet”;
                css.href = “”;
                // a new JS
                var js  = document.createElement(“script”);
                js.type = “text/javascript”;
                js.src  = “”;
                // preload JS and CSS
                head.appendChild(css);
                head.appendChild(js);
                // preload image
                new Image().src = “”;
        }, 1000);
};
此地,我们通过DOM成立三个成分来落到实处三个公文的预加载。正如上边提到的这样,使用Ajax,加载文件不会使用到加载页面上。从这一点上看,Ajax方法优越于JavaScript。

复制代码 代码如下:

<div class=”hidden”>   
    <script type=”text/javascript”>   
        <!–//–><![CDATA[//><!–             var
images = new Array()   
            function preload() {   
                for (i = 0; i < preload.arguments.length; i++) {   
                    images[i] = new Image()   
                    images[i].src = preload.arguments[i]   
                }   
            }   
            preload(   
                “”,   
                “”,   
                “” 
            )   
        //–><!]]>     </script>   
</div> 

该格局越发适用预加载大批量的图形。小编的画廊网站选拔该技能,预加载图片数量达50多张。将该脚本金和利息用到登录页面,只要用户输入登录帐号,超过半数画廊图片将被预加载。

JavaScript代码段2
该方法与地点的法门类似,也得以预加载任意数量的图片。将上边包车型地铁脚本添参与其它Web页中,依照程序指令展开编写制定即可。

复制代码 代码如下:

<div class=”hidden”>
    <script type=”text/javascript”>
        <!–//–><![CDATA[//><!–             if
(document.images) {
                img1 = new Image();
                img2 = new Image();
                img3 = new Image();
                img1.src =
“”;
                img2.src =
“”;
                img3.src =
“”;
            }
        //–><!]]>     </script>
</div>

正如所看见,每加载三个图片都急需创立三个变量,如“img1 = new
Image();”,及图片源地址表明,如“img3.src =
“../path/to/image-003.gif”;”。参考该情势,你可依照须要加载任意多的图样。
我们又对该方法开展了立异。将该脚本封装入2个函数中,并利用
addLoad伊芙nt(),延迟预加载时间,直到页面加载完成。

复制代码 代码如下:

function preloader() {   
澳门葡京 ,    if (document.images) {   
        var img1 = new Image();   
        var img2 = new Image();   
        var img3 = new Image();   
        img1.src = “”;   
        img2.src = “”;   
        img3.src = “”;   
    }   
}   
function addLoadEvent(func) {   
    var oldonload = window.onload;   
    if (typeof window.onload != ‘function’) {   
        window.onload = func;   
    } else {   
        window.onload = function() {   
            if (oldonload) {   
                oldonload();   
            }   
            func();   
        }   
    }   
}   
addLoadEvent(preloader); 

措施三:使用Ajax完结预加载

上面所付出的主意如同不够酷,那现在来看一个应用Ajax完成图片预加载的章程。该方式运用DOM,不仅仅预加载图片,还会预加载CSS、JavaScript等相关的事物。使用Ajax,比一贯利用JavaScript,优越之处在于JavaScript和CSS的加载不会影响到当前页面。该形式不难、高效。

复制代码 代码如下:

window.onload = function() {   
    setTimeout(function() {   
        // XHR to request a JS and a CSS         var xhr = new
XMLHttpRequest();   
        xhr.open(‘GET’, ”);   
        xhr.send(”);   
        xhr = new XMLHttpRequest();   
        xhr.open(‘GET’, ”);   
        xhr.send(”);   
        // preload image         new Image().src =
“”;   
    }, 1000);   
}; 

上边代码预加载了“preload.js”、“preload.css”和“preload.png”。1000微秒的过期是为着幸免脚本挂起,而招致健康页面出现功效难点。
上面,大家看看哪些用JavaScript来实现该加载进度:

复制代码 代码如下:

window.onload = function() {   
    
    setTimeout(function() {   
    
        // reference to <head>          
        var head = document.getElementsByTagName(‘head’)[0];   
    
        // a new CSS           
        var css = document.createElement(‘link’);   
        css.type = “text/css”;   
        css.rel  = “stylesheet”;   
        css.href = “”;   
    
        // a new JS           
        var js  = document.createElement(“script”);   
        js.type = “text/javascript”;   
        js.src  = “”;   
    
        // preload JS and CSS         head.appendChild(css);   
        head.appendChild(js);   
    
        // preload image           
        new Image().src = “”;   
    
    }, 1000);   
    
}; 

那边,大家因此DOM创造多少个因从来贯彻多少个文件的预加载。正如上面提到的那么,使用Ajax,加载文件不会采用到加载页面上。从那点上看,Ajax方法优越于JavaScript。

好了,本文就先介绍到这里,三种实现图片预加载技术的措施大家都曾经精通了吧,具体哪个更迅捷,笔者想小伙伴们也都看出来了,那就使用到自个儿的类型中呢。

您只怕感兴趣的篇章:

  • 利用CSS、JavaScript及Ajax完成图片预加载的措施
  • 选择CSS、JavaScript及Ajax完结火速的图形预加载
  • 四种js图片预加载落成情势分享
  • jquery落成图片预加载
  • jQuery简单落到实处图片预加载
  • Jquery达成图片预加载与延时加载的法门
  • js图片预加载示例
  • JS实现图片预加载无需等待
  • jQuery图片预加载
    等比缩放达成代码
  • js 完成图片预加载(js操作 Image对象属性complete ,事件onload
    异步加载图片)
  • jquery 图片预加载
    自动等比例缩放插件
  • 使用CSS、JavaScript及Ajax完毕图片预加载的三大措施

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website