我正在編寫一個 Chrome 擴展程序,並嘗試在 popup.html 文件中單擊按鈕後立即在當前網頁上覆蓋 。 當我從 popup.html 存取 document.body.insertBefore 方法時,它會覆寫彈出視窗上的 ,而不是目前網頁。 我是否必須在background.html 和popup.html 之間使用訊息傳遞才能存取網頁的DOM?我想在 popup.html 中完成所有操作,如果可能的話也使用 jQuery。 2 0 0 P粉046878197 全部回覆(2) 我來回復 關閉 P粉2960800762023-10-19 08:17:05 2樓 使用程式註入來新增該 div 的擴充彈出腳本的一些範例。 清單V3 不要忘記在manifest.json中新增權限,請參閱其他答案以獲取更多資訊。 簡單呼叫: (async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent1, }); })(); // executeScript runs this code inside the tab function inContent1() { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = 'DIV'; document.body.appendChild(el); } 注意:在 Chrome 91 或更早版本中,func: 應為 function:。 使用參數呼叫並接收結果 需要 Chrome 92,因為它實作了 args。 範例1: res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: (a, b) => { return [window[a], window[b]]; }, args: ['foo', 'bar'], }); 範例2: (async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); let res; try { res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent2, args: [{ foo: 'bar' }], // arguments must be JSON-serializable }); } catch (e) { console.warn(e.message || e); return; } // res[0] contains results for the main page of the tab document.body.textContent = JSON.stringify(res[0].result); })(); // executeScript runs this code inside the tab function inContent2(params) { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = params.foo; document.body.appendChild(el); return { success: true, html: document.body.innerHTML, }; } 清單V2 簡單呼叫: // uses inContent1 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent1 })()` }); 使用參數呼叫並接收結果: // uses inContent2 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent2 })(${ JSON.stringify({ foo: 'bar' }) })` }, ([result] = []) => { if (!chrome.runtime.lastError) { console.log(result); // shown in devtools of the popup window } }); 此範例使用 inContent 函數的程式碼自動轉換為字串,這樣做的好處是 IDE 可以應用語法突出顯示和 linting。明顯的缺點是瀏覽器會浪費時間來解析程式碼,但通常不到 1 毫秒,因此可以忽略不計。 點贊 +0 新增回覆 关闭回复 P粉046878197 回覆 P粉6004020852023-10-19 00:39:30 1樓 問題:擴充頁面(彈出視窗、選項、MV2 中的背景頁面等)與網頁分離,它們有自己的DOM、document、window 和chrome-extension:// URL。 請注意,Service Worker 根本沒有任何 DOM/文件/視窗。 要檢查擴充的每個上下文使用自己的開發工具。 解決方案:使用內容腳本存取網頁頁面或與其內容互動。 內容腳本在網頁中執行,而不是在擴充功能中執行。 內容腳本預設是隔離的,請參閱如何在頁面上下文中執行程式碼(也稱為主世界)。 不要在擴充功能頁面中載入內容腳本。 方法1.宣告式 manifest.json: "content_scripts": [{ "matches": ["*://*.example.com/*"], "js": ["contentScript.js"] }], 它將在頁面載入時運行一次。之後,請使用訊息傳遞。 警告!它不能傳送 DOM 元素、Map、Set、ArrayBuffer、類別、函數等。它只能發送與 JSON 相容的簡單物件和類型,因此您需要手動提取所需的資料並將其作為簡單陣列或物件傳遞。 方法 2. 程式化 ManifestV3: 在擴充腳本(如彈出視窗)可根據需要將內容腳本/函數注入標籤。 此方法的結果是內容腳本中的最後一個表達式,因此可用於擷取資料。資料必須與 JSON 相容,請參閱上面的警告。 manifest.json 中所需的權限: 「腳本」 - 強制; "activeTab" - 理想場景,適合對使用者操作的回應(通常是點擊工具列中的擴充圖示)。安裝擴充功能時不顯示任何權限警告。 如果理想情況不可能,請將允許的網站新增至manifest.json 中的host_permissions: 「*://*.example.com/」 以及您想要的任何其他網站。 "" 或"*://*/" 這些會將您的擴充功能置於Chrome 線上應用程式商店中超慢審核佇列中由於廣泛的主機權限。 ManifestV2 與上述的差異: #使用chrome.tabs.executeScript。 在權限中指定網站。 點贊 +0 新增回覆 关闭回复 P粉046878197 回覆 熱門專題 更多> CakePHP 教程 Laravel 教程 PHP教程 Java教學 熱門文章 IntelMarkets (INTL) 預售:一個利潤豐厚的投資機會,旨在主導加密貨幣領域 比特幣繁榮:未發現的見解及其意想不到的連鎖反應 《決勝時刻:黑色行動 6》- 最佳 LR 7.62 裝備 如何使用百分比設定表格儲存格的最大寬度? ObjectAid UML Explorer 如何協助視覺化和記錄 Java 程式碼? 熱門教學 更多> 相關教學 熱門推薦 最新課程 最新ThinkPHP 5.1全球首發影片教學(60天成就PHP大牛線上訓練課程) 1419979 php入門教程之一週學會PHP 4262312 JAVA 初級入門影片教學 2504301 最新ThinkPHP 5.1全球首發影片教學(60天成就PHP大牛線上訓練課程) 1419979 JAVA 初級入門影片教學 2504301 小甲魚零基礎入門學習Python影片教學 505370 Web前端開發極速入門 215507 零基礎精通 PS 影片教學 883764 【web前端】Node.js快速入門 6973 國外Web開發全端課程全集 5416 Go語言實戰之 GraphQL 4561 550W粉絲大佬手把手從零學JavaScript 659 python大神Mosh,零基礎小白6小時完全入門 23087 最新下載 更多> 網站特效 網站源碼 網站素材 前端模板 [表單按鈕] jQuery企業留言表單聯絡程式碼 [播放器特效] HTML5 MP3音樂盒播放特效 [選單導航] HTML5酷炫粒子動畫導覽選單特效 [表單按鈕] jQuery可視化表單拖曳編輯程式碼 [播放器特效] VUE.JS仿酷狗音樂播放器代碼 [html5特效] 經典html5推箱子小遊戲 [圖片特效] jQuery滾動添加或減少圖片特效 [相簿特效] CSS3個人相簿封面懸停放大特效 [Bootstrap模板] 有機蔬果供應商網頁範本 Bootstrap5 [後端模板] Bootstrap3多功能資料資訊後台管理響應式網頁範本-Novus [Bootstrap模板] 房產資源服務平台網頁範本 Bootstrap5 [Bootstrap模板] 簡約履歷資料網頁範本 Bootstrap4 [Bootstrap模板] bootstrap響應式寬螢幕圖書教育網站範本-DREAMLIFE [後端模板] MAC風格響應式藍色企業CMS後台管理系統模版 [後端模板] 響應式漸層大氣後台管理系統網站模板-usinessbox [Bootstrap模板] 響應式蔬果商店網站模板-Organio [PNG素材] 可愛的夏天元素向量素材(EPS+PNG) [PNG素材] 四個紅色的 2023 畢業徽章的向量素材(AI+EPS+PNG) [banner圖] 唱歌的小鳥和裝滿花朵的推車設計春天banner向量素材(AI+EPS) [PNG素材] 金色的畢業帽向量素材(EPS+PNG) [PNG素材] 黑白風格的山脈圖示向量素材(EPS+PNG) [PNG素材] 不同顏色披風和不同姿勢的超級英雄剪影向量素材(EPS+PNG) [banner圖] 扁平風格的植樹節banner向量素材(AI+EPS) [PNG素材] 九種漫畫風格的爆炸聊天氣泡向量素材(EPS+PNG) [前端模板] 家居裝潢清潔維修服務公司網站模板 [前端模板] 清新配色個人求職履歷引導頁模板 [前端模板] 設計師創意求職履歷網頁模板 [前端模板] 現代工程建築公司網站模板 [前端模板] 教育服務機構響應式HTML5模板 [前端模板] 網上電子書店商城網站模板 [前端模板] IT技術解決互聯網公司網站模板 [前端模板] 紫色風格外匯交易服務網站模板
。 當我從 popup.html 存取 document.body.insertBefore 方法時,它會覆寫彈出視窗上的 ,而不是目前網頁。 我是否必須在background.html 和popup.html 之間使用訊息傳遞才能存取網頁的DOM?我想在 popup.html 中完成所有操作,如果可能的話也使用 jQuery。 2 0 0 P粉046878197 全部回覆(2) 我來回復 關閉 P粉2960800762023-10-19 08:17:05 2樓 使用程式註入來新增該 div 的擴充彈出腳本的一些範例。 清單V3 不要忘記在manifest.json中新增權限,請參閱其他答案以獲取更多資訊。 簡單呼叫: (async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent1, }); })(); // executeScript runs this code inside the tab function inContent1() { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = 'DIV'; document.body.appendChild(el); } 注意:在 Chrome 91 或更早版本中,func: 應為 function:。 使用參數呼叫並接收結果 需要 Chrome 92,因為它實作了 args。 範例1: res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: (a, b) => { return [window[a], window[b]]; }, args: ['foo', 'bar'], }); 範例2: (async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); let res; try { res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent2, args: [{ foo: 'bar' }], // arguments must be JSON-serializable }); } catch (e) { console.warn(e.message || e); return; } // res[0] contains results for the main page of the tab document.body.textContent = JSON.stringify(res[0].result); })(); // executeScript runs this code inside the tab function inContent2(params) { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = params.foo; document.body.appendChild(el); return { success: true, html: document.body.innerHTML, }; } 清單V2 簡單呼叫: // uses inContent1 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent1 })()` }); 使用參數呼叫並接收結果: // uses inContent2 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent2 })(${ JSON.stringify({ foo: 'bar' }) })` }, ([result] = []) => { if (!chrome.runtime.lastError) { console.log(result); // shown in devtools of the popup window } }); 此範例使用 inContent 函數的程式碼自動轉換為字串,這樣做的好處是 IDE 可以應用語法突出顯示和 linting。明顯的缺點是瀏覽器會浪費時間來解析程式碼,但通常不到 1 毫秒,因此可以忽略不計。 點贊 +0 新增回覆 关闭回复 P粉046878197 回覆 P粉6004020852023-10-19 00:39:30 1樓 問題:擴充頁面(彈出視窗、選項、MV2 中的背景頁面等)與網頁分離,它們有自己的DOM、document、window 和chrome-extension:// URL。 請注意,Service Worker 根本沒有任何 DOM/文件/視窗。 要檢查擴充的每個上下文使用自己的開發工具。 解決方案:使用內容腳本存取網頁頁面或與其內容互動。 內容腳本在網頁中執行,而不是在擴充功能中執行。 內容腳本預設是隔離的,請參閱如何在頁面上下文中執行程式碼(也稱為主世界)。 不要在擴充功能頁面中載入內容腳本。 方法1.宣告式 manifest.json: "content_scripts": [{ "matches": ["*://*.example.com/*"], "js": ["contentScript.js"] }], 它將在頁面載入時運行一次。之後,請使用訊息傳遞。 警告!它不能傳送 DOM 元素、Map、Set、ArrayBuffer、類別、函數等。它只能發送與 JSON 相容的簡單物件和類型,因此您需要手動提取所需的資料並將其作為簡單陣列或物件傳遞。 方法 2. 程式化 ManifestV3: 在擴充腳本(如彈出視窗)可根據需要將內容腳本/函數注入標籤。 此方法的結果是內容腳本中的最後一個表達式,因此可用於擷取資料。資料必須與 JSON 相容,請參閱上面的警告。 manifest.json 中所需的權限: 「腳本」 - 強制; "activeTab" - 理想場景,適合對使用者操作的回應(通常是點擊工具列中的擴充圖示)。安裝擴充功能時不顯示任何權限警告。 如果理想情況不可能,請將允許的網站新增至manifest.json 中的host_permissions: 「*://*.example.com/」 以及您想要的任何其他網站。 "" 或"*://*/" 這些會將您的擴充功能置於Chrome 線上應用程式商店中超慢審核佇列中由於廣泛的主機權限。 ManifestV2 與上述的差異: #使用chrome.tabs.executeScript。 在權限中指定網站。 點贊 +0 新增回覆 关闭回复 P粉046878197 回覆 熱門專題 更多> CakePHP 教程 Laravel 教程 PHP教程 Java教學 熱門文章 IntelMarkets (INTL) 預售:一個利潤豐厚的投資機會,旨在主導加密貨幣領域 比特幣繁榮:未發現的見解及其意想不到的連鎖反應 《決勝時刻:黑色行動 6》- 最佳 LR 7.62 裝備 如何使用百分比設定表格儲存格的最大寬度? ObjectAid UML Explorer 如何協助視覺化和記錄 Java 程式碼? 熱門教學 更多> 相關教學 熱門推薦 最新課程 最新ThinkPHP 5.1全球首發影片教學(60天成就PHP大牛線上訓練課程) 1419979 php入門教程之一週學會PHP 4262312 JAVA 初級入門影片教學 2504301 最新ThinkPHP 5.1全球首發影片教學(60天成就PHP大牛線上訓練課程) 1419979 JAVA 初級入門影片教學 2504301 小甲魚零基礎入門學習Python影片教學 505370 Web前端開發極速入門 215507 零基礎精通 PS 影片教學 883764 【web前端】Node.js快速入門 6973 國外Web開發全端課程全集 5416 Go語言實戰之 GraphQL 4561 550W粉絲大佬手把手從零學JavaScript 659 python大神Mosh,零基礎小白6小時完全入門 23087 最新下載 更多> 網站特效 網站源碼 網站素材 前端模板 [表單按鈕] jQuery企業留言表單聯絡程式碼 [播放器特效] HTML5 MP3音樂盒播放特效 [選單導航] HTML5酷炫粒子動畫導覽選單特效 [表單按鈕] jQuery可視化表單拖曳編輯程式碼 [播放器特效] VUE.JS仿酷狗音樂播放器代碼 [html5特效] 經典html5推箱子小遊戲 [圖片特效] jQuery滾動添加或減少圖片特效 [相簿特效] CSS3個人相簿封面懸停放大特效 [Bootstrap模板] 有機蔬果供應商網頁範本 Bootstrap5 [後端模板] Bootstrap3多功能資料資訊後台管理響應式網頁範本-Novus [Bootstrap模板] 房產資源服務平台網頁範本 Bootstrap5 [Bootstrap模板] 簡約履歷資料網頁範本 Bootstrap4 [Bootstrap模板] bootstrap響應式寬螢幕圖書教育網站範本-DREAMLIFE [後端模板] MAC風格響應式藍色企業CMS後台管理系統模版 [後端模板] 響應式漸層大氣後台管理系統網站模板-usinessbox [Bootstrap模板] 響應式蔬果商店網站模板-Organio [PNG素材] 可愛的夏天元素向量素材(EPS+PNG) [PNG素材] 四個紅色的 2023 畢業徽章的向量素材(AI+EPS+PNG) [banner圖] 唱歌的小鳥和裝滿花朵的推車設計春天banner向量素材(AI+EPS) [PNG素材] 金色的畢業帽向量素材(EPS+PNG) [PNG素材] 黑白風格的山脈圖示向量素材(EPS+PNG) [PNG素材] 不同顏色披風和不同姿勢的超級英雄剪影向量素材(EPS+PNG) [banner圖] 扁平風格的植樹節banner向量素材(AI+EPS) [PNG素材] 九種漫畫風格的爆炸聊天氣泡向量素材(EPS+PNG) [前端模板] 家居裝潢清潔維修服務公司網站模板 [前端模板] 清新配色個人求職履歷引導頁模板 [前端模板] 設計師創意求職履歷網頁模板 [前端模板] 現代工程建築公司網站模板 [前端模板] 教育服務機構響應式HTML5模板 [前端模板] 網上電子書店商城網站模板 [前端模板] IT技術解決互聯網公司網站模板 [前端模板] 紫色風格外匯交易服務網站模板
當我從 popup.html 存取 document.body.insertBefore 方法時,它會覆寫彈出視窗上的 ,而不是目前網頁。 我是否必須在background.html 和popup.html 之間使用訊息傳遞才能存取網頁的DOM?我想在 popup.html 中完成所有操作,如果可能的話也使用 jQuery。 2 0 0 P粉046878197 全部回覆(2) 我來回復 關閉 P粉2960800762023-10-19 08:17:05 2樓 使用程式註入來新增該 div 的擴充彈出腳本的一些範例。 清單V3 不要忘記在manifest.json中新增權限,請參閱其他答案以獲取更多資訊。 簡單呼叫: (async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent1, }); })(); // executeScript runs this code inside the tab function inContent1() { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = 'DIV'; document.body.appendChild(el); } 注意:在 Chrome 91 或更早版本中,func: 應為 function:。 使用參數呼叫並接收結果 需要 Chrome 92,因為它實作了 args。 範例1: res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: (a, b) => { return [window[a], window[b]]; }, args: ['foo', 'bar'], }); 範例2: (async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); let res; try { res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent2, args: [{ foo: 'bar' }], // arguments must be JSON-serializable }); } catch (e) { console.warn(e.message || e); return; } // res[0] contains results for the main page of the tab document.body.textContent = JSON.stringify(res[0].result); })(); // executeScript runs this code inside the tab function inContent2(params) { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = params.foo; document.body.appendChild(el); return { success: true, html: document.body.innerHTML, }; } 清單V2 簡單呼叫: // uses inContent1 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent1 })()` }); 使用參數呼叫並接收結果: // uses inContent2 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent2 })(${ JSON.stringify({ foo: 'bar' }) })` }, ([result] = []) => { if (!chrome.runtime.lastError) { console.log(result); // shown in devtools of the popup window } }); 此範例使用 inContent 函數的程式碼自動轉換為字串,這樣做的好處是 IDE 可以應用語法突出顯示和 linting。明顯的缺點是瀏覽器會浪費時間來解析程式碼,但通常不到 1 毫秒,因此可以忽略不計。 點贊 +0 新增回覆 关闭回复 P粉046878197 回覆 P粉6004020852023-10-19 00:39:30 1樓 問題:擴充頁面(彈出視窗、選項、MV2 中的背景頁面等)與網頁分離,它們有自己的DOM、document、window 和chrome-extension:// URL。 請注意,Service Worker 根本沒有任何 DOM/文件/視窗。 要檢查擴充的每個上下文使用自己的開發工具。 解決方案:使用內容腳本存取網頁頁面或與其內容互動。 內容腳本在網頁中執行,而不是在擴充功能中執行。 內容腳本預設是隔離的,請參閱如何在頁面上下文中執行程式碼(也稱為主世界)。 不要在擴充功能頁面中載入內容腳本。 方法1.宣告式 manifest.json: "content_scripts": [{ "matches": ["*://*.example.com/*"], "js": ["contentScript.js"] }], 它將在頁面載入時運行一次。之後,請使用訊息傳遞。 警告!它不能傳送 DOM 元素、Map、Set、ArrayBuffer、類別、函數等。它只能發送與 JSON 相容的簡單物件和類型,因此您需要手動提取所需的資料並將其作為簡單陣列或物件傳遞。 方法 2. 程式化 ManifestV3: 在擴充腳本(如彈出視窗)可根據需要將內容腳本/函數注入標籤。 此方法的結果是內容腳本中的最後一個表達式,因此可用於擷取資料。資料必須與 JSON 相容,請參閱上面的警告。 manifest.json 中所需的權限: 「腳本」 - 強制; "activeTab" - 理想場景,適合對使用者操作的回應(通常是點擊工具列中的擴充圖示)。安裝擴充功能時不顯示任何權限警告。 如果理想情況不可能,請將允許的網站新增至manifest.json 中的host_permissions: 「*://*.example.com/」 以及您想要的任何其他網站。 "" 或"*://*/" 這些會將您的擴充功能置於Chrome 線上應用程式商店中超慢審核佇列中由於廣泛的主機權限。 ManifestV2 與上述的差異: #使用chrome.tabs.executeScript。 在權限中指定網站。 點贊 +0 新增回覆 关闭回复 P粉046878197 回覆
document.body.insertBefore
,而不是目前網頁。 我是否必須在background.html 和popup.html 之間使用訊息傳遞才能存取網頁的DOM?我想在 popup.html 中完成所有操作,如果可能的話也使用 jQuery。 2 0 0 P粉046878197 全部回覆(2) 我來回復 關閉 P粉2960800762023-10-19 08:17:05 2樓 使用程式註入來新增該 div 的擴充彈出腳本的一些範例。 清單V3 不要忘記在manifest.json中新增權限,請參閱其他答案以獲取更多資訊。 簡單呼叫: (async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent1, }); })(); // executeScript runs this code inside the tab function inContent1() { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = 'DIV'; document.body.appendChild(el); } 注意:在 Chrome 91 或更早版本中,func: 應為 function:。 使用參數呼叫並接收結果 需要 Chrome 92,因為它實作了 args。 範例1: res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: (a, b) => { return [window[a], window[b]]; }, args: ['foo', 'bar'], }); 範例2: (async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); let res; try { res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent2, args: [{ foo: 'bar' }], // arguments must be JSON-serializable }); } catch (e) { console.warn(e.message || e); return; } // res[0] contains results for the main page of the tab document.body.textContent = JSON.stringify(res[0].result); })(); // executeScript runs this code inside the tab function inContent2(params) { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = params.foo; document.body.appendChild(el); return { success: true, html: document.body.innerHTML, }; } 清單V2 簡單呼叫: // uses inContent1 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent1 })()` }); 使用參數呼叫並接收結果: // uses inContent2 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent2 })(${ JSON.stringify({ foo: 'bar' }) })` }, ([result] = []) => { if (!chrome.runtime.lastError) { console.log(result); // shown in devtools of the popup window } }); 此範例使用 inContent 函數的程式碼自動轉換為字串,這樣做的好處是 IDE 可以應用語法突出顯示和 linting。明顯的缺點是瀏覽器會浪費時間來解析程式碼,但通常不到 1 毫秒,因此可以忽略不計。 點贊 +0 新增回覆 关闭回复 P粉046878197 回覆 P粉6004020852023-10-19 00:39:30 1樓 問題:擴充頁面(彈出視窗、選項、MV2 中的背景頁面等)與網頁分離,它們有自己的DOM、document、window 和chrome-extension:// URL。 請注意,Service Worker 根本沒有任何 DOM/文件/視窗。 要檢查擴充的每個上下文使用自己的開發工具。 解決方案:使用內容腳本存取網頁頁面或與其內容互動。 內容腳本在網頁中執行,而不是在擴充功能中執行。 內容腳本預設是隔離的,請參閱如何在頁面上下文中執行程式碼(也稱為主世界)。 不要在擴充功能頁面中載入內容腳本。 方法1.宣告式 manifest.json: "content_scripts": [{ "matches": ["*://*.example.com/*"], "js": ["contentScript.js"] }], 它將在頁面載入時運行一次。之後,請使用訊息傳遞。 警告!它不能傳送 DOM 元素、Map、Set、ArrayBuffer、類別、函數等。它只能發送與 JSON 相容的簡單物件和類型,因此您需要手動提取所需的資料並將其作為簡單陣列或物件傳遞。 方法 2. 程式化 ManifestV3: 在擴充腳本(如彈出視窗)可根據需要將內容腳本/函數注入標籤。 此方法的結果是內容腳本中的最後一個表達式,因此可用於擷取資料。資料必須與 JSON 相容,請參閱上面的警告。 manifest.json 中所需的權限: 「腳本」 - 強制; "activeTab" - 理想場景,適合對使用者操作的回應(通常是點擊工具列中的擴充圖示)。安裝擴充功能時不顯示任何權限警告。 如果理想情況不可能,請將允許的網站新增至manifest.json 中的host_permissions: 「*://*.example.com/」 以及您想要的任何其他網站。 "" 或"*://*/" 這些會將您的擴充功能置於Chrome 線上應用程式商店中超慢審核佇列中由於廣泛的主機權限。 ManifestV2 與上述的差異: #使用chrome.tabs.executeScript。 在權限中指定網站。 點贊 +0 新增回覆 关闭回复 P粉046878197 回覆
我是否必須在background.html 和popup.html 之間使用訊息傳遞才能存取網頁的DOM?我想在 popup.html 中完成所有操作,如果可能的話也使用 jQuery。
使用程式註入來新增該 div 的擴充彈出腳本的一些範例。
不要忘記在manifest.json中新增權限,請參閱其他答案以獲取更多資訊。
簡單呼叫:
(async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent1, }); })(); // executeScript runs this code inside the tab function inContent1() { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = 'DIV'; document.body.appendChild(el); }
注意:在 Chrome 91 或更早版本中,func: 應為 function:。
func:
function:
使用參數呼叫並接收結果
需要 Chrome 92,因為它實作了 args。
args
範例1:
res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: (a, b) => { return [window[a], window[b]]; }, args: ['foo', 'bar'], });
範例2:
(async () => { const [tab] = await chrome.tabs.query({active: true, currentWindow: true}); let res; try { res = await chrome.scripting.executeScript({ target: {tabId: tab.id}, func: inContent2, args: [{ foo: 'bar' }], // arguments must be JSON-serializable }); } catch (e) { console.warn(e.message || e); return; } // res[0] contains results for the main page of the tab document.body.textContent = JSON.stringify(res[0].result); })(); // executeScript runs this code inside the tab function inContent2(params) { const el = document.createElement('div'); el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red'; el.textContent = params.foo; document.body.appendChild(el); return { success: true, html: document.body.innerHTML, }; }
// uses inContent1 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent1 })()` });
使用參數呼叫並接收結果:
// uses inContent2 from ManifestV3 example above chrome.tabs.executeScript({ code: `(${ inContent2 })(${ JSON.stringify({ foo: 'bar' }) })` }, ([result] = []) => { if (!chrome.runtime.lastError) { console.log(result); // shown in devtools of the popup window } });
此範例使用 inContent 函數的程式碼自動轉換為字串,這樣做的好處是 IDE 可以應用語法突出顯示和 linting。明顯的缺點是瀏覽器會浪費時間來解析程式碼,但通常不到 1 毫秒,因此可以忽略不計。
inContent
問題:擴充頁面(彈出視窗、選項、MV2 中的背景頁面等)與網頁分離,它們有自己的DOM、document、window 和chrome-extension:// URL。
document
chrome-extension://
解決方案:使用內容腳本存取網頁頁面或與其內容互動。
manifest.json:
"content_scripts": [{ "matches": ["*://*.example.com/*"], "js": ["contentScript.js"] }],
它將在頁面載入時運行一次。之後,請使用訊息傳遞。
警告!它不能傳送 DOM 元素、Map、Set、ArrayBuffer、類別、函數等。它只能發送與 JSON 相容的簡單物件和類型,因此您需要手動提取所需的資料並將其作為簡單陣列或物件傳遞。
ManifestV3:
在擴充腳本(如彈出視窗)可根據需要將內容腳本/函數注入標籤。
此方法的結果是內容腳本中的最後一個表達式,因此可用於擷取資料。資料必須與 JSON 相容,請參閱上面的警告。
manifest.json 中所需的權限:
權限
「腳本」
"activeTab"
如果理想情況不可能,請將允許的網站新增至manifest.json 中的host_permissions:
host_permissions
「*://*.example.com/」 以及您想要的任何其他網站。
「*://*.example.com/」
"" 或"*://*/" 這些會將您的擴充功能置於Chrome 線上應用程式商店中超慢審核佇列中由於廣泛的主機權限。
""
"*://*/"
ManifestV2 與上述的差異:
使用程式註入來新增該 div 的擴充彈出腳本的一些範例。
清單V3
不要忘記在manifest.json中新增權限,請參閱其他答案以獲取更多資訊。
簡單呼叫:
注意:在 Chrome 91 或更早版本中,
func:
應為function:
。使用參數呼叫並接收結果
需要 Chrome 92,因為它實作了
args
。範例1:
範例2:
清單V2
簡單呼叫:
使用參數呼叫並接收結果:
此範例使用
inContent
函數的程式碼自動轉換為字串,這樣做的好處是 IDE 可以應用語法突出顯示和 linting。明顯的缺點是瀏覽器會浪費時間來解析程式碼,但通常不到 1 毫秒,因此可以忽略不計。問題:擴充頁面(彈出視窗、選項、MV2 中的背景頁面等)與網頁分離,它們有自己的DOM、
document
、window 和chrome-extension://
URL。解決方案:使用內容腳本存取網頁頁面或與其內容互動。
方法1.宣告式
manifest.json:
它將在頁面載入時運行一次。之後,請使用訊息傳遞。
警告!它不能傳送 DOM 元素、Map、Set、ArrayBuffer、類別、函數等。它只能發送與 JSON 相容的簡單物件和類型,因此您需要手動提取所需的資料並將其作為簡單陣列或物件傳遞。
方法 2. 程式化
ManifestV3:
在擴充腳本(如彈出視窗)可根據需要將內容腳本/函數注入標籤。
此方法的結果是內容腳本中的最後一個表達式,因此可用於擷取資料。資料必須與 JSON 相容,請參閱上面的警告。
manifest.json 中所需的
權限
:「腳本」
- 強制;"activeTab"
- 理想場景,適合對使用者操作的回應(通常是點擊工具列中的擴充圖示)。安裝擴充功能時不顯示任何權限警告。如果理想情況不可能,請將允許的網站新增至manifest.json 中的
host_permissions
:「*://*.example.com/」
以及您想要的任何其他網站。""
或"*://*/"
這些會將您的擴充功能置於Chrome 線上應用程式商店中超慢審核佇列中由於廣泛的主機權限。ManifestV2 與上述的差異:
權限
中指定網站。