【问题标题】:How to detect text selected by double clicking using Firefox SDK (for addons)?如何使用 Firefox SDK(用于插件)检测通过双击选择的文本?
【发布时间】:2016-07-11 03:45:19
【问题描述】:

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

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提供的“双击”事件,但是怎么做呢?

【问题讨论】:

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


【解决方案1】:

所以插件必须在窗口中获取选定的文本:

插件不能直接操作窗口或选项卡。我的意思是它可以获取有关它的详细信息——比如所有活动选项卡的列表、打开一个选项卡、获取焦点等。

  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 确实有区别:

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

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

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

  1. 用 someScript.js 做事:

在这种情况下,通过双击获取选定的文本:

//someScript.js
document.addEventListener('dblclick', function(){
        var selObj = window.getSelection();
        oRange = selObj.getRangeAt(0);
        var selectedText = selObj.toString();

        console.log(selectedText);
}, false);
  1. 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);

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2013-10-14
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多