如何在chrome扩展开发中获取选定的文本?

Sea*_*ene 3 javascript google-chrome google-chrome-extension

我正在开发一个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>
Run Code Online (Sandbox Code Playgroud)

它不起作用,为什么?以下是来自Chrome App和Extension Developer Tool的错误消息,其中一些错误消息是用省略号剪切的,抱歉我还没弄清楚如何在这里查看完整的错误消息,查看详细信息只给出了堆栈跟踪,而不是完整的错误消息.

在此输入图像描述

Sea*_*ene 10

正如@Xan建议的那样,之前提到的方法(你可以在这里找到它)过于复杂.为了让它发挥作用,只有两件事要做:

  1. 更改valueinnerHTMLdocument.getElementById("output").value

  2. activeTabmanifest.json文件中添加权限

这是完整的源代码,共有三个文件.

的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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

popup.html

<!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>
Run Code Online (Sandbox Code Playgroud)

popup.js

chrome.tabs.executeScript( {
    code: "window.getSelection().toString();"
}, function(selection) {
    document.getElementById("output").innerHTML = selection[0];
});
Run Code Online (Sandbox Code Playgroud)


Xan*_*Xan 4

你原来的方法是正确的(可能取自这个问题)。

它有两个问题:

  1. 不允许内联脚本 ( <script>...</script>) ;它可以通过将代码放入单独的文件(例如.popup.js

  2. 您需要访问内容脚本注入页面的权限;在您的特定情况下,有一个特定的权限,"activeTab"它以透明且轻松的方式进行,没有安全警告。当您的扩展被调用时(通过单击按钮),您可以访问当前选项卡。

解决了这些问题后,您的“直接”方法就可以发挥作用。

顺便说一下,以后要调试此类问题,您需要检查弹出页面


至于你自己的答案,你把事情过于复杂化了。

在这种特殊情况下,您不需要事件页面;您的弹出窗口可以呼叫executeScript和收听消息。在某些情况下,您确实需要它,特别是当您无法保证内容脚本发送消息时弹出窗口打开时;但在这里你可以保证。

假设您需要事件页面,请考虑不要使用getBackgroundPage调用其中的方法 - 它与代码紧密耦合;您可以改为发送消息。sendResponse可用于将结果传回,甚至可以异步传回

最后,您的架构对于content.js. 它仅在附加到目标页面的特殊上下文中(而不是在扩展上下文中)执行它的一个副本。