- 此问题在此处已有答案**:
Access variables and functions defined in page context using a content script(6个答案)
Access global js variables from js injected by a chrome extension(1个答案)
2天前关闭。
我创建了一个扩展,可以在twitter上的每条tweet上附加一个按钮,当我点击这个按钮时,我应该执行一个函数window.phantom.solana.connect()。
当我直接在控制台中输入window.phantom.solana.connect()时,它可以工作,但问题是当我尝试从内容脚本触发此函数时,窗口对象的上下文与我在浏览器中使用的上下文不同,并且它不包含phantom.solana...属性
这是我的清单. json
{
"manifest_version": 3,
"name": "react-boilerplate",
"description": "react-boilerplate for chrome extension",
"version": "1.0.0",
"action": {
"default_title": "React Boilerplate"
},
"permissions": \["tabs", "bookmarks", "storage", "identity", "scripting"\],
"icons": {
"16": "icon.png",
"48": "icon.png",
"128": "icon.png"
},
"background": {
"service_worker": "background.js"
},
"content_scripts": \[
{
"matches": \["https://*.twitter.com/*"\],
"js": \["contentScript.js"\]
}
\],
"web_accessible_resources": \[
{
"resources": \["web_accessible_resources.js"\],
"matches": \["\<all_urls\>"\],
"extension_ids": \["bfnaelmomeimhlpmgjnjophhpkkoljpa"\]
}
\]
}
我的内容脚本
import React from "react";
import { createRoot } from "react-dom/client";
import "../assets/tailwind.css";
import ContentScript from "./contentScript";
function init() {
const appContainer = document.createElement("div");
if (!appContainer) {
throw new Error("Cannot find app container");
}
const root = createRoot(appContainer);
const articleList = window.document.querySelectorAll("article");
root.render(\<ContentScript /\>);
for (const element of articleList) {
var btn = document.createElement("button");
btn.appendChild(document.createTextNode("Bonk tweet"));
btn.style.color = "white";
btn.addEventListener("click", function () {
// this function should catch the window object
chrome.runtime.sendMessage(
{ greetings: "Bonk tweet" },
function (response) {
console.log(response.farewell);
// don't have access to window.phantom.solana
console.log(this);
console.log(window);
}
);
});
element.appendChild(btn);
}
}
setTimeout(init, 4000);
我试着通过事件、web_accessible_resources等各种方式访问它......仍然没有运气。有人知道如何在我的扩展中访问相同的窗口对象吗
1条答案
按热度按时间tvz2xvvm1#
内容脚本不能访问主机页面的
window
对象,但它们可以访问主机页面的DOM。因此,您可以通过向主机页面的DOM添加script
标记,使其在主机页面的上下文中执行并访问主机window
对象来解决此限制。此外,您可以在上面的script标记中设置一个消息处理程序,并从内容脚本发送一条消息以执行该处理程序。
但如果页面具有内容安全策略,则此解决方法无效。