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

延遲載入腳本,例如映像

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

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]刪除
最新教學 更多>
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 中刪除一個頻繁的問題時,在與Chrome and IE9中的圖像一起工作時,遇到了一個頻繁的問題。和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome bug Burcevention 樣式的重複另一種解決方案是在CSS和通過JQuery的Border = 0屬...
    程式設計 發佈於2025-04-29
  • 人臉檢測失敗原因及解決方案:Error -215
    人臉檢測失敗原因及解決方案:Error -215
    錯誤處理:解決“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解決此問題,必須確保提供給HAAR CASCADE XML文件的路徑有效。在提供的代碼片段中,級聯分類器裝有硬編碼路徑,這可能對您的系統不准確。相反,OPENCV提...
    程式設計 發佈於2025-04-29
  • 左連接為何在右表WHERE子句過濾時像內連接?
    左連接為何在右表WHERE子句過濾時像內連接?
    左JOIN CONUNDRUM:WITCHING小時在數據庫Wizard的領域中變成內在的加入很有趣,當將c.foobar條件放置在上面的Where子句中時,據說左聯接似乎會轉換為內部連接。僅當滿足A.Foo和C.Foobar標準時,才會返回結果。 為什麼要變形?關鍵在於其中的子句。當左聯接的右側...
    程式設計 發佈於2025-04-29
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-04-29
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-04-29
  • 切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    程式設計 發佈於2025-04-29
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-29
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-04-29
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-04-29
  • Java字符串非空且非null的有效檢查方法
    Java字符串非空且非null的有效檢查方法
    檢查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。 isement(Isement() trim whitespace whites...
    程式設計 發佈於2025-04-29
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-04-29
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-04-29
  • 如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    在Visual Studio 2012 儘管已安裝了MySQL Connector v.6.5.4,但無法將MySQL數據庫添加到實體框架的“ DataSource對話框”中。為了解決這一問題,至關重要的是要了解MySQL連接器v.6.5.5及以後的6.6.x版本將提供MySQL的官方Visual...
    程式設計 發佈於2025-04-29
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-04-29
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-04-29

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

Copyright© 2022 湘ICP备2022001581号-3