激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - js教程 - js中延遲加載和預(yù)加載的具體使用

js中延遲加載和預(yù)加載的具體使用

2021-12-31 16:42Yushia js教程

這篇文章主要介紹了js中延遲加載和預(yù)加載的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

延遲加載(懶加載)和預(yù)加載是常用的 web 優(yōu)化的手段。。

一、延遲加載(懶加載)

原理: 當(dāng)在真正需要數(shù)據(jù)的時(shí)候,才真正執(zhí)行數(shù)據(jù)加載操作。
目的: 延遲加載機(jī)制是為了避免一些無謂的性能開銷而提出來的

實(shí)現(xiàn)延遲加載的幾種方法

1. 讓 js 最后加載

使用方法: 把 js 外部引入的文件放到頁面底部
用途: 讓 js 最后引入,從而加快頁面加載速度
說明:
流覽器之所以會(huì)采用同步模式,通常加載 js 文件或者放<script>標(biāo)簽都在結(jié)構(gòu)最后面,也是因?yàn)樗鼤?huì)阻止瀏覽器后續(xù)操作的原因,所以放在后面,當(dāng)頁面結(jié)構(gòu)和樣式全部渲染完成再執(zhí)行 js,提升用戶體驗(yàn)

2. defer 屬性

使用方法: 為 <script>標(biāo)簽定義了 defer屬性。
用途: 讓腳本在執(zhí)行時(shí)不會(huì)影響頁面的構(gòu)造。也就是說,腳本會(huì)被延遲到整個(gè)頁面都解析完畢之后再執(zhí)行

?
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
  <script src="test1.js" defer="defer"></script>
  <script src="test2.js" defer="defer"></script>
</head>
<body>
<!-- 這里放內(nèi)容 -->
</body>
</html>

說明:

  • 雖然<script>元素放在了<head>元素中,但包含的腳本將延遲瀏覽器遇到</html>標(biāo)簽后再執(zhí)行。
  • 當(dāng)瀏覽器解析到 script 腳本,有 defer 時(shí),瀏覽器會(huì)并行下載有 defer 屬性的 script,而不會(huì)阻塞頁面后續(xù)處理。
  • 所有的 defer 腳本保證是按順序依次執(zhí)行的。(但實(shí)際上延遲腳本并不一定會(huì)按照順序執(zhí)行,因此最好只包含一個(gè)延遲腳本)
  • defer 屬性只適用于外部腳本文件。

3. async 屬性

使用方法: 為 <script>標(biāo)簽定義了 async屬性。
用途: 不讓頁面等待腳本下載和執(zhí)行,從而異步加載頁面其他內(nèi)容。

?
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
  <script src="test1.js" async></script>
  <script src="test2.js" async></script>
</head>
<body>
<!-- 這里放內(nèi)容 -->
</body>
</html>

瀏覽器會(huì)立即下載腳本,但不妨礙頁面中的其他操作,比如下載其他資源或等待加載其他腳本。加載和渲染后續(xù)文檔元素的過程和 main.js 的加載與執(zhí)行并行進(jìn)行,這個(gè)過程是異步的。它們將在 onload 事件之前完成。

說明:

  • 瀏覽器會(huì)立即下載腳本,但不妨礙頁面中的其他操作,加載和渲染后續(xù)文檔元素的過程和腳本的加載與執(zhí)行并行進(jìn)行。
  • 這個(gè)過程是異步的,它們將在 onload 事件之前完成。
  • 所有的 defer 腳本不能控制加載的順序。。
  • asyncr 屬性只適用于外部腳本文件。

4. 動(dòng)態(tài)創(chuàng)建 DOM 方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//這些代碼應(yīng)被放置在</body>標(biāo)簽前(接近HTML文件底部)
<script type="text/javascript">
  function downloadJSAtOnload() {
    varelement = document.createElement("script");
    element.src = "defer.js";
    document.body.appendChild(element);
  }
  if (window.addEventListener)
   window.addEventListener("load",downloadJSAtOnload, false);
  else if (window.attachEvent)
   window.attachEvent("onload",downloadJSAtOnload);
  else
   window.onload =downloadJSAtOnload;
</script>

5. 使用 jquery 的 getScript 方法

使用方法:

?
1
Query.getScript(url,success(response,status))
  • url(必寫):將要請(qǐng)求的 URL 字符串
  • success(response,status)(可選):規(guī)定請(qǐng)求成功后執(zhí)行的回調(diào)函數(shù)。

其中的參數(shù)
response - 包含來自請(qǐng)求的結(jié)果數(shù)據(jù)
status - 包含請(qǐng)求的狀態(tài)("success", "notmodified", "error", "timeout" 或 "parsererror")

用途: 通過 HTTP GET 請(qǐng)求載入并執(zhí)行 JavaScript 文件。

?
1
2
3
4
5
6
//加載并執(zhí)行 test.js:
$.getScript("test.js");
//加載并執(zhí)行 test.js ,成功后顯示信息
$.getScript("test.js", function(){
 alert("Script loaded and executed.");
});

