[DOM] getAttribute('value') renvoie une chaine vide

[Résolu]
Signaler
Messages postés
12
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
3 juin 2008
-
Messages postés
12
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
3 juin 2008
-
Bonjour à tous,


J'ai une boucle qui me permet de créer des lignes de tableaux grâce au
DOM . Dans chaque cellule se trouve un input identifié par un id unique
et généré de la manière suivante : 'ref_'+compteur de ma boucle,
'description_'+compteur, etc ...


Le problème est que lorsque je récupère la valeur des ces champs avec
la méthode getAttribute('value'), j'obtiens la valeur pour tous les
champs instanciés lors de ma boucle mais pas celles dont les inputs
sont en "édition libre".

Concrètement, j'ai 3 champs ref,description et prix qui fonctionnent
parfaitement, mais le dernier : serial, est renseigné par l'utilisateur
. Et lorsque j'utilise getAttribute('value'), j'obtiens les valeurs de
ref,description et prix mais pas celle de serial .


Code utilisé pour générer l'input serial :

for(var i = 0; i < 6; i++) {
if ( i != 4){
                var inp = document.createElement("input");
                inp.setAttribute("readonly","readonly");
                inp.setAttribute("type","text");
                }

if (i == 3){inp.setAttribute("id","serial_"+fieldcount_materiel);
                inp.removeAttribute("readonly");
                inp.setAttribute("value","");
                cell.appendChild(inp);
                }
}


Code utilisé pour récupérer la valeur de serial :
var elemdiv = document.getElementById('materiel');
var children = elemdiv.childNodes;

for(var i = 1;i< children.length;i++){
tmp2 += children[i].childNodes[0].childNodes[0].childNodes[3].childNodes[0].getAttribute('value')+' |||| ';
}


