1

Der Benutzer klickt doppelt auf ein Wort in der Webseite und das Addon sollte in der Lage sein, das Ereignis anzuhören und den ausgewählten Text zu erhalten.Wie erkennt man Text, der durch Doppelklicken mit Firefox SDK ausgewählt wurde (für Addons)?

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); 
} 

Die Sache jede Art von Auswahl ist erkannt wird. Was ich brauche, ist die Erkennung von Text, wenn es per Doppelklick ausgewählt wird ...

Ich konnte nicht herausfinden, wie man einen Ereignis-Listener hinzufügt, der auf der Webseite nach einem Doppelklick-Ereignis lauscht. Wohlgemerkt:

addEventListener('dblclick', function); 

würde nicht funktionieren, weil index.js des Addons nicht direkt mit der Webseite interagieren kann. Es muss also weiter auf ein "Doppelklick" -Ereignis warten, das durch das firefox SDK bereitgestellt wird, aber wie soll es gemacht werden?

+1

Sie zwischen index.js und Webseite .siehe kommunizieren können [Kommunikation mit anderen Skripten] (https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/Communicating_With_Other_Scr Schriften). Siehe auch Sie können es ohne Addon-Auswahlmethode http://stackoverflow.com/questions/5379120/get-the-highlighted-selected-text tun –

Antwort

2

So hat das Addon den ausgewählten Text in einem Fenster zu erhalten:

Das Addon kann nicht direkt auf das Fenster oder Tab manipulieren. Ich meine, es Details über sie erhalten können - wie Liste aller Registerkarten aktiv, eine Registerkarte öffnen, konzentrieren bekommen usw.

  1. Bringen Sie einen contentScript

Aber um wirklich zu arbeiten auf einem niedrigeren Niveau als "Abrufen des ausgewählten Textes" Firefox SDK bietet "Content Scripts". Sie müssen an die Zielregisterkarte angehängt werden. Wir können den Inhalt Script "someScript.js" auf zwei Arten befestigen:

Sie direkt anschließen tabs API verwenden, können:

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

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

oder Sie können PageMod verwenden:

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

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

Es ist in der Tat ein Unterschied zwischen der Verwendung von Tabs API und PageMod API:

Tabs API: Sie entscheiden, auf welcher Registerkarte das ContentScript angehängt ist verschiedene Kriterien (welche Registerkarte, welchen Status usw.).

PageMod API: Wird an alle Seiten mit einem passenden URL-Muster angehängt.

Jetzt verhält sich das angehängte contentScript wie ein Teil der Seite, an die es angehängt ist.

  1. Zeug Sie mit someScript.js:

In diesem Fall den markierten Text durch Doppelklick erhalten:

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

     console.log(selectedText); 
}, false); 
  1. Kommunikation zwischen contentScript und main.js (Add-on):

Wie Sie die contentScript nur sehen druckt den ausgewählten Text in die Konsole. Um dasselbe mit dem Addon oder main.js oder index.js zu kommunizieren, müssen wir make use of the "port" object.

Tabs 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); 
     }); 
    } 
}); 

senden Nachrichten von contentScript zu 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); 
Verwandte Themen