IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Wysiwyg selectionStart vaut undefined dans FF4


Sujet :

JavaScript

  1. #1
    Membre éclairé Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Par défaut Wysiwyg selectionStart vaut undefined dans FF4
    Bonjour à tous,

    J'essaie en ce moment de créer un wysiwyg, je présume que c'est un sujet récurrent et peu utile contenu du nombre d'éditeur déjà disponible sur l'internet, mais toutefois intéressant.

    J'ai comment à faire ceci - javascript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    wysiwyg.prototype.addCallback = function()
    {
    	var object = this;
     
    	for(var i in this.commands_edit)
    	{
    		this.getNod(i).onclick = function() { object.editText(); };
    	}
    }
     
    wysiwyg.prototype.editText = function()
    {
    	var textarea = this.getNod('edit_'+this.name);
    	var selection;
    	var selection_start;
    	var selection_end;
    	var pre_str;
            var ap_str;
            var retour;
     
    	textarea.focus();
    	var value = textarea.innerHTML;
     
    	if(typeof textarea.selectionStart != 'undefined')
    	{
    	    alert("ici");
    	    selection_start = textarea.selectionStart;
    	    selection_end = textarea.selectionEnd;
    	    pre_str = value.substring(0 , selection_start);
    	    ap_str = value.substring(selection_end, textarea.textLength );
    	    selection = value.substring(selection_start, selection_end);
    	    retour = pre_str + '<i>' + selection + '</i>' + ap_str;
    	}
     
    	this.getNod('edit_'+this.name).innerHTML = retour
    }
    html:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <div id="wysiwyg">
    <span id="g" class="g">g</span>
    <span id="i" class="i">i</span>
    <input id="description" type="hidden" value="" name="description">
    <div id="edit_description" class="descrip" contenteditable="true" spellcheck="false"></div>
    </div>
    Quand je clic sur l'un des "span" je vais bien à la méthode editText mais "textarea.selectionStart" retourne "undefined".

    Je me suis inspiré de plusieurs exemple du forum et d'internet pour arriver à ceci, je suis sous firefox4 mais rien à faire je ne vois d'où cela peut venir.

    Merci à tous pour votre aide.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Tu ne donnes pas assez de code pour aller au fond des choses, mais une première piste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var textarea = this.getNod('edit_'+this.name);
    this dans une méthode définie dans le prototype référence l'objet sur lequel elle s'applique (donc à priori l'instance actuelle de wisywig), est-ce vraiment une balise dont il s'agit (et donc wisywig a-t-il bien une propriété name) ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre éclairé Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Par défaut
    effectivement j'avais pas vu ça peut prêter à confusion, le "this.name" est un attribut de la classe, je l'ai modifié par "this.vname".

    voici le script complet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    <?php
     
    ?>
    <script type="text/javascript">
    function wysiwyg(_name, _class, _value, _parent)
    {
    	this.vname = _name;
    	this.parent = this.getNod(_parent);
    	this.selection = '';
    	this.commands_edit = { 'g' : '<strong>*</strong>', 'i' : '<i>*</i>', 'g' : '<strong>*</strong>' } ;
    	this.createTextarea(_class, _value);
    	this.createCommands();
    }
     
    wysiwyg.prototype.createTextarea = function(_class, _value)
    {
    	this.parent.innerHTML = '<input type="hidden" name="'+this.vname+'" id="'+this.vname+'" value="'+_value+'" /><div contenteditable="true" spellcheck="false" class="'+_class+'" id="edit_'+this.vname+'">'+_value+'</div>';
    }
     
    wysiwyg.prototype.createCommands = function()
    {
    	var commands = '';
    	for(var i in this.commands_edit)
    	{
    		commands += '<span id="'+i+'" class="'+i+'">'+i+'</span>' ;
    	}
    	this.parent.innerHTML = commands + this.parent.innerHTML;
     
    	this.addCallback();
    }
     
    wysiwyg.prototype.addCallback = function()
    {
    	var object = this;
     
    	for(var i in this.commands_edit)
    	{
    		this.getNod(i).onclick = function() { object.editText(); };
    	}
    }
     
    wysiwyg.prototype.editText = function()
    {
    	var textarea = this.getNod('edit_'+this.vname);
    	var selection;
    	var selection_start;
    	var selection_end;
    	var pre_str;
            var ap_str;
            var retour;
     
    	textarea.focus();
    	var value = textarea.value;
     
    	if(typeof textarea.selectionStart != 'undefined')
    	{
    	    alert("ici");
    	    selection_start = textarea.selectionStart;
    	    selection_end = textarea.selectionEnd;
    	    pre_str = value.substring(0 , selection_start);
    	    ap_str = value.substring(selection_end, textarea.textLength );
    	    selection = value.substring(selection_start, selection_end);
    	    retour = pre_str + '<i>' + selection + '</i>' + ap_str;
    	}
     
    	this.getNod('edit_'+this.vname).value = retour
    }
     
    wysiwyg.prototype.getNod = function(_id)
    {
    	return document.getElementById(_id);
    }
     
    wysiwyg.prototype.config = function()
    {
     
    }
     
    wysiwyg.prototype.getSelected = function()
    {
    	if(window.getSelection)
    	{
    		var str = window.getSelection();
    	} 
    	else if(document.getSelection)
    	{
    	    var str = document.getSelection();
    	} 
    	else
    	{
    	    var str = document.selection.createRange().text;
    	}
    	this.selection += str ;
    }
    </script>
    <style type="text/css">
    .descrip { width: 500px; height: 300px; border: solid 1px gray; }
    </style>
    <div id="wysiwyg">
    </div>
    <script type="text/javascript">
    var wy = new wysiwyg('description', 'descrip', '', 'wysiwyg');
    </script>
    Edit:

    Il semblerait que l'association de selectionStart/selectionEnd avec un div contenteditable ne fonctionne pas. J'ai fait le test du script avec un textarea c'est ok le texte est bien remplacé.

    Merci à tous pour votre aide.

    Je n'ai pas encore trouvé de solution au problème ou de solution alternative.

  4. #4
    Membre éclairé Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Par défaut
    Je reviens avec une nouvelle approche après de longues heures de lecture de developper.mozilla.org.

    J'ai quelque peu avancé mais je rencontre encore un problème...La fonction réagit bien quand je fais un appel depuis un onmousedown parcontre quand je fais un onclick plus rien ne se passe comme voulu.

    J'ai fait des tests avec une fonction quelque peu similaire pour l'édition d'un iframe et elle réagit bien au onclick.

    Voici ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    <?php
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    <head>
    	<script type="text/javascript">
     
    		function getSelected(id)
    		{
    			/*ok mozz, ok chrome, ok safari, ok opera*/
    			//objet_selection est une instance qui nous permet d'accéder aux méthodes de la class selection
    			var objet_selection =  window.getSelection();
    			//selection contient la chaine de caractère sélection, c'est une instance de la classe range on peut accèder aux méthodes de cette classpar cette instance
    			var select = objet_selection.getRangeAt(0);
     
    			//point de départ de la sélection dans la string int
    			var nbr_start = objet_selection.focusOffset;
    			//point de fin de la sélection dans string int
    			var nbr_end = objet_selection.anchorOffset;
     
    			//nombre de caractères dans la sélection
    			var string_selection = "<b>"+select+"</b>";
    			nbr_selection = string_selection.length;
     
    			//valeur de remplacement
    			var replace = string_selection;
     
    			//suppression de la selection
    			select.deleteContents();
    			//ajaut de la string de remplacement
    	    	        select.insertNode(select.createContextualFragment(replace));
    		}
     
    		function el(id)
    		{
    			return document.getElementById(id);
    		}
    	</script>
    	<style type="text/css">
    		.editable { width: 500px; height: 300px; border: solid 1px gray; }
    		.btn { width: 50px; height: 50px; border: solid 1px gray; margin-bottom: 10px; text-align: center; line-height: 50px; cursor: pointer }
    		.btn:hover { background: #dedede; color: purple; }
    	</style>
    </head>
    <body>
    <div class="btn" onmousedown="getSelected('editable');">Click</div>
    <div id="editable" class="editable" contenteditable="true"></div>
    </div>
    </body>
    </html>
    Je souhaiterai la faire fonctionner au onclick, comment dois-je m'y prendre ?

    Merci à tous pour votre aide.

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    Bonsoir,
    dans tes longues heures de lecture de developper.mozilla.org. est tu tombais sur http://www-archive.mozilla.org/editor/ie2midas.html ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] getDoctrine undefined dans un controller
    Par sqlnoob dans le forum Symfony
    Réponses: 5
    Dernier message: 02/02/2012, 00h08
  2. undefined dans l'affichage !
    Par Palsajicoco dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/03/2011, 11h31
  3. Réponses: 3
    Dernier message: 08/08/2010, 23h12
  4. [CKEditor] "FCKeditorAPI is undefined" dans jsUnit
    Par nico_ dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 06/04/2009, 18h11
  5. Editeur wysiwyg : execcommand et insertimage dans internet explorer
    Par supertotal dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/09/2008, 09h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo