Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tester la présence d'un texte dans une cellule d'une table ?

11 réponses
Avatar
L'AMI Yves
Bonsoir.

Je suis nouveau ici, j'ai parcouru les deux derniers mois de contributions,
mais je n'ai rien trouvé.

Pour récupérer les données d'une table, j'utilise
getElementsByTagName("td")[7].firstChild.nodeValue
mais si la cellule est vide, j'ai l'erreur "Objet requis".

Comment l'éviter ? (autrement dit : y a-t-il une fonction qui permet de
tester la présence de "nodeValue" ?)

Merci d'avance.

AMIcalement.

10 réponses

1 2
Avatar
Florian Sinatra
*L'AMI Yves* @ 21/12/2006 00:03 :
Bonsoir.


Bonne nuit même !

Comment l'éviter ? (autrement dit : y a-t-il une fonction qui permet de
tester la présence de "nodeValue" ?)


if( getElementsByTagName("td")[7].firstChild.nodeValue ) {
var toto = getElementsByTagName("td")[7].firstChild.nodeValue;
}

doit convenir ;-)

Avatar
Cenekemoi
Bonjour à Florian Sinatra qui nous a écrit
:
*L'AMI Yves* @ 21/12/2006 00:03 :
Bonsoir.


Bonne nuit même !

Comment l'éviter ? (autrement dit : y a-t-il une fonction qui permet
de tester la présence de "nodeValue" ?)


if( getElementsByTagName("td")[7].firstChild.nodeValue ) {
var toto = getElementsByTagName("td")[7].firstChild.nodeValue;
}

doit convenir ;-)


Pas tout à fait...

Pour blinder la chose, il faut tester chaque objet l'un après l'autre,
ie:

if ( getElementsByTagName("td")[7] &&
getElementsByTagName("td")[7].firstChild &&
getElementsByTagName("td")[7].firstChild.nodeValue ) {
var toto = getElementsByTagName("td")[7].firstChild.nodeValue;
}


--
Cordialement, Thierry ;-)


Avatar
L'AMI Yves
Ouaaaaahhhhhh !!!! Il n'y a pas que la ceinture et les bretelles, mais
chacune est doublée...

Bon, je blague, mais quand-même, c'est moi qui vient de créer la table
en lisant une base de données : il se peut que la cellule soit vide, mais
si elle n'existait pas, j'en aurais eu des nouvelles bien avant. Mais tu ne
pouvais pas le savoir : merci à tous deux.

Question subsidiaire : mon client de newsgroup est Outlook Express,
mon FAI est Free : ce matin, je vois vos deux réponses, mais je ne
vois pas mon message original : est-ce un problème connu ? Est-ce
une question de paramétrage chez moi ?

Enfin, les questions n'arrêtent jamais, une réponse engendre d'autres
questions, ça ne s'arrêtera jamais !

AMIcalement.

"Cenekemoi" a écrit dans le message de news:
458a5268$0$15502$
Bonjour à Florian Sinatra qui nous a écrit
:
*L'AMI Yves* @ 21/12/2006 00:03 :
Bonsoir.


Bonne nuit même !

Comment l'éviter ? (autrement dit : y a-t-il une fonction qui permet
de tester la présence de "nodeValue" ?)


if( getElementsByTagName("td")[7].firstChild.nodeValue ) {
var toto = getElementsByTagName("td")[7].firstChild.nodeValue;
}

doit convenir ;-)


Pas tout à fait...

Pour blinder la chose, il faut tester chaque objet l'un après l'autre, ie:

if ( getElementsByTagName("td")[7] &&
getElementsByTagName("td")[7].firstChild &&
getElementsByTagName("td")[7].firstChild.nodeValue ) {
var toto = getElementsByTagName("td")[7].firstChild.nodeValue;
}


--
Cordialement, Thierry ;-)




