javascript - 如何使用 Firefox SDK(用于插件)检测双击选择的文本?

标签 javascript firefox-addon firefox-addon-sdk event-listener double-click

用户将双击网页中的单词,插件应该能够监听该事件并获取所选文本。

What the SDK page for selection gives as an example :

get_definitions.port.on("text-entered", function (text) {
  console.log(text);
  text_entry.hide();
});

function myListener() {
  console.log(selection.text);
}

问题是检测到任何类型的选择。我需要的是通过双击选择文本时检测文本...

我无法弄清楚如何添加一个事件监听器来监听网页上的双击事件。请注意:

addEventListener('dblclick', function);

不起作用,因为插件的index.js无法直接与网页交互。所以它必须不断监听firefox SDK提供的“双击”事件,但是怎么做呢?

最佳答案

因此插件必须获取窗口中选定的文本:

插件无法直接操作窗口或选项卡。我的意思是它可以获取有关它的详细信息 - 例如所有事件选项卡的列表、打开选项卡、获取焦点等。

  1. 附加内容脚本

但要真正在较低级别上工作,例如“获取所选文本”,Firefox SDK 提供了“Content Scripts ”。它们必须附加到目标选项卡。我们可以通过两种方式附加内容脚本“someScript.js”:

您可以直接使用 tabs API 附加:

var tabs = require("sdk/tabs");

tabs.on('activate', function(tab) {
  var worker = tab.attach({
    contentScriptFile: data.url("someScript.js")
  });
});

或者您可以使用PageMod :

var pageMod = require("sdk/page-mod");

pageMod.PageMod({
  include: "*.mozilla.org",
  contentScriptFile: data.url("someScript.js")
});

使用 Tabs API 和 PageMod API 确实有区别:

选项卡 API:您可以根据不同的条件(哪个选项卡、哪个状态等)决定将 contentScript 附加到哪个选项卡。

PageMod API:附加到具有匹配 URL 模式的所有页面。

现在附加的 contentScript 的行为就像它是附加到的页面的一部分。

  • 使用 someScript.js 做一些事情:
  • 在本例中,通过双击获取选定的文本:

    //someScript.js
    document.addEventListener('dblclick', function(){
            var selObj = window.getSelection();
            oRange = selObj.getRangeAt(0);
            var selectedText = selObj.toString();
    
            console.log(selectedText);
    }, false);
    
  • contentScript 和 main.js(插件)之间的通信:
  • 如您所见,contentScript 仅将所选文本打印到控制台。为了与 Addon 或 main.js 或 index.js 进行相同的通信,我们需要 make use of the "port" object .

    标签 API:

    var tabs = require("sdk/tabs");
    
    tabs.on('activate', function(tab) {
      var worker = tab.attach({
        contentScriptFile: data.url("someScript.js")
      });
    
      //Keep listening on the port named "selectedText" from someScript.js
      worker.port.on("selectedText", function(sText) {
          console.log(sText);
      });
    });
    

    PageMod API:

    var pageMod = require("sdk/page-mod");
    
    pageMod.PageMod({
      include: "*.mozilla.org",
      contentScriptFile: data.url("someScript.js"),
    
      //Keep listening on the port named "selectedText" from someScript.js
      onAttach: function(worker) {
          worker.port.on("selectedText", function(sText) {
              console.log(sText);
          });
      }
    });
    

    从 contentScript 发送消息到 main.js:

    //someScript.js
    document.addEventListener('dblclick', function(){
            var selObj = window.getSelection();
            oRange = selObj.getRangeAt(0);
            var selectedText = selObj.toString();
    
            console.log(selectedText);
    
            //emit the selected text on port named "selectedText"
            self.port.emit("selectedText", selectedText);
    }, false);
    

    关于javascript - 如何使用 Firefox SDK(用于插件)检测双击选择的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185159/

    相关文章:

    javascript - axios.all的动态使用

    javascript - 如何阻止 Express 解析 Angular 模板?

    debugging - Firefox/Firebug 的 "console.log"总是返回 'undefined'

    javascript - firefox jpm - 从选项卡调用外部发送到选项卡

    javascript - 将函数分配给变量在 javascript firefox 扩展中不起作用

    javascript - 新行增加了我的 body.childNodes 数量

    javascript - 停止事件监听器

    javascript - tab加载firefox addon SDK时函数返回

    javascript - linux 共享库可以打开、显示和 printf 到终端吗?

    javascript - Firefox 附加组件 window.navigator.userAgent 错误 : window not defined