我正在开发一个Chrome扩展程序,其中包括获取当前选项卡的选定文本。这是我使用的html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
chrome.tabs.executeScript( {
code: "window.getSelection().toString();"
}, function(selection) {
document.getElementById("output").value = selection[0];
});
</script>
</head>
<body>
<div id="output"></div>
</body>
</html>
它不起作用,为什么?如下所示是来自 Chrome App&amp;扩展开发者工具,其中一些错误消息是用省略号剪切的,抱歉我还没弄清楚如何查看完整的错误消息,查看详细信息只给了我一个堆栈跟踪,而不是完整的错误消息。
答案 0 :(得分:9)
正如@Xan建议的那样,前面提到的方法(你可以找到它here)过于复杂。为了让它发挥作用,只有两件事要做:
在value
innerHTML
更改为document.getElementById("output").value
在activeTab
档案
manifest.json
权限
醇>
以下是完整的源代码,共有三个文件。
{
"manifest_version": 2,
"name": "sample",
"description": "A sample extension to get the selected text",
"version": "1.0",
"icons": {
"16": "img/icon16.png",
"48": "img/icon48.png",
"128": "img/icon128.png"
},
"browser_action": {
"default_popup": "popup.html"
},
"permissions": [
"activeTab"
]
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="popup.js"></script>
<title></title>
</head>
<body>
<div id="output"></div>
</body>
</html>
chrome.tabs.executeScript( {
code: "window.getSelection().toString();"
}, function(selection) {
document.getElementById("output").innerHTML = selection[0];
});
答案 1 :(得分:3)
您的原始方法是正确的(可能来自this question)。
它有两个问题:
内联脚本(<script>...</script>
)are not allowed;通过将代码放在单独的文件中来修复问题,例如popup.js
。
您需要获得访问内容脚本注入页面的权限;在您的特定情况下,有一个特定的权限"activeTab"
,它以透明,无痛的方式执行,没有安全警告。调用扩展程序时(通过单击按钮),您可以访问当前选项卡。
修好后,你的&#34;直接&#34;方法有效。
顺便说一下,为了将来调试此类问题,您需要inspect the popup page。
至于你自己的答案,你的事情过于复杂。
你不需要一个事件页面就是这个特例;你的弹出窗口可以调用executeScript
并收听消息。有些情况下 需要它,特别是当您无法保证在内容脚本发送消息时弹出窗口打开时;但在这里你可以保证。
假设您需要事件页面,请考虑 not 使用getBackgroundPage
调用其中的方法 - 它紧密地耦合代码;你可以改为发送消息。可以使用sendResponse
将结果传回even asynchronously。
最后,您的架构在content.js
方面令人困惑。只有一个副本在附加到目标页面的特殊上下文中执行(而不是在扩展上下文中)。