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

时间:2015-12-09 03:01:41

标签: 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>

它不起作用,为什么?如下所示是来自 Chrome App&amp;扩展开发者工具,其中一些错误消息是用省略号剪切的,抱歉我还没弄清楚如何查看完整的错误消息,查看详细信息只给了我一个堆栈跟踪,而不是完整的错误消息。

enter image description here

2 个答案:

答案 0 :(得分:9)

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

  1. value

  2. 中将innerHTML更改为document.getElementById("output").value
  3. activeTab档案

  4. 中添加manifest.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"
        ]
    }
    

    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>
    

    popup.js

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

答案 1 :(得分:3)

您的原始方法是正确的(可能来自this question)。

它有两个问题:

  1. 内联脚本(<script>...</script>are not allowed;通过将代码放在单独的文件中来修复问题,例如popup.js

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

  3. 修好后,你的&#34;直接&#34;方法有效。

    顺便说一下,为了将来调试此类问题,您需要inspect the popup page

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

    你不需要一个事件页面就是这个特例;你的弹出窗口可以调用executeScript并收听消息。有些情况下 需要它,特别是当您无法保证在内容脚本发送消息时弹出窗口打开时;但在这里你可以保证。

    假设您需要事件页面,请考虑 not 使用getBackgroundPage调用其中的方法 - 它紧密地耦合代码;你可以改为发送消息。可以使用sendResponse将结果传回even asynchronously

    最后,您的架构在content.js方面令人困惑。只有一个副本在附加到目标页面的特殊上下文中执行(而不是在扩展上下文中)。