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 :

Supprimer un noeud après l'avoir ajouté


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut Supprimer un noeud après l'avoir ajouté
    Bonjour,

    Je souhaite supprimer un champs input une fois l'avoir ajouté dynamiquement à l'aide d'une liste déroulante. Le problème se pose avec IE. Le nouveau nœud ajouté ne se supprime pas et je n'ai aucun message d'erreur. Par contre, les nœuds qui existaient déjà dans ma page se suppriment. Donc, le bug est avec les nouveaux nœuds que j'ajoute.

    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
    function ajouterAnimal(select) { 
    var option = select.options[select.selectedIndex]; 
    var ul = select.parentNode.getElementsByTagName('ul')[0]; 
    var choix = ul.getElementsByTagName('input'); 
    var li = document.createElement('li'); 
    var input = document.createElement('input'); 
    var text = document.createTextNode(option.firstChild.data);  
    input.type = 'text'; 
    input.value = option.value; 
    li.appendChild(input); 
    li.appendChild(text); 
    li.setAttribute('onclick', 'this.parentNode.removeChild(this);'); ul.appendChild(li); 
    }

    Html:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <ul>
    <li onclick="this.parentNode.removeChild(this);">
    <input type="text" value="Cheval" />  Cheval </li>
    <li onclick="this.parentNode.removeChild(this);"> 
    <input type="text"  value="Tigre" /> Tigre </li>  
    </ul> 
     
    <select onchange="ajouterAnimal(this);">
    <option value="Chien">Chien</option> 
    <option value="Chat">Chat</option>
    </select>
    Est-ce moi qui ne respecte pas les standards ou c'est IE qui déconne ?

    Merci

  2. #2
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 887
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 887
    Points : 16 320
    Points
    16 320
    Par défaut
    IE gère très mal la fonction setAttribute().

    Modifie ton code en ce sens :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    li.onclick = function() { this.parentNode.removeChild(this); };

  3. #3
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    en tout cas, la méthode setAttribute (quel que soit le navigateur) n'a pas pour fonction d'attribuer des gestionnaires d'événement, même si ces gestionnaires peuvent effectivement être atteints par l'intermédiaire de propriétés html...
    A priori, la manière "propre" d'ajouter des gestionnaires d'événement à un élément, c'est de passer par addEventListener (FF & autres) / attachEvent (IE) ... mais loin de moi l'idée de te faire déconsidérer le conseil de Bisûnûrs (notamment parce que la solution qu'il propose fonctionne très bien )

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 887
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 887
    Points : 16 320
    Points
    16 320
    Par défaut
    Et parce que l'on n'a pas des codes différents pour chaque navigateur.

    Cela dit, on peut toujours se faire une fonction addEvent() qui va gérer ces différences et appeler cette fonction quand on veut attribuer un évènement.

  5. #5
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par Bisûnûrs Voir le message
    Cela dit, on peut toujours se faire une fonction addEvent() qui va gérer ces différences et appeler cette fonction quand on veut attribuer un évènement.
    Jusqu'à maintenant je m'en tiens presque toujours à cette solution, mais je suis prêt à en changer si un projet l'exige bien sûr ^^

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Bisûnûrs Voir le message
    IE gère très mal la fonction setAttribute().

    Modifie ton code en ce sens :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    li.onclick = function() { this.parentNode.removeChild(this); };
    Merci, le code fonctionne bien sous IE, mais j'ai crée un tableau que je vais parcourir afin de savoir si vraiment les éléments ajoutés ou supprimés sont à jour.

    Donc, j'ai ajouté une nouvelle balise à mon input:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    input.name='animaux[]';
     
    var tab=document.forms['form1'].elements['animaux[]'];
     
    alert(tab.length);
    Code html:

    J'ai ajouté le champs name="animaux[]" dans chaque input.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <li onclick="this.parentNode.removeChild(this);">  
    <input type="hidden" name="animaux[]" value="Cheval" />  Cheval </li> 
    ...
    Encore une fois, IE ne met pas à jour mon tableau animaux, alors que FF si.

    Est-ce un bug avec le input.name que IE ne reconnait pas ?

    J'ahis IE

  7. #7
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Pour IE, l'attribut name est readonly. Tu ne peux donc pas l'attribuer dynamiquement, les explications et l'astuce sont dans la FAQ

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Pour IE, l'attribut name est readonly. Tu ne peux donc pas l'attribuer dynamiquement, les explications et l'astuce sont dans la FAQ
    Merci bien.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/12/2010, 15h01
  2. un moyen pour supprimer un fichier après l'avoir ouvert
    Par ZeProgrammator dans le forum ASP.NET
    Réponses: 8
    Dernier message: 09/10/2009, 09h16
  3. Réponses: 6
    Dernier message: 02/06/2008, 10h17
  4. Positionnement d'un composant dans un JRootPane, APRES l'avoir ajouté
    Par 84mickael dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 23/05/2007, 22h45
  5. Réponses: 3
    Dernier message: 02/05/2007, 10h39

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