Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Le menu contextuel

Envoyé par : Drazic

Date : 23/03/2006 11:30

Bonjour à tous,

Dans mon extension, lorsque l'utilisateur sélectionne du texte et qu'il effectue un clique-droit sur la sélection, une option supplémentaire s'ajoute au menu contextuel : "Copier le code HTML".

J'arrive sans problèmes à récupérer du texte grâce à la ligne de commande

var tempo=gContextMenu.searchSelected();

Le problème, c'est que je n'arrive pas à récupérer du code HTML, juste du texte simple !

Est-ce possible de récupérer le code HTML ? Si oui, comment ?

Merci d'avance ! Drazic

# Re: Le menu contextuel

Envoyé par : Drazic

Date : 27/03/2006 10:44

Petit up du topic, je suis vraiment bloqué... :S

# Re: Le menu contextuel

Envoyé par : Zéf

Date : 27/03/2006 23:19

Salut,

Je ne connais pas gContextMenu, mais en cherchant un peu, il semble avoir assez peu d'API (on peut savoir si c un lien, un image ou rien de spécial qui est pointé).

Pourquoi ne pas utiliser autre chose ?
J'ai jeté un oeil au source de WebDeveloper une extension bien complète qui m'a permis de découvrir pas mal de chose ... dont ça :

function getSelection() {
 var currentDocument       = getBrowser().contentDocument;
 var currentWindow         = getBrowser().contentWindow;
 var selection             = currentWindow.getSelection();
 selection.selectAllChildren(currentDocument.documentElement);
 return currentWindow.getSelection();
}

Voila, si ce n'est pas exactement cela que tu cherches, ça doit au moins être dans ce style là :)

Bon courage,
Z.

P.S. N'oublie surtout pas le XPCNativeWrapper ! (cf le tuto général dans la base de données de ce site)

# Re: Le menu contextuel

Envoyé par : Drazic

Date : 28/04/2006 18:14

Salut,

Merci pour ta réponse et désolé pour la mienne qui est si tardive ;) J'ai étudié le bout de code que tu m'as passé, et au final j'ai toujours le même problème, je ne récupère que du texte...

Par exemple, si l'utilisateur sélectionne du texte, qui est en italique, ensuite il y à un lien, dont le code serait :

<i>Bonjour, allez sur <a href="www.google.fr">Google</a> pour faire une recherche.</i>

J'obtiens :

Bonjour, allez sur Google pour faire une recherche.

# Re: Le menu contextuel

Envoyé par : thefab

Date : 29/04/2006 02:03

Hello,

A mon avis le getSelection() doit être une bonne piste mais le problème (je pense) c'est que tu essayes avec toString() et que cette méthode te retourne une version texte de l'objet.

Essaye de tester avec typeof(valeur-de-retour) pour voir si il s'agit vraiment d'un string ou d'un objet... si il s'agit d'un objet c'est surement un sous-document HTML (fragment mais je suis pas sur) qui contient tout le code HTML et que tu peux manipuler avec DOM.

Fabrice

# Re: Le menu contextuel

Envoyé par : Drazic

Date : 02/05/2006 11:26

Salut,

En utilisant

var currentWindow         = getBrowser().contentWindow;
var selection             = currentWindow.getSelection();

ou

var winWrapper = new XPCNativeWrapper(getBrowser().contentWindow, 'document', 'getSelection()');

J'obtiens un objet lorsque je teste avec typeof. Le problème c'est que lorsque je fais

for (var test in selection) dump(test+'\n');

Je n'obtiens que isCollapsed comme possibilité. Ou si je fais la même chose avec ma variable winWrapper, ca me fait carrément une erreur !

Je me demande si c'est vraiment possible...

# Re: Le menu contextuel

Envoyé par : laurentj

Date : 02/05/2006 11:42

bon, les gens, faudrait peut être apprendre à chercher un peu vous ne trouvez pas ? (désolé, mais être débutant n'est pas une excuse)

Régle numero 1 : chercher sur xulplanet.com

Donc, sur xulplanet, pour une recherche sur getSelection, on trouve notament une méthode getSelection() sur un objet nsIDOMNSHTMLDocument, et on trouve un getSelection() sur un objet nsIDOMWindow.

Que lis-t-on ? que le premier renvoi une chaîne, et le deuxième un objet nsISelection. Or précisement, contentDocument implemente précisement nsIDOMNSHTMLDocument, et contentWindow l'interface nsIDOMWindow. (pour le savoir, un peu de logique, de bon sens et 2-3 tests suffisent hein, pas besoin d'avoir fait 3 ans d'études sur Gecko, et au pire, dans les résultats de recherche, il y a comme par hasard, l'objet HTMLDocument et Window..).

La chaine ne suffit pas (car contient le texte), donc il faut travailler sur contentWindow et non contentDocument. Donc on recupère un objet nsISelection.

Aller, un peu de courage ! On apprend à cliquer, puis on clique sur nsISelection. Et.. Oh ! Miracle ! On a toute l'api pour récupérer les range et les noeuds DOM sélectionnés ! Incredible...

# Re: Le menu contextuel

Envoyé par : thefab

Date : 02/05/2006 12:57

Pour Laurent,

bon, les gens, faudrait peut être apprendre à chercher un peu...

Quoi les... ma piste du getSelection() qui retourne une version texte était pas loin...

C'est quand même pas à ceux qui donne une piste de faire les tests pour celui qui pose la question ! Hein, non, mais, et ho...

Fabrice

# Re: Le menu contextuel

Envoyé par : laurentj

Date : 02/05/2006 13:10

