2 回答
TA贡献1856条经验 获得超11个赞
1. 要点
内容脚本无法直接访问全局变量,它们在“隔离的世界”中工作。
然而,内容脚本可以获得 DOM 的“干净”视图。这意味着:
内容脚本无法看到页面脚本定义的 JavaScript 变量。
web_accessible_resources
但您仍然可以通过manifest.json
.
2. 一种可能的解决方法
这是实现此目的的一种方法:
manifest.json
:
{
"manifest_version": 2,
"name": "Name",
"version": "0.0.2",
"description": "Description.",
"content_scripts": [
{
"matches": ["*://*.online-go.com/*"],
"js": ["content.js"]
}
],
"web_accessible_resources": ["script.js"]
}
您可以将您可能需要的任何脚本添加到密钥中,就像上面密钥web_accessible_resources
中使用的脚本一样。matches
您还可以使用通配符(例如 )*
同时匹配多个。
您可能仍然需要将其添加到您的:
compilerOptions
内部。tsconfig.json
"suppressImplicitAnyIndexErrors": true
script.ts
:
interface Goban {
bounded_height: number;
}
declare var goban: Goban;
goban = window['global_goban'];
console.log(goban.bounded_height.toString());
content.ts:
const script = document.createElement('script');
script.src = chrome.extension.getURL('script.js');
document.head.append(script);
@types/chrome
例如,您可能还需要通过npm i --save @types/chrome
.
3. 更多资源
window.postMessage
此外,内容脚本可以使用和与页面脚本进行通信window.addEventListener
。
TA贡献1712条经验 获得超3个赞
如果您在 online-go.com 上的浏览器中打开控制台,您可以输入goban并看到它是全局可用的,就像这样。因此,window.goban这将是访问变量的方式。我会做类似的事情:
interface Goban {
bounded_height: number;
}
const local_goban: Goban = window.goban;
console.log(local_goban.bounded_height.toString());
要不就
interface Goban {
bounded_height: number;
}
const goban: Goban = window.goban;
console.log(goban.bounded_height.toString());
在您定义的代码中global_goban,但随后继续访问goban. 确保变量名称一致。
至于自动从该页面输入全局变量,我认为这实际上是不可能的。Typescript 不能在浏览器中工作,它总是必须编译为普通的 JS,所以你只需要手动编写你想要的类型......你可以检查像 Definely Typed 这样的东西,但正如你提到的,如果他们没有没有发布任何公共存储库及其代码/包,那么您可能无法找到任何内容。
编辑:为了让打字稿不抱怨窗口变量,您可能需要添加更多类似的内容:
type Goban = {
bounded_height: number;
}
declare global {
var goban: Goban;
}
添加回答
举报