2010-08-11 7 views
7

Ich schreibe eine Chrome-Erweiterung und frage mich, ob es möglich ist, den ausgewählten Text eines bestimmten Tabs einschließlich des zugrunde liegenden HTML zu erhalten? Wenn ich also einen Link auswähle, sollte er auch das <a> Tag zurückgeben.Get page selection einschließlich HTML?

Ich habe versucht, auf das Kontextmenü Ereignisobjekte suchen (ja, ich bin für diese ein Kontextmenü), und das ist alles, was mit dem Rückruf kommt:

editable : false 
menuItemId : 1 
pageUrl : <the URL> 
selectionText : <the selected text in plaintext formatting, not HTML> 

Es gibt auch ein Tab-Objekt , aber nichts darin war auch sehr nützlich.

So bin ich irgendwie ratlos hier. Ist das überhaupt möglich? Wenn ja, wäre jede Idee, die Sie haben, großartig. Vielen Dank! :)

+0

können Sie die richtige Lösung zur Verfügung stellen? –

+0

Das war vor 5 Jahren, ich glaube nicht, dass ich die Erweiterung habe, sorry. – qJake

Antwort

-1

Sieht aus wie this und this Erweiterungen tun, was Sie brauchen.

+0

Ich schaute durch die Quelle von einem von diesen und fand, wie sie es taten, danke :) – qJake

+1

Könnten Sie bitte Ihre Lösung teilen? Vielen Dank. –

+2

Ihr Link ist kaputt. es funktioniert nicht mehr. Können Sie die richtige Lösung anbieten? –

8

den ausgewählten Text einer Seite zu bekommen ist ziemlich einfach, können Sie so etwas wie

var text = window.getSelection().toString(); 

tun und Sie erhalten eine Textdarstellung des aktuell ausgewählten Text, die Sie von einem Content-Skript zu einem passieren kann Hintergrundseite oder ein Popup.

Das Holen von HTML-Inhalt ist sehr viel schwieriger, vor allem weil die Auswahl nicht immer an einer sauberen HTML-Grenze im Dokument liegt (was ist, wenn Sie nur einen kleinen Teil einer langen Verknüpfung oder einige Zellen einer Tabelle auswählen beispielsweise). Der direkteste Weg, um das gesamte mit einer Auswahl verknüpfte HTML zu erhalten, ist der Verweis auf commonAncestorContainer, eine Eigenschaft in einem Auswahlbereich, der dem tiefsten Knoten entspricht, der sowohl den Anfang als auch das Ende der Auswahl enthält. Um dies zu erhalten, würden Sie so etwas wie:

var selection = window.getSelection(); 
// Only works with a single range - add extra logic to 
// iterate over more ranges if needed 
var range = selection.getRangeAt(0); 
var container = range.commonAncestorContainer; 
var html = container.innerHTML 

Natürlich wird diese enthalten wahrscheinlich eine Menge von HTML, die nicht tatsächlich gewählt wurde. Es ist möglich, dass Sie durch die Kinder des gemeinsamen Vorfahrens iterieren und alles entfernen können, was nicht in der Auswahl war, aber das wird etwas komplizierter und ist möglicherweise nicht notwendig, abhängig davon, was Sie versuchen zu tun.

Um zu zeigen, wie diese in eine Erweiterung alle bis wickeln, ich habe eine kurze Probe geschrieben, die Sie verweisen können: http://github.com/kurrik/chrome-extensions/tree/master/contentscript-selection/

+0

Ich habe ein Range-Objekt verwendet, aber ich habe die Lösung aus dem Quellcode des anderen Mannes bekommen, sorry. Sie erhalten jedoch immer noch eine Verbesserung, wenn Sie korrekte Informationen haben. :) – qJake

+0

Keine Sorgen;) Danke für die Aufwertung! –

0

Wenn Sie nicht wollen, alle die Geschwister, nur die ausgewählte HTML, Verwenden Sie range 's andere Methoden wie .cloneContents() (zu kopieren) oder .extractContents() (zu schneiden).

Hier verwende ich .cloneContents():

function getSelectedHTML() { 
    var range = window.getSelection().getRangeAt(0); // Get the selected range 
    var div = document.createElement("div"); 
    div.appendChild(range.cloneContents()); // Get the document fragment from selected range 
    return div.innerHTML; // Return the actual HTML 
}