Avatar
L'AMI Yves
Eh bien en fait, ça ne marche pas ! Est-ce par ce que je ne vous ai pas
tout dit ? Je trouve JavaScript très lourd dans la manipulation des objets,
et j'ai peut-être pris un raccourci trop "risqué" : voici des extraits de
mon
code :
lien=document.getElementById(Id);// La ligne de la table où l'on a
cliqué
lien.style.backgroundColor="#00FFFF";
with (parent.Saisie.document.Saisie)
{
...
if (lien.getElementsByTagName("td")[6].firstChild.nodeValue){
Releve.value=lien.getElementsByTagName("td")[6].firstChild.nodeValue;}
...

Donc je crée une variable intermédiaire (est-ce un objet ? il semble bien
que oui, pourtant) "lien", pour éviter de refaire des dizaines de fois le
getEementById(Id) (je pense que c'est une méthode, donc que ça bouffe
de la CPU chaque fois qu'on passe dessus !)

Releve est un champ "<input type='text'... dans la même feuille. Si le
"td"[6]
n'est pas vide, ça marche, sinon, j'ai toujours "Objet requis" sur cette
ligne.

A+

AMIcalement

"Cenekemoi" a écrit dans le message de news:
458a5268$0$15502$
Bonjour à Florian Sinatra qui nous a écrit
:
*L'AMI Yves* @ 21/12/2006 00:03 :
Bonsoir.


Bonne nuit même !

Comment l'éviter ? (autrement dit : y a-t-il une fonction qui permet
de tester la présence de "nodeValue" ?)


if( getElementsByTagName("td")[7].firstChild.nodeValue ) {
var toto = getElementsByTagName("td")[7].firstChild.nodeValue;
}

doit convenir ;-)


Pas tout à fait...

Pour blinder la chose, il faut tester chaque objet l'un après l'autre,
ie:

if ( getElementsByTagName("td")[7] &&
getElementsByTagName("td")[7].firstChild &&
getElementsByTagName("td")[7].firstChild.nodeValue ) {
var toto = getElementsByTagName("td")[7].firstChild.nodeValue;
}


--
Cordialement, Thierry ;-)







Avatar
L'AMI Yves
Arrrrrggghhhh! Les newsgroups, c'est trop facile... Si la réponse reçue ne
marche pas tout de suite, on relance le fil... puis on fait des essais.
Alors,
dans mon cas, il n'y avait pas besoin de doubler ceinture et bretelles, mais
il fallait quand même bien les deux :
if (getElementsByTagName("td")[7].firstChild &&
getElementsByTagName("td")[7].firstChild.nodeValue ) ... marche.

Merci à tous.

AMIcalement.
Avatar
Francis Spiesser
Il se trouve que L'AMI Yves a formulé :
Bonsoir.

Je suis nouveau ici, j'ai parcouru les deux derniers mois de contributions,
mais je n'ai rien trouvé.

Pour récupérer les données d'une table, j'utilise
getElementsByTagName("td")[7].firstChild.nodeValue
mais si la cellule est vide, j'ai l'erreur "Objet requis".

Comment l'éviter ? (autrement dit : y a-t-il une fonction qui permet de
tester la présence de "nodeValue" ?)

Merci d'avance.

AMIcalement.


try {
var texte=getElementsByTagName("td")[7].firstChild.nodeValue;
}
catch(err) {
var texte='';
}

--
______
Francis (enlever .NIPUBNISOUMIS)
"Un synonyme, c'est un mot qu'on écrit pour remplacer celui dont on ne
connaît pas l'orthographe."

Avatar
ASM
Je trouve JavaScript très lourd dans la manipulation des objets,
et j'ai peut-être pris un raccourci trop "risqué" :


bof ... non, pas plus
tu aurais aussi bien pu avoir direct :

var lien = document.getElementById(Id).getElementsByTagName("TD");

code :
lien=document.getElementById(Id);// La ligne de la table où l'on a
cliqué


attention !

var lien=document.getElementById(Id);

lien.style.backgroundColor="#00FFFF";
with (parent.Saisie.document.Saisie)


tu as des frames ? dont celle *nommée* 'Saisie' ?
qui contient un formulaire *nommé* 'Saisie' ?

