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 :

innerHTML += et innerHTML -=


Sujet :

JavaScript

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Par défaut innerHTML += et innerHTML -=
    Bonjour,

    dans une fonction je génère des lignes en utilisant
    objet.innerHTML += '<...code html.............<br>'

    ca marche très bien dans ce sens, les lignes s'ajoutent,
    par contre je cherche maitenant à faire un bouton
    "annuler dernier ajout"

    et pensait faire un:
    objet.innerHTML -= " "

    pour par exemple mettre un espace vide à la place, ca ne marche pas,
    j'obiens l'erreur NaN.

    Auriez-vous une idée pour faire marcher ça?
    (mettre un espace blanc ou virer carrément la ligne, ou l'élement? p-e en spécifiant son name ou id?)

    merci d'avance.

  2. #2
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Par défaut
    effectivement...

    Dans le contexte dans lequel tu utilises tes opérateurs,
    + est un opérateur de chaine (concaténation) alors que,
    - est l'opérateur de soustraction...

    le plus simple peut être, serait de garder dans une variable la valeur que tu veux ressortir...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    oldInner = objet.innerHTML;
    objet.innerHTML += '<...code html.............<br>'
    et quand tu en as besoin...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    objet.innerHTML = oldInner;
    je ne connais pas le volume des données que tu veux insérer, mais si tu penses que c'est trop volumineux de garder ~2 fois le contenu, tu peux effectivement rajouter ton contenu dans des balises avec un id que tu stockes par exemple dans une variable lastInsertId (ca remplace le oldInner de mon premier exemple)

    Ensuite, cet id te permettra de pouvoir manipuler l'élément grace aux méthodes que proposent le DOM...
    Et si tu fais comme ca, tant que tu y es, insère aussi tes noeuds par le DOM plutot que par innerHTML qui ne fait pas partie des standards...
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Par défaut
    voici un cas d'application concret du truc:
    je génère des input ayant des valeurs différentes à chaques fois,
    (selon l'action utilisateur) et je les affiche pour vérification
    (une fois que j'aurais tout fait, je compte mettre le input en hidden, pour le transmettre à php incognito)

    code d'insertion de la balise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zone.innerHTML += '<input name="punct'+numero_pt+'" id="punct'+numero_pt+'" type="text" value="'+C.value+'" <br> />';
    tout ceci ce place dans le div correspondant:
    L'iddée du oldInner est une bonne idée, par contre si l'user
    veut 30 valeurs, il faut que je génère un tableau avec les valeurs.
    Faisable? je pense, mais il faut voir la taille des données.

    Mais le problème étant que à l'affichage, cela n'efface pas l'input d'avant.
    Bon au pire, je me suis dit que l'affichage m'importe peu, et que
    comme on a décalé le innerHTML "d'un en avant", le prochain input
    se ferait par dessus, mais ce n'est pas le cas:
    la valeur affichée l'est après.

    Donc si j'ai fait 3 input,
    j'en "vire" un (inner=oldinner),
    et j'en rajoute un (action du user)

    je devrais avoir 3 valeurs, mais j'en ai 4 affichées....

  4. #4
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Par défaut
    voici ce que je te propose et qui me semble finalement plus simple...

    Bien sur ce code est à adapter pour éviter certains efets de bord (on ne doit pas pouvoir annuler avant d'avoir inséré le premier input)

    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
     
    lastInsertId = 0;
    myZone = getElementById('zone');
     
    //pour rajouter ton input
    lastInsertId++;
    myField = document.createElement('input');
    myField.type = 'text';
    myField.name = 'punct_' + lastInsertId;
    myField.id = 'punct_' + lastInsertId;
    myField.value = C.value;
    // c'est ici que tu ajoute réellement le input au document
    myZone.appendChild( myField );
     
    //pour enlever le dernier input rajouté
    lastInsertId--;
    myZone.removeChild( 'punct_' + lastInsertId );
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Par défaut
    cette alternative devrait effectivement marcher!
    J'avais déjà vu l'équivalent DOM du innerHTML dans un site
    (JDN developpeurs), mais ne connaissait pas l'existence
    de removeChild.

    Du coup je vais adapter, et tester tout ça

    Merci, encore!

Discussions similaires

  1. modifier le contenu d'une table avec innerHTML
    Par francon81 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/05/2005, 09h02
  2. Problème avec InnerHTML
    Par rat dgout dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/04/2005, 10h02
  3. div et innerHTML : tout sur une ligne?
    Par LineLe dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 04/04/2005, 11h15
  4. Problème innerHTML sur div !!!
    Par aburner dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/01/2005, 09h23
  5. getelementbyid innerhtml sur Opera?
    Par cynthia dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/12/2004, 10h44

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