Balayer un tableau en javascript

Résolu
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010 - 20 nov. 2007 à 08:43
 fouratinourhen - 24 mai 2011 à 16:06
bonjour à tous,
Débutant en javasacript, je me heurte au problème suivant :
Je développe une page html (couplée à du php) de saisie de bon de commande.
J'ai trouvé ici http://www.the-asw.com/post/2005/09/18/50-une-interface-de-formulaire-a-base-de-tableaux-dynamiques
un exemple de tableau dynamique permettant la gestion de ligne. Jusque là, tout fonctionne correctement.

J'aimerais à présent, à chaque ajout de ligne, vérifier préalablement que l'utilisateur a bien saisi une valeur dans toutes les zones. Comment faire pour balayer les 5 cellules de chaque ligne (un simple test d'existence des données suffirait)?

Voici les fonctions JS permettant la gestion dynamique du tableau des lignes de commande :
/* trouve le tag "parentTagName" parent de "element" */
function getParent(element, parentTagName) {
   
    if ( ! element )
        return null;    else if ( element.nodeType 1 && element.tagName.toLowerCase() parentTagName.toLowerCase() )
        return element;
    else
        return getParent(element.parentNode, parentTagName);
    }

/* ajoute une ligne */
function addLigne(link)
    {
    // 0. tester la saisie sur toutes les zones.

    // 1. récuperer le node "TABLE" à manipuler
    var td = link.parentNode;
    var table = getParent(td,'TABLE');
   
    // 2. on va manipuler le TBODY
    var tbody = table.tBodies[0];
   
    // 3. on clone la ligne de reference
    var newTr = tbody.rows[0].cloneNode(true);
    tbody.appendChild(newTr);
   
    if ( document.all )
        newTr.style.display = "block"; // pour IE
    else
        newTr.style.display = "table-row"; // pour Gecko   
    }

/* supprimer une ligne */
function delLigne(link)
    {
    // 1. récuperer le node "TABLE" à manipuler
    var td = link.parentNode;
    var table = getParent(td, 'TABLE');
   
    // 2. récuperer le TBODY
    var tbody = table.tBodies[0];
   
    // 3. Supprimer le TR
    tbody.removeChild(getParent(td, 'TR'));
    }

window.onload = dtableInit;

/* initialise le script */
function dtableInit()
    {
    var table = document.getElementsByTagName('TABLE');
    for ( var i = 0; i < table.length; i++ )
        {
        // on récupère tous les tableaux dynamiques
        if ( table[i].className == 'dTable' )
            {           
            var tbody = table[i].tBodies[0];
            var newTr = tbody.rows[0].cloneNode(true);
           
            // on masque la première ligne du tbody (la ligne de reference)
            tbody.rows[0].style.display = 'none';
           
            // on en ajoute une
            tbody.appendChild(newTr);
            }
        }
    }

Et le code html correspondant :
   
        ----

            Part Number,
            Description,
            Prix unitaire HT,
            Qt&eacute;,
            Total,
            Action,
       
   
   
   
        ----

            ,
            ,
            ,
            ,
            ,
            Supp,
       
   
   
    <tfoot>
        ----

            Ajouter une ligne |
            TOTAL |
            tot |
            |
       
       
    </tfoot>   

45 réponses

orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
20 nov. 2007 à 11:59
Bon, ça avance, je parviens à détecter correctement la présence ou l'absence de données dans chacune des cellule.

Le blocage suivant intervient sur l'affectation de l'id unique à chaque cellule avec la commande
input.id = "champ_" + i + "_" + j;

J'ai l'erreur "input est indéfini"...
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
20 nov. 2007 à 14:36
C'est nickel, ça fonctionne aussi bien sur IE que FF (et ça suffira comme ça avec les navigateurs!).

Par contre, comment récupérer dans ma page php les valeurs de ces cellules dont je connais à présent les Id?
Jusqu'à maintenant, je conservais les valeurs des autres champs saisis en rappelant la page html avec ceux-ci passés en paramètre de l'adresse (je ne sais faire qu'ainsi...), avec cette fonction :

    function refresh()
        {
        var num_cde_client;
        num_cde_client = '';
        (...)     
        num_cde_client = document.boncde.num_cde_client.value;
     document.location='{#LIEN}'+'?&num_cde_client='+num_cde_client+'&date_dde='+date_dde+'&societe='+societe+'&adresse='+adresse+'&demandeur='+demandeur+'&tel='+tel+'&constructeur='+constr+'&createur='+creat+'&client='+cli;
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
20 nov. 2007 à 15:29
Ca ne fonctionne pas, je récupère bien les valeurs des autres champs saisis, mais pas celles des lignes ajoutées.
Voici le code de mon bouton de validation :
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
21 nov. 2007 à 08:45
bon, je regarde ça.
Merci, en tout cas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
21 nov. 2007 à 14:43
J'ai installé FireBug, je ne connaissais pas, c'est bien pratique!
Je parviens maintenant à imposer un Id à toutes les zones saisies.
Reste à récupérer ces valeurs lorsqu'on valide la saisie globale.
Les autres valeurs du formulaire sont repassées en paramètre de l'adresse de la page à chaque changement de zone, donc pas de souci de ce côté-là.
Par contre, impossible de récupérer les valeurs des lignes pour lesquelles j'ai imposé l'Id dans la page php, même si je détecte bien l'action sur le bouton de validation.
Le print_r($_POST) n'affiche en effet que les 'autres' valeurs.
Une idée? :o)
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
21 nov. 2007 à 15:11
Cette fonction, je l'appelle au moment de la validation du formulaire?
Comme ça? :


Parce qu'avec cette solution, je retrouve encore une fois les autres valeurs, mais pas celle avec un Id en "champ_*_*", alors qu'elle sont identifiées! :-/
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
21 nov. 2007 à 15:22
D'autre part, j'ai dans FireBug (en plusieurs exemplaires), les messages d'erreur suivants :
uncaught exception: Permission refusée d'appeler la méthode Location.toString
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
21 nov. 2007 à 15:49
Ah, je pense avoir trouvé : il fallait aussi alimenter la propriété "name" de chaque cellule en input... ou alors travailler avec Id dans ta fonction "sauvage".

D'ailleurs, quelle est la différence entre Id et name?
0
Anthed Messages postés 152 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 17 janvier 2014 3
21 nov. 2007 à 16:04
<form name="formulaire" action="url">
   
</form>

Normalement, document.forms["formulaire"].submit(); est équivalent, au niveau du serveur à  lui envoyer l'url : url?champ=valeur
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
22 nov. 2007 à 08:19
D'ac, merci pour les explications! :o))
Je teste tout ça.

Encore merci pour ton aide précieuse.
0
Anthed Messages postés 152 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 17 janvier 2014 3
22 nov. 2007 à 09:02
Petite faute de frappe dans mon précédent message :


<form name="formulaire" action="url" method="POST">
   
</form>

tu peux essayer d'appeler submitForm() avec ce genre de formulaire bidon. Tant que tu ne récupères pas la valeur du champ au niveau de ton serveur, c'est qu'il y a un problème. Si tout va bien, les champs contenus dans ton tableau, lui-même inclus dans ton 'vrai' formulaire devraient passer aussi.

Bonne continuation.
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
22 nov. 2007 à 14:58
J'essaie maintenant de mettre à jour les totaux de mon formulaire au fur et à mesure de la saisie des lignes.
Dans un premier temps, et pour visualiser les changement, j'applique une coloration à la partie de je veux atteindre.
Pourquoi ne puis-je atteindre que le tableau 'tab_tot' et pas la cellule 'totht'?

Total €uro HT


... avec ce code :
var cell_tot_ht = document.getElementById("tab_tot"); [ou getElementById("totht")]
cell_tot_ht.bgColor="#CCFFCC";
0
Anthed Messages postés 152 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 17 janvier 2014 3
22 nov. 2007 à 15:24
N'hésite pas à tester ton code avec, par exemple :
alert(cell_tot_ht) pour vérifier que, déjà, ton élément est trouvé.
Ensuite, une petite modif du type :
cell_tot_ht.style.backgroundColor = "#CCFFCC";

devrait marcher.
Tu peux consulter les codes à dispo sur CS pour voir tout ce que tu peux faire avec element.style ...

Tchô.
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
22 nov. 2007 à 15:36
var lg = document.getElementById("tab_tot").childNodes.length;
alert('lg->'+lg);
var cell_tot_ht = document.getElementById("tab_tot").childNodes[0].nodeValue;
alert('valeur1->'+cell_tot_ht);
var cell_tot_ht = document.getElementById("tab_tot").childNodes[1].nodeValue;
alert('valeur2->'+cell_tot_ht);

En fait, je détecte la 'longueur' de mon tableau 'tab_tot' : 2
Le 2, c'est bien pour le nombre de <td>?

Après, j'ai 'valeur1->' et 'valeur2->null'
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
26 nov. 2007 à 14:44
Merci pour tes derniers conseils, ça avance doucement...
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
26 nov. 2007 à 15:05
J'en suis à la gestion de la suppression d'une ligne.
La suppression en elle-même fonctionne bien, mais je ne parviens pas à récupérer une des valeurs (le montant HT en l'occurence) pour la déduire du total HT de mon formulaire.
Actuellement, j'ai ça :

function delLigne(link)
{
// 1. récuperer le node "TABLE" à manipuler
var td = link.parentNode;
var table = getParent(td,'TABLE');

// 2. récuperer le TBODY
var tbody = table.tBodies[0];

// 2bis. récupérer la valeur HT de la ligne pour la soustraire au total HT du bon de commande.
var ligne=getParent(td,'TR');

alert(ligne.innerHTML); => renvoie la structure complète de la ligne
alert(ligne.nodeName); => renvoie bien 'TR'

// 3. Supprimer le TR
tbody.removeChild(getParent(td,'TR'));
}
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
26 nov. 2007 à 15:19
Si, si, bien sûr...
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
26 nov. 2007 à 15:22
(oups, cliqué trop vite)
Mais si je demande le getParent(td,'TD'), je me retrouve avec les infos de la cellule sur laquelle j'ai cliqué pour supprimer la ligne.
Or, les infos que je cherche sont placées dans la cellules précédente.
Je me disais qu'il fallait que je remonte jusqu'au TR pour redescendre ensuite au TD qui contient ma valeur.
J'ai juste?
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
26 nov. 2007 à 15:36
Ah bé oui, forcément, ça paraît plus simple! :o)
Alors, c'est bon jusqu'à la définition de cell.
En fait, ma zone n'est pas en input, puisque c'est le montant HT calculé à partir de la qté (saisie) et du montant unitaire (saisi).
Dans la partie 'saisie' et malgré les lignes :

with(input)
{
value = totht.nombreFormate(2,",","");
id = "champ_" + i + "_" + j;
name = "champ_" + i + "_" + j;
nodeValue = totht.nombreFormate(2,","," ");
}

nodeValue donne bien la valeur affichée dans la cellule, mais je ne parviens pas à lui forcer un Id et un Name, donc j'imagine que ça m'empêche de récupérer maintenant sa valeur?
0
orionis1 Messages postés 40 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 7 juillet 2010
26 nov. 2007 à 15:56
Avec ça, ça a l'air de fonctionner.
Reste à le soustraire au total HT à l'autre bout du formulaire! ;o)

var ligne=getParent(td,'TR');
var cell = ligne.cells[4];
var ht_suppr = cell.firstChild.nodeValue;

Merci pour ton aide! :o)))
0
Rejoignez-nous