2009-12-29 10 views
4

J'utilise actuellement ce qui suit l'obtenir le texte sélectionné à partir d'une page Web dans une extension Firefox personnalisée:Obtenir HTML de sélection/plage à partir d'une page Web dans Mozilla Firefox

getSelectedText: function(){ 
    var textWindow = document.commandDispatcher.focusedWindow; 
    var text = textWindow.getSelection();  
    if (text == null) {text =' ';} 
    text = text.toString(); 
    text = text.replace(/^\s*$/ , ""); 
    text = text.replace(/\r/g, "\r"); 
    text = text.replace(/\n/g, "\n"); 
    text = text.replace(/^\s+|\s+$/g , " "); 
    text = text.replace(new RegExp(/\u2019/g), "'"); 
    text = text.replace(new RegExp(/\u201A/g), ","); 
    text = text.replace(new RegExp(/\u201B/g), "'"); 
    return {str:text}; 
} 

Cela fonctionne très bien pour le texte brut .

Mon problème est que je veux que tous les éléments de la page Web copié ainsi (un peu comme les extraits du Web disposent dans Safari)

Cas d'utilisation - Si l'utilisateur sélectionne dans une page Web avec du texte formaté et images , Je veux que le HTML sous-jacent soit également copié, afin que je puisse le coller avec précision dans une autre fenêtre XUL - même envoyer le contenu sous forme de courriel HTML riche si je le souhaite.

Des pointeurs?

+0

Juste par curiosité, comment proposez-vous de traiter les feuilles de style? – Joel

+0

@Joel: Je ne pense pas que vous puissiez sortir la feuille de style, c'est-à-dire que vous capturez simplement le code HTML et c'est tout. –

+0

Mais toutes les ressources liées (images, css, etc.) devront être résolues si vous voulez que l'affichage soit tout représentatif. – Joel

Répondre

9

Essayez d'utiliser ce code:

var range = window.getSelection().getRangeAt(0); 
var content = range.cloneContents(); 

Une fois ce code est exécuté, content sera un fragment de document qui contient une copie des noeuds sélectionnez DOM. Notez que les écouteurs d'événement ne seront pas clonés. Pour plus d'informations, rendez-vous au https://developer.mozilla.org/en/DOM/range.cloneContents

+1

Merci Xavi, ça marche pour moi! –

+3

fonctionne également sur Chrome. Pourquoi cette réponse n'a-t-elle pas été acceptée? – jldupont