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 :

[AJAX] Modification Inline, Firefox Ok, IE rien ne se passe


Sujet :

JavaScript

  1. #1
    Invité
    Invité(e)
    Par défaut [AJAX] Modification Inline, Firefox Ok, IE rien ne se passe
    Bonjour,

    J'ai suivi le tutoriel d'Olivier Lance pour réaliser des modifications inline.
    Le script marche bien sous Firefox (si ce n'est qu'il m'ajoute un '\' avant chaque apostrophe, pour ça aussi je cherche une solution).
    Mais le plus embétant est qu'il ne fonctionne pas du tout sous IE.
    Je peux cliquer autant que je veux sur le texte que je veux modifier, le champ de saisie n'apparaît pas...

    Si quelqu'un pouvait m'aider, ou me donner une piste.

    Voici mon code 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
    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    //On ne pourra éditer qu'une valeur à la fois
    var editionEnCours = false;
     
    //variable évitant une seconde sauvegarde lors de la suppression de l'input
    var sauve = false;
     
    //Fonction de modification inline de l'élément double-cliqué
    function inlineMod(id, obj, nomValeur, type)
    {
    	if(editionEnCours)
    	{
    		return false;
    	}
    	else
    	{
    		editionEnCours = true;
    		sauve = false;
    	}
     
    	//Objet servant à l'édition de la valeur dans la page
    	var input = null;
     
    	//On crée un composant différent selon le type de la valeur à modifier
    	switch(type)
    	{
    		//Valeur de type texte ou nombre
    		case "texte":
    		case "nombre":
    			input = document.createElement("input");
    			break;
     
    		//Valeur de type texte multilignes
    		case  "texte-multi":
    			input = document.createElement("textarea");
    			break;
    	}
     
    	//Assignation de la valeur
    	if (obj.innerText)
    		input.value = obj.innerText;
    	else
    		input.value = obj.textContent;
     
    	input.value = trim(input.value);
     
    	//On lui donne une taille un peu plus large que le texte à modifier
    	input.style.width  = "375px";
    	input.style.font = "normal 1em Verdana";
     
    	//Remplacement du texte par notre objet input
    	obj.replaceChild(input, obj.firstChild);
     
    	//On donne le focus à l'input et on sélectionne le texte qu'il contient
    	input.focus();
    	input.select();
     
    	//Assignation des deux événements qui déclencheront la sauvegarde de la valeur
     
    	//Sortie de l'input
    	input.onblur = function sortir()
    	{
    		sauverMod(id, obj, nomValeur, input.value, type);
    		delete input;
    	};
     
    	//Appui sur la touche Entrée
    	input.onkeydown = function keyDown(event)
    	{
            if (!event&&window.event)
            {
                event = window.event;
            }
    		if(getKeyCode(event) == 13)
            {
    			sauverMod(id, obj, nomValeur, input.value, type);
    			delete input;
    		}
    	};
    }
     
    //Suppression des espaces/sauts de ligne inutiles (http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C0C0062AC78)
    function trim(value) {
       var temp = value;
       var obj = /^(\s*)([\W\w]*)(\b\s*$)/;
       if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }
       var obj = /  /g;
       while (temp.match(obj)) { temp = temp.replace(obj, " "); }
       return temp;
    }
     
    //Fonction renvoyant le code de la touche appuyée lors d'un événement clavier
    function getKeyCode(evenement)
    {
        for (prop in evenement)
        {
            if(prop == 'which')
            {
                return evenement.which;
            }
        }
     
        return event.keyCode;
    }
     
     
    //Fonction donnant la largeur en pixels du texte donné (merci SpaceFrog !)
    function getTextWidth(texte)
    {
    	//Valeur par défaut : 150 pixels
    	var largeur = 150;
     
    	if(trim(texte) == "")
    	{
    		return largeur;
    	}
     
    	//Création d'un span caché que l'on "mesurera"
    	var span = document.createElement("span");
    	span.style.visibility = "hidden";
    	span.style.position = "absolute";
     
    	//Ajout du texte dans le span puis du span dans le corps de la page
    	span.appendChild(document.createTextNode(texte));
    	document.getElementsByTagName("body")[0].appendChild(span);
     
    	//Largeur du texte
    	largeur = span.offsetWidth;
     
    	//Suppression du span
    	document.getElementsByTagName("body")[0].removeChild(span);
    	span = null;
     
    	return largeur;
    }
     
    // retourne un objet xmlHttpRequest.
    // méthode compatible entre tous les navigateurs (IE/Firefox/Opera)
    function getXMLHTTP()
    {
        var xhr = null;
        if(window.XMLHttpRequest)
        { // Firefox et autres
            xhr = new XMLHttpRequest();
        }
        else if(window.ActiveXObject)
        { // Internet Explorer
            try
            {
                xhr = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch(e)
            {
                try
                {
                    xhr = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch(e1)
                {
                    xhr = null;
                }
            }
        }
        else
        { // XMLHttpRequest non supporté par le navigateur
            alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
        }
     
        return xhr;
    }
     
    function ieTrick(sep)
    {
    	d = new Date();
    	trick = d.getYear() + "ie" + d.getMonth() + "t" + d.getDate() + "r" + d.getHours() + "i" 
    		+ d.getMinutes() + "c" + d.getSeconds() + "k" + d.getMilliseconds();
     
    	if (sep != "?")
    	{
    		sep = "&";
    	}
     
    	return sep + "ietrick=" + trick;
    }
     
    //Objet XMLHTTPRequest
    var XHR = null;
     
    //Fonction de sauvegarde des modifications apportées
    function sauverMod(id, obj, nomValeur, valeur, type)
    {
    	//Si on a déjà sauvé la valeur en cours, on sort
    	if(sauve)
    	{
    		return false;
    	}
    	else
    	{
    		sauve = true;		
    	}
     
    	//Si l'objet existe déjà on abandonne la requête et on le supprime
    	if(XHR && XHR.readyState != 0)
    	{
    		XHR.abort();
    		delete XHR;
    	}
     
    	//Création de l'objet XMLHTTPRequest
    	XHR = getXMLHTTP();
     
    	if(!XHR)
    	{
    		return false;
    	}
     
    	//URL du script de sauvegarde auquel on passe la valeur à modifier
    	XHR.open("GET", "admin_news.php?section=edit&action=edit&id=" + id + "&champ=" + nomValeur + "&valeur=" + escape(valeur) + "&type=" + type + ieTrick(), true);
     
    	//On se sert de l'événement OnReadyStateChange pour supprimer l'input et le replacer par son contenu
    	XHR.onreadystatechange = function()
    	{
    		//Si le chargement est terminé
    		if (XHR.readyState == 4)
    		{
    			//Réinitialisation de la variable d'état d'édition
    			editionEnCours = false;
     
    			//Remplacement de l'input par le texte qu'il contient
    			obj.replaceChild(document.createTextNode(valeur), obj.firstChild);
    		}
    	}
     
    	//Envoi de la requête
    	XHR.send(null);
    }
    Et mon code PHP

    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
    //On sort en cas de paramètre manquant ou invalide
    		if(empty($_GET['id']) or empty($_GET['type']) or empty($_GET['champ']) or empty($_GET['valeur'])
    		   or !is_numeric($_GET['id']))
    		{
    		    exit;
    		}
     
    		//Connexion à la base de données
    		$link=mysql_connect($host,$user,$pwd) or die("La connexion au serveur a échoué");
    		$dbsel=mysql_select_db($db,$link) or die("La base est indisponible");
     
    		// Construction de la requête en fonction du type de valeur
    		switch($_GET['type'])
    		{
    		    case 'texte':
    		    case 'texte-multi':
    		        $sql  = 'UPDATE news';
    		        $sql .= ' SET ' . mysql_real_escape_string($_GET['champ']) . '="';
    		        $sql .= mysql_real_escape_string($_GET['valeur']) . '" WHERE id_news=' . intval($_GET['id']);
    		        break;
     
    		    default:
    		        exit;
    		}
     
    		// Exécution de la requête
     
    		mysql_query($sql) or die(mysql_error());
     
    		mysql_close();
    Je tiens à préciser que je travaille avec des templates Smarty, je ne sais pas si ça change quelque chose mais voilà...

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2002
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Salut,
    J'ai testé l'exemple du tutoriel sur IE et ca a marché,
    Mais je vois qu'une ligne peut-être la raison du disfonctionnement, peut-être je dit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Ajout du texte dans le span puis du span dans le corps de la page
    	span.appendChild(document.createTextNode(texte));
    	document.getElementsByTagName("body")[0].appendChild(span);
    remplace par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Ajout du texte dans le span puis du span dans le corps de la page
    span.innerHTML = texte ;
    document.getElementsByTagName("body")[0].appendChild(span);
    Teste et si ca ne fonctionne pas, debuge avec firebug ou avec visual studio sur PC, tu ajoute un mot --> debugger avant les lignes ci-dessus, tu continue pas a pas et tu trouvera certainement l'erreur.

    Bonne chance

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour, et merci pour ta réponse.

    Malheureusement ta solution ne fonctionne pas.
    J'ai installé Firebug, mais je ne comprends pas bien comment il fonctionne...
    (Je précise que j'ai la version 6 d'IE)

  4. #4
    Invité
    Invité(e)
    Par défaut
    Personne n'a une autre idée ? je n'ai toujours pas trouvé ce qui cloche...
    Si je pouvais déjà résoudre le problème des "\", je serais content

Discussions similaires

  1. [AJAX] Ajax - Modification inline des données
    Par befluo dans le forum AJAX
    Réponses: 3
    Dernier message: 08/04/2009, 10h00
  2. [AJAX] Modification " inlines "
    Par iwf-fr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/12/2006, 11h14
  3. Réponses: 3
    Dernier message: 21/11/2006, 14h28

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