iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Modern Web

你知道這是什麼嗎? Chrome Extension MV3 With Vite系列 第 23

你知道這是什麼嗎? Chrome extension MV3 With Vite - Day 23 在 Content Script 中使用 Iframe

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220923/20139636C3B6YZfswA.jpg

Hi Dai Gei Ho~ 我是Winnie ~

在此篇文章中,我們要來說 如何在 Content Script 中 使用 Iframe 及 解決的問題。

什麼是 Iframe

iframe 為HTML語法中的內嵌框架,主要使用目的為可以在當前網頁內載入另一個網頁,最常見的應用像是我們常看到他人網站內嵌入Youtube影片 或是 在網站中嵌入FaceBook 粉絲專頁 等...

使用方法:

透過 在<iframe> 中的 src指定對應 連結就可以引入對應網頁。

<iframe src="http://www.example.com/" height="200" width="300"></iframe>

如何在 Extension 中使用呢?
與昨日介紹 Inject Script Module 方法一樣,可以 透過 Content Script 來注入

透過 Content Script 注入 Iframe

由於 Content Script 沒有html頁面可以定義<iframe>, 所以我們只好透過 document.createElement('iframe')方式來動態創建。

iframe 創建範例 如下:

先判斷當前頁面有無 El 元素,沒有的話一樣創建一個注入網站中。

  // content.js
  
  // 先判斷 網頁中有無 El 元素
  const El = document.querySelector('#extension_iframe')
  
  if (!El) {
    const div = document.createElement('div');
    div.id = "extension_iframe"
    div.setAttribute('style','z-index:2147483647; position:fixed; bottom:30px; right:20px;font-size:16px;');
    // 注入網站中
    document.body.appendChild(div);
    ...略
  }
  

一樣透過 document.createElement('iframe')創建一個 iframe tag,設定其相關屬性,接著在iframe 中的 src 指定想要引入的網址連結,即可完成注入 iframe

     // content.js
    
    ...略
    
   const iframeEl = document.createElement('iframe');
   iframeEl.sandbox = 'allow-scripts allow-popups'; //允許在iframe裡使用js  
   iframeEl.width  = '335px'; //設定 寬度
   iframeEl.height = '440px'; //設定 長度
   iframe.frameborder="0" // 0為 不顯示邊框, 1為顯示編框
   iframeEl.scrolling="no"
   
   iframeEl.src = url;
   
   El.prepend(iframe);
    
   ...略

咦 就這樣嗎?

嘿還沒結束,重頭戲來了,不知道大家還記不記得 在前面兩天我們介紹了如何在Content Script 中 使用 Es6 Module 嗎? 除了限制多還有困難重重

關於 在Content Script 中 使用 Es6 Module 可以看這兩篇 -> Day 21 Extension 中的 ES6 ModuleDay 22 Content Script 中使用 ES6 Module

但此時我們以透過 iframe 的寫法,我們可以解決這些限制。

在 Iframe 內容使用 Es6 Module

定義 content.html

一樣的要要使用 Es6 Module,需透過定義 <script> 中的 type="module" 指定 src 作為進入點。

// content.html
<html>
 <head>
   <title>content</title>
 </head>
 <body>
     <div id="content_app"></div>
     <script type="module" src="/src/content_script/main.js"></script>
 </body>
</html>

設定 web_accessible_resources

接著透過在 Manifest.json 中定義 web_accessible_resources,將 content.html定義為 Extension 內的資源。

//Manifest.json 

{
   ...略
  "web_accessible_resources": ["content.html"]
}

指定 Iframe 引入src連結

最後,使用 chrome.runtime.getURL取得 存在於chrome extension 的content.html網址,並指定給iframe 的 src 連結 中。

// content.js

iframeEl.src =  chrome.runtime.getURL('main.html');

如此一來,透過這樣的定義,我們在iframe的內容中就可以順利使用Es6 Module了,同時因為main.html主要運行範圍歸屬於 extension 端,所以原本不能使用chrome.runtime相關方法及 Chrome.storage 的限制也順理成章的可以使用了。

溫腥提醒:

在 Message API 傳送訊息的方式會因為檔案運行範圍會有所不同。
大家可以再依照個人需求調整

以上就是關於 如何 在 Content Script 中 使用 Iframe 的介紹,那今天文章先到這邊了,謝謝願意花時間看此篇文章的你,如果文章有錯誤的地方,再麻煩不吝嗇的給予指教,感謝!!

這首歌是一年前,每天早上走去 五倍上課的路上 每天都會聽的歌
走著想著 要怎麼樣 成為一個厲害的普通人
現在聽起來 都還是雞皮疙瘩..

今日推薦 -> 成為一個厲害的普通人


上一篇
你知道這是什麼嗎? Chrome extension MV3 With Vite - Day 22 Content Script 中使用 ES6 Module (補充說明篇)
下一篇
你知道這是什麼嗎? Chrome extension MV3 With Vite - Day 24 用 Vue 開啟你的 Extension 吧
系列文
你知道這是什麼嗎? Chrome Extension MV3 With Vite30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言