【问题标题】:Searching and highlighting text on current page for a Chrome Extension在当前页面上搜索和突出显示 Chrome 扩展的文本
【发布时间】:2013-05-30 13:29:38
【问题描述】:

我应该如何连接我的页面以在当前选项卡上搜索和突出显示文本?

目前我有:

  • manifest.json 定义内容/backgr/事件页面是否有重要作用,自动注入代码等?
  • popup.html 本质上是 search.js 使用的搜索输入的外壳
  • search.js 应该在后台/事件/内容/popup.html 页面中吗?

看完还是不明白:

什么是内容页面与背景/事件页面?

我知道一个不断运行与注入,但这与我从 chrome 扩展手册中得到的一样多,我仍然不太明白内容脚本/页面是否与 popup.html 分开,以及什么popup.html 中的脚本与内容页面/脚本之间的区别是。

我所知道的:

我知道如何在页面上搜索文本,并使用 JS 替换它或更改其样式等。

我需要阅读 Chrome 扩展的消息传递 API。

我知道我需要知道如何使用消息 API,页面搜索和突出显示是否需要它?

总结:

我不需要演练或完整的答案,只需要一点帮助来了解 Chrome 扩展程序的工作原理,或者至少我应该如何设置与页面交互 IE 相关的我:

search.js 内容页面注入 >>>>> popup.html

也许还有一点关于注入在 chrome 扩展中的工作原理(IE,我是否只需要指定它是 manifest.json 中的内容页面来注入它还是有更多的工作)/预期的行为?

