」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 延遲載入腳本,例如映像

延遲載入腳本,例如映像

發佈於2024-11-08
瀏覽:775

Lazyload Scripts like Images

近年來html 的最佳改進之一是loading="lazy" 屬性,您可以將其添加到圖像(也包括iframe)中,該屬性將告訴瀏覽器不要載入圖像直到出現在視口中。


    延遲載入腳本,例如映像

非常簡單,非常有用。但如果您也可以對腳本執行此操作,那就太好了。這樣你就可以延遲載入你的元件,只有當它們確實需要時...

嗯,延遲載入腳本,例如映像 元素的另一個功能是能夠在映像使用 onload 和 onerror 屬性載入(或不載入)之後運行腳本。

console.log('圖片已載入')" >

    
此 onload「回呼」僅在載入映像時才會觸發,如果映像是延遲載入的,則僅當圖片位於視窗中時才會觸發。瞧!延遲載入的腳本。

不幸的是,像這樣,它沒有多大用處。首先,您的頁面上會出現不需要的映像,其次,您需要內聯要執行的 JavaScript,這有點違背了延遲載入的目的。因此,讓我們做出一些改變來改進這一點。

影像本身可以是任何東西,或者更重要的是,什麼都不是。正如我之前提到的,有一個 onerror 回調,顧名思義,當圖像

加載時,它將觸發。

這並不意味著您需要將 src 指向不存在的圖像,這會導致控制台充滿關於丟失圖像的紅色 404 錯誤,並且沒有人希望這樣。

如果 src 影像實際上不是影像,也會觸發 onerror 回調,最簡單的方法是使用 data: 格式「錯誤地編碼」影像。這還有一個好處,就是不會在控制台中填充丟失影像的警告?

console.log('圖片未載入')" >

    
這仍然會導致頁面出現「損壞的圖像」縮圖,但我們會解決這個問題。

好吧,但是我們仍然需要內聯我們想要運行的 javascript,那麼我們要如何解決這個問題?

好吧,現在ES 模組支援幾乎是普遍的,我們可以使用非常強大的

event-import-then-default javascript 載入技術在事件觸發後載入腳本,如下所示:

_.default(this))" >

    

注意:這也適用於 onclick、onchange 等事件
注意:底線只是存取模組的簡寫方式,你也可以寫 .then(Module => Module.default(this))

好吧,那這是怎麼回事! ?

首先讓我們來看看某些元件可能會是什麼樣子:

// 一些元件.js 匯出預設元素=> { 元素.outerHTML = `

世界你好!

`; }

    
因此,您可能已經註意到,在 onerror 回調中,我將其作為參數傳遞給預設導出。我這樣做的原因是

this (請原諒雙關語?)是為了給腳本調用它的延遲載入腳本,例如映像 ,因為在this (我又做了一次?)上下文this = .

現在您可以簡單地使用 element.outerHTML 以您的 html 標記替換損壞的映像,然後您就擁有了延遲加載的腳本! ?

快取和傳遞參數

如果您在一個頁面上多次使用此技術,那麼您需要向資料傳遞「快取清除」索引或隨機數:例如,類似:

_.default(this))" > _.default(this))" >

    
「:,」後面的字串可以是任何內容,只要它們不同即可。

將參數傳遞給函數的一個非常簡單的方法是在 html 中使用 data-something 屬性,如下所示:

_.default(this))" >

    
由於我們將 this 傳遞給函數,您可以像這樣存取資料屬性:

匯出預設元素=> { const { 訊息 } = element.dataset 元素.outerHTML = `

${訊息}

