如何通过使用Firefox SDK(插件)双击来检测所选文本?

时间:2016-03-23 17:43:35

标签: 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 个答案:

答案 0 :(得分:3)

因此,插件必须在窗口中获取所选文本:

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

  1. 附加内容脚本
  2. 但是要真正在较低的水平上工作,因为"获取所选的文本" 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:您可以根据不同的条件(哪个选项卡,哪个州等)决定内容脚本附加到哪个选项卡。

    PageMod API:使用匹配的网址格式附加到所有网页。

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

    1. 使用someScript.js:
    2. 在这种情况下,双击获取所选文本:

      //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(插件)之间的通信:
      2. 如您所见,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);