6.使用 setTimeout 延遲方法的加載時(shí)間

用途: 延遲加載 js 代碼,給網(wǎng)頁加載留出時(shí)間

?
1
2
3
4
5
6
7
8
9
10
<script type="text/javascript">
 function A(){
  $.post("/lord/login",{name:username,pwd:password},function(){
   alert("Hello World!");
  })
 }
 $(function (){
  setTimeout("A()",1000); //延遲1秒
 })
</script>

常用實(shí)例 - 圖片懶加載

原理: 一張圖片就是一個(gè)<img>標(biāo)簽,瀏覽器是否發(fā)起請(qǐng)求圖片是根據(jù)<img>的 src 屬性,所以實(shí)現(xiàn)懶加載的關(guān)鍵就是,在圖片沒有進(jìn)入可視區(qū)域時(shí),先不給<img>的 src 賦值,這樣瀏覽器就不會(huì)發(fā)送請(qǐng)求了,等到圖片進(jìn)入可視區(qū)域再給 src 賦值。

?
1
2
<img class="lazy" src="img/loading.gif" lazy-src="img/pic1.jpg" >
<img class="lazy" src="img/loading.gif" lazy-src="img/pic2.jpg" >
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function lazyload(){
 var visible;
 $('img').each(function () {
 if( typeof($(this).attr("lazy-src"))!="undefined" ){ // 判斷圖片是否需要懶加載
  visible = $(this).offset().top - $(window).scrollTop(); //圖片距離頂部的距離
  if ((visible > 0) && (visible < $(window).height())) {// 判斷圖片是否在可視區(qū)域
    visible = true;// 圖片在可視區(qū)域
  } else {
    visible = false;// 圖片不在可視區(qū)域
  }
  if (visible) {
    $(this).attr('src', $(this).attr('lazy-src'));
  }
 }
 });
}
 // 打開頁面觸發(fā)函數(shù)
 lazyload();
 // 滾屏?xí)r觸發(fā)函數(shù)
 window.onscroll =function(){
 lazyload(imgs);
 }

二、 預(yù)加載

原理: 提前加載圖片,當(dāng)用戶需要查看時(shí)可直接從本地緩存中渲染
目的: 犧牲前端性能,換取用戶體驗(yàn),使用戶的操作得到最快的反映。

實(shí)現(xiàn)預(yù)加載的幾種方法

1. css 實(shí)現(xiàn)

原理: 可通過 CSS 的background 屬性 將圖片預(yù)加載到屏幕外的背景上。只要這些圖片的路徑保持不變 ,當(dāng)它們?cè)?Web 頁面的其他地方被調(diào)用時(shí),瀏覽器就會(huì)在渲染過程中使用預(yù)加載(緩存)的圖片。簡單、高效,不需要任何 JavaScript。

?
1
2
3
4
5
#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; }

2. js 預(yù)加載圖片

原理: 通過寫函數(shù)進(jìn)行預(yù)加載。將該腳本封裝入一個(gè)函數(shù)中,并使用 addLoadEvent(),延遲預(yù)加載時(shí)間,直到頁面加載完畢。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function preloader() {
  if (document.images) {
    var img1 = new Image();
    var img2 = new Image();
    var img3 = new Image();
    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";
  }
}
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);

3. 使用 ajax 實(shí)現(xiàn)預(yù)加載

原理: 使用 Ajax 實(shí)現(xiàn)圖片預(yù)加載的方法,利用 DOM,不僅僅預(yù)加載圖片,還會(huì)預(yù)加載 CSS、JavaScript 等相關(guān)的東西

?
1
2
3
4
5
6
7
8
9
10
11
12
13
window.onload = function() {
  setTimeout(function() {
    // XHR to request a JS and a CSS
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://domain.tld/preload.js');
    xhr.send('');
    xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://domain.tld/preload.css');
    xhr.send('');
    // preload image
    new Image().src = "http://domain.tld/preload.png";
  }, 1000);
};

上面代碼預(yù)加載了“preload.js”、“preload.css”和“preload.png”。1000 毫秒的超時(shí)是為了防止腳本掛起,而導(dǎo)致正常頁面出現(xiàn)功能問題。

三、 懶加載與預(yù)加載的對(duì)比

1、概念

延遲加載也叫懶加載: 當(dāng)在真正需要數(shù)據(jù)的時(shí)候,才真正執(zhí)行數(shù)據(jù)加載操作。
預(yù)加載:提前加載,當(dāng)用戶需要查看時(shí)可直接從本地緩存中渲染

2、區(qū)別

  • 兩種技術(shù)的本質(zhì):兩者的行為相反,一個(gè)是提前加載,一個(gè)是遲緩甚至不加載。
  • 懶加載會(huì)對(duì)前端有一定的緩解壓力作用,預(yù)加載則會(huì)增加前端的壓力。

3、意義