对于在阅读手册时出现混乱的想法/问题/可能遗漏了与我的问题相关的内容,我们深表歉意。

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension


    【解决方案1】:

    我将首先让每种页面/脚本的目的更加清晰。


    首先是background page/scriptbackground script 是您的扩展程序所在的位置。它不是必需的,但为了完成大多数扩展操作,您需要一个。您可以在其中设置各种事件侦听器等,具体取决于您想要它做什么。它生活在自己的小世界中,只能使用chrome.* api 与其他页面和脚本进行交互。如果您将其设置为事件页面,则它的工作方式完全相同,只是它在不使用时卸载并在有事时加载回内存。

    Content scripts 指注入的 Javascript 和/或 css。它们是用于与网页交互的主要工具。他们对chrome.* api 的访问权限非常有限,但他们可以完全访问他们被注入的页面的DOM。我们将在一分钟内重新使用它们。

    现在为Popup pages。与background scriptcontent script 不同,弹出窗口同时具有HTMLJS 部分。 HTML 部分就像任何其他页面一样,只是很小,并且作为从图标中弹出的覆盖弹出窗口。然而,它的脚本部分可以做背景页面所做的所有事情,除了它在弹出窗口关闭时卸载。


    现在区别更清楚了,让我们继续您想要做的事情。听起来您想打开弹出窗口,让用户在当前选项卡中输入要搜索的文本,然后在页面上突出显示该文本。既然你说你已经知道你打算如何突出显示文本,那我就把这部分留给你。

    首先设置我们的清单文件。对于这个特定的动作,我们不需要后台脚本。我们需要的是"tabs""activeTab" 权限。这些将使我们能够稍后注入我们的脚本。我们还需要使用它的弹出窗口来定义浏览器操作。总而言之,它看起来像这样:

    "browser_action": {
      "default_icon": "icon.png",
      "default_popup": "popup.html" 
    },
    "permissions": [
      "tabs", "activeTab"
    ]
    

    现在在我们的popup.html 文件中,我们只能有标记和css,根本没有内联代码。我们将把它全部放在我们的js 文件中并包含它。像这样的东西应该可以工作:

    <!DOCTYPE html> 
    <html>
      <head>
        <script src="popup.js"></script>
      </head>
      <body>
        <input type="text" id="searchText">
        <button id="searchButton">Search</button>
      </body>
    </html>
    

    这是我们回到内容脚本的地方。注入内容脚本有两种方法,第一种是在清单中定义。当您总是想为一组特定的 url 注入它时,这种方法效果最好。其次,在需要的时候使用chrome.tabs.executeScript方法注入。这就是我们将使用的。

    window.onload = function(){
      document.getElementById('searchButton').onclick = searchText;
    };
    function searchText(){
      var search = document.getElementById('searchText').value;
      if(search){
        chrome.tabs.query({active:true,currentWindow:true},function(tabs){
          chrome.tabs.executeScript(tabs[0].id,{file:search.js});
          chrome.tabs.sendMessage(tabs[0].id,{method:'search',searchText:search});
        });
      }
    }
    

    这样,我们就成功地注入了我们的脚本,然后将搜索文本发送到该脚本。只需确保将脚本包装在 onMessage 侦听器中,如下所示:

    chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
      // message.searchText is the text that was captured in the popup    
      // Search/Highlight code goes here
    });
    

    这几乎概括了它。有了这个,你应该能够让它工作。如果还有什么不清楚的地方告诉我,我会解决的。

    【讨论】:

    • 只有一个问题需要澄清:“window.onload”部分是popup.js代码从search.js调用注入的“chrome.runtime.onMessage”正确吗?
    • 不幸的是,chrome.runtime.onMessage.addListener(function(message,sender,sendResponse) 中没有代码有效 =(
    【解决方案2】:

    我认为让您感到困惑的是“内容页面”这个不存在的概念。哪有这回事。您可能指的是“内容脚本”。让我解释一下扩展的三个主要组成部分:

    背景页面

    正如您所说,这是 Chrome 扩展程序的持久性方面。即使它可以是 HTML 页面,它也不会被渲染。您只需使用它来运行 JavaScript 和其他保持持久性的内容。 “刷新”后台页面的唯一方法是在扩展管理器中刷新扩展,或者重新安装扩展。

    这对于保存应保持持久性的信息最为有用,例如身份验证凭据或应随时间累积的计数器。但是,仅在绝对必要时才使用背景页面,因为只要用户运行您的扩展程序,它就会消耗资源。

    你可以像这样添加一个后台脚本到manafest文件中:

    "background": {
        "scripts": [
            "background.js"
        ]
    },
    

    或者像这样:

    "background": {
        "page": "background.html"
    },
    

    然后通过一个典型的标签简单地将 background.js 添加到 background.html 中。

    弹出窗口

    这是您单击工具栏上的图标时所看到的。它只是一个带有一些 HTML 的弹出窗口。它可以包含 HTML、JavaScript、CSS 以及您可以放入普通网页的任何内容。

    并非所有扩展都需要弹出窗口,但很多都需要。例如,如果您的突出显示扩展程序所做的只是突出显示页面上的文本,则它可能不需要弹出窗口。但是,如果您需要收集搜索结果(这似乎很可能)或为用户提供一些设置或其他 UI,那么弹出窗口是解决此问题的好方法。

    您可以像这样向清单文件添加一个弹出窗口:

    "browser_action": {
        "default_popup": "popup.html"
    },
    

    内容脚本

    正如我所提到的,这本身并不是一个“页面”——它是一个脚本或一组脚本。内容脚本是您用来将 JavaScript 注入用户即浏览器的页面中的内容。例如,用户访问 Facebook,内容脚本可以将背景更改为红色。几乎可以肯定,您需要使用它来突出显示页面上的文本。只需注入一些 JavaScript 和任何必要的库来搜索页面或爬取 dom,并将更改呈现到该页面。

    您可以在每次用户打开任何这样的 URL 时注入内容脚本:

    "content_scripts": [
        {
            "matches" : [
                "<all_urls>"
            ],
            "js" : [
                "content.js"
            ]
        }
    ],
    

    上面将“content.js”注入“所有网址”。

    您还需要将其添加到权限中:

    "permissions": [
        "<all_urls>",
    ]
    

    您甚至可以将 JQuery 添加到内容脚本列表中。扩展的好处是内容脚本是沙盒化的,因此您注入的 JQuery 版本不会与用户访问的页面上的 JQuery 冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多