Il paraît que with( truc ) { faire_cecii(); faire_cela(); }
peut fatiguer/dérranger IE (à confirmer ...)

essayer en faisant :

var f = parent.Saisie.document.forms['Saisie'].elements;
var v = lien.getElementsByTagName("TD");
// ou
// var v = document.getElementById(Id).getElementsByTagName("TD");

{
...
if (lien.getElementsByTagName("td")[6].firstChild.nodeValue){

Releve.value=lien.getElementsByTagName("td")[6].firstChild.nodeValue;}


et en plus tu y vas un peu fort mélangeant des appels à l'arbre des
forms et ceux au DOM

if( v[6] &&
v[6].firstChild &&
v[6].firstChild.nodeValue &&
f['Releve'] )
f['Releve'].value = v[6].firstchild.nodeValue;

Donc je crée une variable intermédiaire (est-ce un objet ? il semble bien
que oui, pourtant) "lien", pour éviter de refaire des dizaines de fois le
getEementById(Id) (je pense que c'est une méthode, donc que ça bouffe
de la CPU chaque fois qu'on passe dessus !)


Ce n'est à mon sens pas très grave : la CPU est faite pour qu'on s'en serve.
Il faut juste que 'lien' soit une variable non globale, c a d interne à
ta fonction afin que IE rende la CPU après usage.

Releve est un champ "<input type='text'... dans la même feuille. Si le
"td"[6]
n'est pas vide, ça marche, sinon, j'ai toujours "Objet requis" sur cette
ligne.


en faisant l'appel conditionnel très détaillé et avec une ligne pour
chaque condition, le déboggueur de JS te dira probablement la ligne
fautive et donc l'élément requis manquant.

sinon, mucho mas complicatado :

if( typeof(v[6]) != 'undefined' &&
typeof(v[6].firstChild) != 'undefined' &&
typeof(v[6].firstChild.nodeValue) != 'undefined' &&
typeof(f['Releve']) != 'undefined' )
f['Releve'].value = v[6].firstchild.nodeValue;

et encore plus fort ! :

if(typeof(f['Releve'])!='undefined')
f['Releve'].value = typeof(v[6])=='undefined'? 'cel innexistante' :
typeof(v[6].firstChild)=='undefined'? 'pas de 1st child' :
typeof(v[6].firstChild.nodeValue)=='undefined'? 'pas de node' :
v[6].firstchild.nodeValue;
else alert('pas d'input, ou mauvaise reference');

Bien faire gaffe que les input (et le form) aient des *noms* et non pas
seulement des IDs

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

Avatar
Florian Sinatra
*L'AMI Yves* @ 21/12/2006 12:03 :
Arrrrrggghhhh! Les newsgroups, c'est trop facile... Si la réponse reçue ne
marche pas tout de suite, on relance le fil... puis on fait des essais.


J'en profite pour t'informer que la convention sur Usenet est de
répondre comme on écrit, soit vers le bas. Lis
http://www.faqs.org/faqs/fr/usenet/repondre-sur-usenet/ pour plus de
détails.

dans mon cas, il n'y avait pas besoin de doubler ceinture et bretelles, mais
il fallait quand même bien les deux :
if (getElementsByTagName("td")[7].firstChild &&
getElementsByTagName("td")[7].firstChild.nodeValue ) ... marche.


C'est juste, car c'est firstChild.nodeValue qui représente le contenu de
la cellule, et pas seulement nodeValue.
La réponse de Francis n'est pas mal non plus.

Avatar
L'AMI Yves
Ne soyez pas trop durs : je débute en JavaScript...

"ASM" a écrit dans le message
de news: 458a6ffd$0$27376$
Je trouve JavaScript très lourd dans la manipulation des objets,
et j'ai peut-être pris un raccourci trop "risqué" :


bof ... non, pas plus
tu aurais aussi bien pu avoir direct :

var lien = document.getElementById(Id).getElementsByTagName("TD");


Je n'ai pas encore compris ce qu'apporte "var ", puisque ça marche sans.


code :
lien=document.getElementById(Id);// La ligne de la table où l'on a
cliqué


attention !

var lien=document.getElementById(Id);

lien.style.backgroundColor="#00FFFF";
with (parent.Saisie.document.Saisie)


tu as des frames ? dont celle *nommée* 'Saisie' ?
qui contient un formulaire *nommé* 'Saisie' ?


Ben oui ! Je suis d'accord que c'est pas terrible, mais je suis tombé dans
un piège pour débutant...


Il paraît que with( truc ) { faire_cecii(); faire_cela(); }
peut fatiguer/dérranger IE (à confirmer ...)


Je travaille avec IE 6.0, et ça n'a pas l'air...


essayer en faisant :

var f = parent.Saisie.document.forms['Saisie'].elements;
var v = lien.getElementsByTagName("TD");
// ou
// var v = document.getElementById(Id).getElementsByTagName("TD");

{
...
if (lien.getElementsByTagName("td")[6].firstChild.nodeValue){

Releve.value=lien.getElementsByTagName("td")[6].firstChild.nodeValue;}


et en plus tu y vas un peu fort mélangeant des appels à l'arbre des forms
et ceux au DOM


Je suis trop débutant pour les distinguer... mais je rame !


if( v[6] &&
v[6].firstChild &&
v[6].firstChild.nodeValue &&
f['Releve'] )
f['Releve'].value = v[6].firstchild.nodeValue;

Donc je crée une variable intermédiaire (est-ce un objet ? il semble bien
que oui, pourtant) "lien", pour éviter de refaire des dizaines de fois le
getEementById(Id) (je pense que c'est une méthode, donc que ça bouffe
de la CPU chaque fois qu'on passe dessus !)


Ce n'est à mon sens pas très grave : la CPU est faite pour qu'on s'en
serve.
Il faut juste que 'lien' soit une variable non globale, c a d interne à ta
fonction afin que IE rende la CPU après usage.

Releve est un champ "<input type='text'... dans la même feuille. Si le
"td"[6]
n'est pas vide, ça marche, sinon, j'ai toujours "Objet requis" sur cette
ligne.


en faisant l'appel conditionnel très détaillé et avec une ligne pour
chaque condition, le déboggueur de JS te dira probablement la ligne
fautive et donc l'élément requis manquant.

sinon, mucho mas complicatado :

if( typeof(v[6]) != 'undefined' &&
typeof(v[6].firstChild) != 'undefined' &&
typeof(v[6].firstChild.nodeValue) != 'undefined' &&
typeof(f['Releve']) != 'undefined' )
f['Releve'].value = v[6].firstchild.nodeValue;

et encore plus fort ! :

if(typeof(f['Releve'])!='undefined')
f['Releve'].value = typeof(v[6])=='undefined'? 'cel innexistante' :
typeof(v[6].firstChild)=='undefined'? 'pas de 1st child' :
typeof(v[6].firstChild.nodeValue)=='undefined'? 'pas de node' :
v[6].firstchild.nodeValue;
else alert('pas d'input, ou mauvaise reference');

Bien faire gaffe que les input (et le form) aient des *noms* et non pas
seulement des IDs

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


Toi, tu as l'air bien aguerri, je te soumets donc le problème sur lequel je
butte maintenant : j'ai un peu plus d'expérience avec php, et j'y ai pris
l'habitude de faire des formulaires avec plusieurs boutons 'type="submit"'.
Avec name= "Nom" et value="xxx", dans la page appelée par le
action=, on récupère la variable Nom qui a la valeur associée au bouton
qui a été cliqué. (Je suppose que c'est assez classique...)

Mais maintenant que je suis passé au JavaScript, je voudrais tester les
entrées de l'utilisateur avant de soumettre mon formulaire, et mes tests
vont dépendre du bouton qui a été cliqué... A ce jour, je ne sais pas
comment le reconnaître.

Une alternative serait action="" dans le <form>, onClick= dans les
différents <input type="button">, mais alors je ne sais pas comment
invoquer le .php qui va traiter les entrées (si elles sont jugées bonnes).

J'espère avoir été assez clair.

Merci

AMIcalement.
la valeur


Avatar
ASM
Ne soyez pas trop durs : je débute en JavaScript...


durs ou compliqués ?

tu aurais aussi bien pu avoir direct :

var lien = document.getElementById(Id).getElementsByTagName("TD");


Je n'ai pas encore compris ce qu'apporte "var ", puisque ça marche sans.


Ça sert à définir une variable :
- si en dehors d'une fonction : variable globale
(accessible à tout ce qu'il y aura en JS dans le fichier)
(danger : si utiliée pour tripotages ultérieurs,
IE aura tendance à engranger tout ce qu'on aura fait, au lieu de
libérer sa mémoire une fois le résultat obtenu (fuite de mémoire))
- si dans une fonction : la variable n'appartient qu'à cette fonction
(on peut donc avoir même nom de variable dans plusieurs fonctions
et chaque variable indépendante de l'autre
ainsi que du reste du fichier.
IE vide la mémoire y utilisée au sortir de la fonction)

En globale si on omet 'var' avant le nom de variable, je crois que ça
n'a pas tout à fait le même sens pour le JS et la variable devient un
objet de la fenêtre où est affiché le fichier (à vérifier voir ... ?!)

tu as des frames ? dont celle *nommée* 'Saisie' ?
qui contient un formulaire *nommé* 'Saisie' ?


Ben oui ! Je suis d'accord que c'est pas terrible, mais je suis tombé dans
un piège pour débutant...


J'ai rien dit ... ;-)

et en plus tu y vas un peu fort mélangeant des appels à l'arbre des
forms et ceux au DOM


Je suis trop débutant pour les distinguer... mais je rame !


On rame un peu tous (avec des avirons plus ou moins de compéte et des
esquifs + ou - vermoulus)

Toi, tu as l'air bien aguerri,


Bof, bof, je bricole.

Mais maintenant que je suis passé au JavaScript, je voudrais tester les
entrées de l'utilisateur avant de soumettre mon formulaire, et mes tests
vont dépendre du bouton qui a été cliqué... A ce jour, je ne sais pas
comment le reconnaître.

Une alternative serait action="" dans le <form>, onClick= dans les
différents <input type="button">,


Je ferais cela en effet pour les boutons :
onclick="bouton_presse = this.value;"

et dans la balise <form> on ajoute un onsubmit :

<form name="monForm" action="bidule.php" onsubmit="return verif(this);">

suivant ce que la fonction retourne (true/false) le formulaire est
envoyé ou non (le JS ne devrait servir qu'à ça).

mais alors je ne sais pas comment
invoquer le .php qui va traiter les entrées (si elles sont jugées bonnes).

J'espère avoir été assez clair.


Le php n'a rien à battre de ce que tu bricoles en JS.
Pourquoi ? parceque sans JS ça doit fonctionner, le JS n'intervient que
pour vérifier le formulaire avant de l'envoyer, évitant en cela les
retours du PHP pas content des champs mal remplis.
Le JS fait un peu double emploi.

Maintenant pour ton histoire de récup automatique dans des inputs qui
suppose le JS obligatoire, il n'y a pas plus de blème, le PHP récupère
les champs comme d'hab.



Ha ! la fonction de verif !

Exemple :

function verif(f) {
// sélection de la zone concernée en fonction du bouton submit
f = (bouton_presse == 'Envoi partie 1')?
f.getElementById('part_1').getElementsByTagName('INPUT') :
f = (bouton_presse == 'Envoi partie 2')?
f.getElementById('part_2').getElementsByTagName('INPUT') :
f = (bouton_presse == 'Envoi partie 3')?
f.getElementById('part_3').getElementsByTagName('INPUT') :
f;
// verif que les champs de texte sont remplis
for(var i=0; i<f.length; i++)
if(f[i].type=='text' && f[i].value=='')
{
alert('Champ : '+f[i].name+'nnon rempli');
f[i].focus();
f[i].select();
// arret de la fonction et stop du submittage
return false;
}
// renvoyer 'true' si tout est OK
return true;
}




--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


1 2