懶加載的主要目的是優(yōu)化前端性能,減少請(qǐng)求數(shù)或延遲請(qǐng)求數(shù)。
預(yù)加載是犧牲前端性能,換取用戶體驗(yàn),使用戶的操作得到最快的反映。

四、 參考資料

【1】http://www.zmynmublwnt.cn/article/149051.html
【2】http://www.zmynmublwnt.cn/article/125873.html

到此這篇關(guān)于js中延遲加載和預(yù)加載的具體使用的文章就介紹到這了,更多相關(guān)js中延遲加載和預(yù)加載內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/6917440746303946765

延伸 · 閱讀

精彩推薦
  • js教程微信小程序自定義modal彈窗組件的方法詳解

    微信小程序自定義modal彈窗組件的方法詳解

    這篇文章主要給大家介紹了關(guān)于微信小程序自定義modal彈窗組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)...

    遇見小美好12072021-12-15
  • js教程基于 Next.js 的 SSR/SSG 方案了解一下?

    基于 Next.js 的 SSR/SSG 方案了解一下?

    服務(wù)端渲染(SSR,Server Side Render)與客戶端渲染(CSR,Client Side Render)的核心區(qū)分點(diǎn)簡單來說就是完整的 HTML 文檔在服務(wù)端還是瀏覽器里組裝完成。...

    DYBOY4472021-12-27
  • js教程利用JavaScript為句子加標(biāo)題的3種方法示例

    利用JavaScript為句子加標(biāo)題的3種方法示例

    這篇文章主要給大家介紹了關(guān)于如何利用JavaScript為句子加標(biāo)題的3種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)...

    Hunter網(wǎng)絡(luò)安全10202021-12-27
  • js教程JavaScript實(shí)現(xiàn)雪花飄落效果實(shí)例

    JavaScript實(shí)現(xiàn)雪花飄落效果實(shí)例

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)雪花飄落效果實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    小蟲蟲~3712021-12-21
  • js教程mapboxgl實(shí)現(xiàn)帶箭頭軌跡線的代碼

    mapboxgl實(shí)現(xiàn)帶箭頭軌跡線的代碼

    這篇文章主要介紹了mapboxgl實(shí)現(xiàn)帶箭頭軌跡線的代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下...

    GIS兵器庫9142021-12-27
  • js教程微信小程序抽獎(jiǎng)組件的使用步驟

    微信小程序抽獎(jiǎng)組件的使用步驟

    這篇文章主要給大家介紹了關(guān)于微信小程序抽獎(jiǎng)組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需...

    い 狂奔的蝸牛10702021-12-29
  • js教程Javascript實(shí)現(xiàn)漢字和拼音互轉(zhuǎn)的終極方案

    Javascript實(shí)現(xiàn)漢字和拼音互轉(zhuǎn)的終極方案

    網(wǎng)上關(guān)于JS實(shí)現(xiàn)漢字和拼音互轉(zhuǎn)的文章很多,但是比較雜亂,有的不支持多音字、不支持聲調(diào)或者字典文件太大,無法根據(jù)實(shí)際需要滿足需求。這篇文章給...

    我是小茗同學(xué)10122021-12-15
  • js教程js實(shí)現(xiàn)頭像上傳并且可預(yù)覽提交

    js實(shí)現(xiàn)頭像上傳并且可預(yù)覽提交

    這篇文章主要介紹了js如何實(shí)現(xiàn)頭像上傳并且可預(yù)覽提交,幫助大家更好的理解和使用js,感興趣的朋友可以了解下...

    harold10244042021-12-20
主站蜘蛛池模板: 亚洲视频高清 | 久久综合综合久久 | 中文字幕网站在线 | 亚洲一级毛片 | arabxxxxvideos | 舌头伸进添的我好爽高潮网站 | 美女羞羞视频网站 | 欧美日韩精品一区二区三区在线观看 | 91久久精品一二三区 | 色交视频| 精品国产91久久久久久久 | 欧美在线观看视频网站 | 羞羞视频免费视频欧美 | 黄视频网站免费观看 | 99精品无人区乱码在线观看 | 久久免费激情视频 | 久久国产精品电影 | 黄色毛片视频在线观看 | hd日本xxxx| 亚洲热线99精品视频 | 鲁丝片一区二区三区免费入口 | 99ri在线 | 日本成人在线免费 | 精品久久久久久久 | 欧美一级做一a做片性视频 日韩黄色片免费看 | 制服下着マ○コ航空5 | 国产精品久久久久久久娇妻 | 在线观看免费毛片视频 | 精品一区二区免费 | 欧美精品免费一区二区三区 | 欧洲成人在线视频 | www.777含羞草 | 成人免费国产 | 久国产精品视频 | 制服丝袜成人动漫 | 亚洲99影视一区二区三区 | www.91pron| 欧美另类综合 | 国产精品久久久久久久久久久久久久久久 | 在线观看国产网站 | 久久里面有精品 |