J'aimerais donc savoir si getAttribute ne récupère que les valeurs crées via le DOM apr la méthode setAttribute() ou si on peut l'utiliser pour récupérer la valeur comme le ferais un getElementById('serial').value ( chose que je ne peux faire dûe à la composition de mon tableau qui mélange plusieurs types d'id et qui ne sont pas forcément toutes présentes) .

Merci pour votre aide .

15 réponses

Messages postés
469
Date d'inscription
mercredi 9 janvier 2002
Statut
Membre
Dernière intervention
20 février 2017
6
aussi ça peu être une possibilité, mais j'en suis arrivé à cela

    <head>
    </head>
    <script>
        function getAllTableInformations(){
                var _table = document.getElementById("myTable");
                var full = new Array();
                var _tableRows = _table.rows;
                for ( var i =0; i <_tableRows.length; i++){
                        full.push(_tableRows[i].cells[0].getElementsByTagName("input")[0].value + _tableRows[i].cells[1].getElementsByTagName("input")[0].value + _tableRows[i].cells[2].getElementsByTagName("input")[0].value + _tableRows[i].cells[3].getElementsByTagName("input")[0].value);
                }
                for ( var i = 0; i <full.length; i++){
                        alert (full[i]);
                }
        }
        </script>
   
       
       
   
        ----

                           
           ,
                           
           ,
                           
           ,
                           
           ,
                           
           ,
                            Supprimer
           ,
       
   

</html>

Maintenant, est-ce que c'est le résultat attendu ???

[o-_-o]
Messages postés
943
Date d'inscription
mardi 14 novembre 2006
Statut
Membre
Dernière intervention
7 août 2009
3
Bonjour,
d'après selfHTML getAttribute récupere des info concernant le style sinon chaine vide
http://actuel.fr.selfhtml.org/archives/docu/7.0/tecbbaa.htm#a3
Apparement ça ne serait pas ce que tu veux...

<hr size="2" width="100%" />
Maelo ou Elo --> Mon blog

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. (Jacques Prévert)
Messages postés
469
Date d'inscription
mercredi 9 janvier 2002
Statut
Membre
Dernière intervention
20 février 2017
6
bonjour, juste une petite question :
pourquoi ne pas stocker "serial_"+fieldcount_materiel dans une variable (voir un array )?
et ensuite
faire un document.getElementById(_idMaterial)
parce que cette écriture:
children[i].childNodes[0].childNodes[0].childNodes[3].childNodes[0].getAttribute('value')+
est complètement invivable !
[o-_-o]
Messages postés
12
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
3 juin 2008

Tout d'abord merci maelob & Zobibol, j'ai lu l'article de selfHTML qui effectivement restreint l'utilisation aux seuls attributs de styles . Mais j'avais déjà regardé la spécification de getAttribute sur le site de MDC (http://developer.mozilla.org/fr/docs/DOM:element.getAttribute) où cette information n'est pas précisée . Ce qui m'étonne c'est que ça fonctionne quand même avec les autres valeurs des autres inputs .

En ce qui concerne l'utilisation d'un array, j'y avais pensé mais j'avoue ne pas me souvenir pourquoi je ne l'ai pas utilisée .
Dans mon tableau il est possible en cliquant sur un lien de faire un retour d'une pièce en SAV ce qui correspond en fait à l'insertion d'une nouvelle ligne dans mon tableau et pour laquelle l'id est sous la forme ref_sav_+compteur . Et donc il me semble que je n'utilise pas d'array car je dois conserver la position "physique" de la ligne insérée .

Par exemple :
ref_0
ref_1
ref_sav_0
ref_2
ref_sav_1

Et ça je ne peux pas en mettant dans des tableaux séparés ces identifiants retrouvé ensuite quelle pièce revenue en SAV est rattachée à la pièce d'origine .

Je vais quand même essayé de passer par un (plusieurs) array(s) mais cette histoire de getAttribute me chiffone quand même .
Messages postés
469
Date d'inscription
mercredi 9 janvier 2002
Statut
Membre
Dernière intervention
20 février 2017
6
pour savoir, c'est une table qui à 4 colonnes (TD)  ref,description et prix  et serial (et qui peux avoir n lignes (tr) ?
parceque si tel est le cas, tu pourrais parcourir les colonnes de ta table
la, plus besoin de savoir si c'est un retour ou pas !

[o-_-o]
Messages postés
12
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
3 juin 2008

Effectivement c'est ça . Mais là tout de suite je ne vois pas ce que tu veux dire . Enfin je ne vois pas commetn le fait de parcourir par colonne et non par ligne peut m'aider ?!?
Messages postés
469
Date d'inscription
mercredi 9 janvier 2002
Statut
Membre
Dernière intervention
20 février 2017
6
mon dieux, (oui bon, je me l'accorde celle la) ce que je suis idiot, je voulais dire ligne !
te serait-il possible de fournir le html obtenu (juste la table histoire de voir comme faire )

[o-_-o]
Messages postés
12
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
3 juin 2008

Désolé je ne trouve pas comment éditer mon message précédent . J'ai oublié que je pouvais supprimer les lignes peut importe leur emplacement . C'est pour ça que je n'utilise pas de array parcequ'après je suis obligé de parcourir chaque array pour supprimer la référence correspondantes à la ligne supprimée . Sinon le getElementById me renverrait une erreur JS .

Du coup j'utilise un removeChild, ce qui est plus simple .
Messages postés
12
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
3 juin 2008

Ca donne ça :
    
        ----

                            
            ,
                            
            ,
                            
            ,
                            
            ,
                            
            ,
                            Supprimer
            ,
        
    
Messages postés
943
Date d'inscription
mardi 14 novembre 2006
Statut
Membre
Dernière intervention
7 août 2009
3
En même temps que tu supprimes ta ligne tu peux supprimer l'entrée dans l'array.

<hr size="2" width="100%" />
Maelo ou Elo --> Mon blog

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. (Jacques Prévert)
Messages postés
12
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
3 juin 2008

Bon ben il ne me reste plus qu'à remanier mon code, mais comme c'est assez lourd, je le ferrai plus tard . Merci à vous deux .

:reste toujous cette histoire de getAttribute !!!
Messages postés
12
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
3 juin 2008

Comme ça ca devrait aller oui . Merci bien je pars avec ta fonction en poche . ++
Messages postés
943
Date d'inscription
mardi 14 novembre 2006
Statut
Membre
Dernière intervention
7 août 2009
3
De rien bon courage

<hr size="2" width="100%" />
Maelo ou Elo --> Mon blog

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. (Jacques Prévert)
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
Bonjour,


je suis loin d'avoir tout suivi....
   néanmoins :

 tableau.rows.length                                        nombre de lignes
 tableau.rows[n° ligne].cells.length                    nombre de colonnes dans la ligne
 tableau.insertRow(n° ligne)                             ajouter une ligne
 tableau.rows[n° ligne].insertCell(n° colonne)     ajouter une colonne dans la ligne
 tableau.deleteRow(n° ligne)                             détruire une ligne
 tableau.rows[n° ligne].deleteCell(n° colonne)     détruire une colonne dans la ligne

 tableau.rows[n° ligne].cell[n° colonne].???        accès à une cellule
(  tableau.rows[n° ligne].cell[n° colonne].innerHTML par exemple )
                l'input contenu tableau.rows[ligne].cell[colonne].firsChild...
                  ou même... en mettant le même name : 
                        document.name_formulaire.name_input[indice]...
.....





<hr />
                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
12
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
3 juin 2008

Bon alors pour ceux que ça peut intéresser j'ai bricolé une solution de fortune car c'était vraiment lours pour moi de modifier tout mon code . Par contre je l'ai épuré et plus besoin de la ligne avec les ChildNodes[0] enchainés .

Du coup lorsque je créer l'input "serial" grâce au DOM je fait un inp.setAttribute("onblur","saveValueOnLeave('serial_'+cpt)");

Et voici le code de cette fonction :

function saveValueOnLeave(serialID){
var input = document.getElementById(serialID);
input.setAttribute("value",input.value);
}

C'est de la bidouille mais ça me permet de faire ce que je veux