`; }

    
請在評論中告訴我您的想法! ❤️

版本聲明 本文轉載於:https://dev.to/paulbrowne/lazyload-scripts-like-images-30e0?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用 JavaScript 從 iFrame 重新導向父視窗?
    如何使用 JavaScript 從 iFrame 重新導向父視窗?
    從iFrame 重定向父視窗如果父視窗中嵌入了iFrame,則可能需要重定向父視窗視窗的位置更改為新的URL。為了實現這一點,JavaScript 提供了一個簡單的解決方案。 使用JavaScript 重新導向父視窗在iFrame 的JavaScript 程式碼中,您可以使用以下方法: 重定向最頂層...
    程式設計 發佈於2024-11-08
  • 如何在 Python 中以空格分割字串,同時保留引用的子字串?
    如何在 Python 中以空格分割字串,同時保留引用的子字串?
    在Python 中按空格分割字串同時保留帶引號的子字串處理同時包含空格和帶引號的子字符當字串的字串時,可能會遇到困難準確地分割字串,同時保持引用部分的完整性。在 Python 中,shlex 模組為此特定場景提供了解決方案。 使用shlex.split() 保留引號shlex.split() 函數可...
    程式設計 發佈於2024-11-08
  • 如何使用 Selenium 在 Google Chrome 模擬 Microsoft Edge Mobile?
    如何使用 Selenium 在 Google Chrome 模擬 Microsoft Edge Mobile?
    使用Selenium 更改Google Chrome 中的用戶代理在Selenium 自動化腳本中,為瀏覽器視窗設定特定的用戶代理對於模擬設備行為和確保網站渲染至關重要正如預期的那樣。在這種情況下,我們的目標是將 Google Chrome 中的使用者代理程式修改為 Microsoft Edge M...
    程式設計 發佈於2024-11-08
  • NPM 對等依賴關係深入:全面介紹
    NPM 對等依賴關係深入:全面介紹
    作為 Javascript 開發者,我們都知道專案中存在兩種不同的依賴關係,dependency 和 devDependency,但是peerDependency 又如何呢? 在本系列中,我們將研究 Javascript 中這種較不常見的依賴關係。我們將研究它們是什麼,作為圖書館使用者我需要了解什...
    程式設計 發佈於2024-11-08
  • 哪種 MySQL 取得函數適合您的 PHP 應用程式:`mysql_fetch_array`、`mysql_fetch_assoc` 和 `mysql_fetch_object` 的比較
    哪種 MySQL 取得函數適合您的 PHP 應用程式:`mysql_fetch_array`、`mysql_fetch_assoc` 和 `mysql_fetch_object` 的比較
    比較mysql_fetch_array、mysql_fetch_assoc 和mysql_fetch_object:綜合分析mysql 函數系列在從MySQL 函式中擷取結果起至關重要的查詢作用在PHP 中。在這些函數中,mysql_fetch_array、mysql_fetch_assoc 和 m...
    程式設計 發佈於2024-11-08
  • Lerna – Monorepo 管理的關鍵
    Lerna – Monorepo 管理的關鍵
    歡迎回到莫諾雷波城堡! 現在城堡已經建成,每個房間(項目)都已就位。但如果沒有正確的管理,事情可能會變得混亂。誰來幫助城堡順利運作?這時勒納登場了──一位強大的巫師,擁有神奇的命令,可以讓一切保持秩序。 Lerna 是您在 monorepo 土地上的嚮導,確保所有房間(項目)同步,所有包都鏈接,...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中循環嵌套數組並顯示特定值?
    如何在 PHP 中循環嵌套數組並顯示特定值?
    PHP foreach 與嵌套數組:綜合指南在 PHP 中,瀏覽嵌套數組可能是常見的挑戰。本討論重點討論特定場景,您的目標是顯示嵌套數組的子集,特別是第二個嵌套數組中的值。 將foreach 與嵌套數組結合使用要使用foreach 處理嵌套數組,您可以使用以下命令方法:]範例:$tmpArray =...
    程式設計 發佈於2024-11-08
  • 提升 Web 效能:前端開發人員指南
    提升 Web 效能:前端開發人員指南
    大家好!自从我上次写博客以来已经有一段时间了,我承认,这让我有点难过。现实是,有太多东西需要学习,有时感觉永远没有足够的时间来深入了解所有内容。我在跟谁开玩笑呢?事实是,我最近拖延得很厉害。 但最近,我一直在探索网络性能——这对于任何前端开发人员来说都是一个至关重要的话题——我很高兴分享我所学到的东...
    程式設計 發佈於2024-11-08
  • 如何利用先進的加密技術增強資料保護?
    如何利用先進的加密技術增強資料保護?
    對稱金鑰加密:FernetPython 擁有強大的加密庫,提供Fernet,這是一種安全、最佳實踐的加密方案。 Fernet 採用 AES CBC 加密、HMAC 簽章以及版本和時間戳記資訊來保護資料。建議使用 Fernet.generate_key() 產生金鑰。 from cryptograph...
    程式設計 發佈於2024-11-08
  • 什麼是本地主機?本地主機作為開發人員的用途
    什麼是本地主機?本地主機作為開發人員的用途
    您有沒有想過當開發人員在將網站上線之前測試網站時會發生什麼?或者網路管理員如何檢查他們的系統是否正常運作?答案在於一個強大但經常被誤解的概念,稱為 localhost。讓我們深入了解 localhost 是什麼、為何它很重要以及它如何變得非常有用。 什麼是本地主機? 用最簡單的術語...
    程式設計 發佈於2024-11-08
  • 為什麼 Debian 和 Ubuntu Docker 容器之間的標準輸出緩衝不同?
    為什麼 Debian 和 Ubuntu Docker 容器之間的標準輸出緩衝不同?
    Docker 容器中的標準輸出緩衝:Debian 與Ubuntu 的案例在Docker 容器中執行程式碼時,標準輸出緩衝可能會發生在某些情況下,但在其他情況下則不然。在使用 io.MultiWriter 將 stdout 定向到控制台和日誌檔案的情況下會出現此問題。 根本原因:平台差異根本原因造成此...
    程式設計 發佈於2024-11-08
  • 語意HTML
    語意HTML
    語意 HTML 是 HTML 的一部分,可協助您以維護和 SEO 友善的方式組織您的網站。 SEO 代表:搜尋引擎優化。 當您在建立網站時遵循 HTML 語意時,網站往往會更容易被搜尋引擎排名更高,當然也能讓螢幕閱讀器更輕鬆地瀏覽您的網站。 以下是一些語意 HTML 標籤: 1- 「標題」標籤...
    程式設計 發佈於2024-11-08
  • 如何在單一 FastAPI 端點中處理表單和 JSON 資料?
    如何在單一 FastAPI 端點中處理表單和 JSON 資料?
    如何建立可以接受表單或 JSON 正文的 FastAPI 端點? 在 FastAPI 中,您可以建立可以接受表單或 JSON 正文的端點使用不同的方法。以下是幾個選項:選項1:使用依賴函數此選項涉及建立一個依賴函數,該函數檢查Content-Type 請求標頭的值並使用Starlette 的方法解析...
    程式設計 發佈於2024-11-08
  • 如何在 Golang 中合併多個映射,同時避免重複值?
    如何在 Golang 中合併多個映射,同時避免重複值?
    在Golang 中合併映射問題:合併多個映射,保留與跨映射中的相同鍵關聯的值。 初始方法:提供的程式碼嘗試透過迭代每個映射來合併映射,根據匹配鍵將值新增至結果映射。但是,此方法不處理結果映射中的重複值。 簡單合併:可以透過將值附加到切片來實現修改後的合併函數來處理重複項與結果映射中的鍵關聯。 fu...
    程式設計 發佈於2024-11-08
  • 將 ZingGrid 連接到 Supabase:在幾分鐘內新增後端
    將 ZingGrid 連接到 Supabase:在幾分鐘內新增後端
    從我在 Zing 部落格上的文章中交叉發布。 Supabase 是一個開源 Firebase 替代品。他們提供多種服務,但出於本文的目的,我們將深入探討它如何充當網格的簡單後端。 初始設定 在開始設定網格之前,我們需要在 Supabase 方面執行幾個步驟。 1...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3