gpt4 book ai didi

javascript - chrome 扩展在定义的变量上抛出 "not defined"

转载 作者:数据小太阳 更新时间:2023-10-29 05:15:57 27 4
gpt4 key购买 nike

我正在尝试使用 chrome 扩展程序访问本地变量。在页面脚本中尝试 console.info(myVar) 时,我得到 myVar is not defined

但是,当使用 chrome 开发人员工具并在调试控制台中执行相同的代码片段时,我得到了 myVar 的全部内容。

尝试访问 window.myVar 时的行为相同,当通过 chrome 扩展程序打印时,这只是 undefined

通过开发工具和页面脚本使用以下代码片段将脚本标记注入(inject)正文,会导致完全相同的行为。

   $("body").append($("<script />", {
html: "console.info(myVar);"
}));

在开发工具中执行时会打印变量,但在页面脚本中会出现 javascript 错误

最佳答案

您看到的是预期的行为。

Content scripts execute in a special environment called an isolated world. They have access to the DOM of the page they are injected into, but not to any JavaScript variables or functions created by the page. It looks to each content script as if there is no other JavaScript executing on the page it is running on. The same is true in reverse: JavaScript running on the page cannot call any functions or access any variables defined by content scripts.

http://developer.chrome.com/extensions/content_scripts.html#execution-environment

当您从页面、Chrome 开发工具的控制台或注入(inject)的脚本运行 console.info(myVar); 时,它在页面的上下文中运行,因此将变量视为定义。

但是,当从您的扩展代码内部运行相同的代码时,您将在一个完全不同的环境中运行,因此 myVar 是未定义的。

也许您可以使用共享 DOM 来解决这个问题。
http://developer.chrome.com/extensions/content_scripts.html#host-page-communication

编辑

除非有人纠正我,否则下面的 console.info(myVar); 代码被注入(inject)到 script 元素中,同时仍在扩展的上下文中执行:

$("<script />", {
html: "console.info(myVar);" // myVar points to extension's myVar, not page's
});

可以通过记录 chrome.extension 对象或在 contentscript 中声明 myVar 来运行一个简单的测试——chrome.extension 将是available 并且 myVar 将完全按照内容脚本中的定义进行记录。

建议使用外部脚本(这对于模块化也更好),将其添加到 web_accessible_resources 并创建一个带有 src< 的 script 元素 指向该外部脚本的属性。

下面的示例扩展代码在加载启用扩展的 test.html 页面时警告“test”。

list .json

{
"name": "Test",
"version": "0.1.0",
"manifest_version": 2,
"description": "Just a test.",
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["contentscript.js"]
}],
"web_accessible_resources": [
"myscript.js"
]
}

test.html(访问过的页面)

<!DOCTYPE html>
<html>
<head>
<script>
window.test = 'test';
</script>
</head>
<body>
</body>
</html>

contentscript.js

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = chrome.extension.getURL('myscript.js');
document.getElementsByTagName('head')[0].appendChild(script);

myscript.js(这是将在页面上下文中运行的外部脚本)

alert(window.test);

关于javascript - chrome 扩展在定义的变量上抛出 "not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16784553/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com