j'ai dis "les", pour généraliser. Je trouve qu'il y a de plus en plus de questions qui n'ont pas lieu d'être sur ce forum, dont leur auteur pourrait trouver la réponse en 30 secondes avec un peu de courage en allant dans la référence sur xulplanet.com, plutôt que d'attendre 3 jours qu'on veuille bien leur répondre.

Désolé pour ce coup de gueule.

# Re: Le menu contextuel

Envoyé par : Drazic

Date : 02/05/2006 17:29

Hum... Merci pour ta piste.

Cependant, traîtes-moi d'incompétent ou de ce que tu veux, j'ai passé des heures à chercher (aussi bien sur xulplanet que sur xulfr ou en effectuant diverses recherches sur google). Je suis sur ce problème depuis un bout de temps et je ne compte pas que sur ce forum.

Crois-moi ou pas, ce n'était pas de la mauvaise volonté !

# Re: Le menu contextuel

Envoyé par : Drazic

Date : 03/05/2006 15:24

J'ai enfin réussi ! Merci à tous ceux qui m'ont aidés, malgré le coup de gueule :p

Voilà mon code pour ceux qui seraient intéressés ! Je ne pense pas que ça soit ce qu'il y a de plus propre (notamment avec la création d'attributs comme points de repères), mais ça fonctionne !

var txtTmp;
var selection = getBrowser().contentWindow.getSelection();
var startRange = selection.getRangeAt(0).startContainer;
var startFind;
var ahref='';
if (!(startFind = startRange.data)) startFind=startRange.innerHTML;
if (startRange.parentNode.nodeName=='A') {
	ahref='<a href="'+startRange.parentNode.getAttribute('href')+'">';
}
var endRange = selection.getRangeAt(0).endContainer;
var endFind;
if (!(endFind = endRange.data)) endFind=endRange.innerHTML;
if (startFind!=endFind) {
	startRange = startRange.parentNode;
	endRange = endRange.parentNode;
	do{
		startRange.setAttribute('noxblog','startrange');
		startRange = startRange.parentNode;
	}
	while (startRange.nodeName!='HTML');
	do{
		endRange = endRange.parentNode;
	}
	while (endRange.getAttribute('noxblog')!='startrange');
	var pos = endRange.innerHTML.indexOf(startFind);
	txtTmp = endRange.innerHTML.substr(pos,endRange.innerHTML.length);
	pos = txtTmp.indexOf(endFind);
	txtTmp = txtTmp.substr(0,pos+endFind.length);
	if (ahref!='') txtTmp=ahref+txtTmp;
}
else txtTmp = startFind;

# Re: Le menu contextuel

Envoyé par : scarabee

Date : 08/06/2006 00:47

Bonjour

J'ai lu avec attention vos messages. Je cherche à réaliser une commande qui me permettrait de récupérer le code HTML d'un élément sélectionné dans une iframe nommée 'editeur'(pour un éditeur WYSIWYG).

Sous IE pas de souci. Voici mon code : " mydoc = window.frames'editeur'.document.selection.createRange(); codehtml = mydoc.htmlText; "

Mais cela ne marche bien sûr pas sous Firefox ...

Pour l'instant j'en suis à ne récupérer que le texte brut : " mydoc = document.getElementById('editeur'); textsanshtml = mydoc.contentWindow.getSelection().getRangeAt(0).toString(); "

Je ne sais vraiment pas comment faire pour afficher la source HTML de la sélection.

J'ai été sur http://www.xulplanet.com/references/xpcomref/ifaces/nsIDOMRange.html mais je n'ai pas trouvé d'éléments qui me permettaient d'afficher cette source.

Pourriez-vous m'aider ? Please ...

Guilhem

# Re: Le menu contextuel

Envoyé par : Christophe Charron

Date : 08/06/2006 08:32

Bonjour, s'inspirer du code de xul notepad de george Nava ? http://www.georgenava.com/xul/notepad/notepad.php

# Re: Le menu contextuel

Envoyé par : scarabee

Date : 08/06/2006 11:18

J'ai regardé un peu. En fait le javascript est à l'adresse : http://www.georgenava.com/xul/notepad/notepad.js

Il a dû mal configurer son serveur car on télécharge au lieu de lire... Mais je n'ai rien trouvé dedans de neuf.

Sinon j'ai une solution mais c'est pas la joie : c'est d'insérer des balises dans le code html au début et à la fin de la sélection avec la méthode de mon choix et de retraiter ensuite le code pour extraire les éléments qui sont inclus entre les balises. Il faut bien entendu utiliser des balises qui ne sont pas présentes dans le document.

Mais ça fait un peu bidouille.

En tout cas merci d'une réonse aussi rapide. Si vous avez des idées, n'hésitez pas.

Merci

# Re: Le menu contextuel

Envoyé par : Nouacha

Date : 07/08/2006 19:10

Voici comment récupérer le code HTML d'une sélection (faite dans le cadre par exemple d'un éditeur wysiwyg) :

   ewin = document.getElementById('editeur').contentWindow;
   selectext = ewin.getSelection();
   if (selectext.rangeCount > 0) {
     range = selectext.getRangeAt(0);
     var clonedSelection = range.cloneContents();
     var div = document.createElement('div');
     div.appendChild(clonedSelection);
     htmltext = div.innerHTML;
   } else {
     htmltext = '';
   }

Je pars du principe que l'élément a pour ID "editeur" Le script retourne la variable htmltext qui contient le code html. J'ai pas fait de return htmltext car dans mon cas, c'est intégré dans une fonction plus longue

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.