OVH Cloud OVH Cloud

pb avec firefox et calcul avec champs de formulaire

11 réponses
Avatar
jean.emberger
Bonjour,
J'ai un script basique qui calcule le double d'un nombre saisi dans un
formulaire
___________________________________________________________________________=
_____
<form action=3D"" method=3D"post" name=3D"calcul" id=3D"calcul">
<p>Votre premier nombre :
<input name=3D"nombre" type=3D"text" id=3D"nombre">
</p>
<p>Voici son double :
<input name=3D"double" type=3D"text" id=3D"double">

<input type=3D"button" name=3D"Submit" value=3D"calcul"
onClick=3D"document.calcul.double.value=3Ddocument.calcul.nombre.value*2">
</p>

</form>
___________________________________________________________________________=
____
Pas de pb avec IE mais erreur avec Firefox et je ne la trouve pas.
Si quelqu'un a une id=E9e....
Merci
Jean

10 réponses

1 2
Avatar
ASM
Bonjour,
J'ai un script basique qui calcule le double d'un nombre saisi dans un
formulaire
________________________________________________________________________________
<form action="" method="post" name="calcul" id="calcul">
<p>Votre premier nombre :
<input name="nombre" type="text" id="nombre">
</p>
<p>Voici son double :
<input name="double" type="text" id="double">

<input type="button" name="Submit" value="calcul"
onClick="document.calcul.double.value=document.calcul.nombre.value*2">
</p>

</form>
_______________________________________________________________________________
Pas de pb avec IE mais erreur avec Firefox et je ne la trouve pas.


en raccourci on fait (si tout se passe dans le même form) :

onClick="double.value=nombre.value*2">

Pour etre vraiment certain d'etre compris :

onClick="with(document.forms['calcul']) {
elements['double'].value = elements['nombre'].value*2; }">

--
Stephane Moriaux et son [moins] vieux Mac

Avatar
Laurent Vilday

<form action="" method="post" name="calcul" id="calcul">
<p>Votre premier nombre :
<input name="nombre" type="text" id="nombre">
</p>
<p>Voici son double :
<input name="double" type="text" id="double">


en raccourci on fait (si tout se passe dans le même form) :
onClick="double.value=nombre.value*2">

Pour etre vraiment certain d'etre compris :
onClick="with(document.forms['calcul']) {
elements['double'].value = elements['nombre'].value*2; }">


C'est pas pour être certain d'être vraiment compris mais c'est
simplement pour lui passer du code correct.

La notation en référençant directement le name ou le ID d'un élément est
une très mauvaise façon de faire, bien que ça passe à peu pres bien dans
les cas simples. D'ailleurs quand on essaye de faire ça, mon firefox
génère un warning dans la console : "Elément référencé par son ID/NAME
dans le contexte global. Utilisez la propriété standard du W3C
document.getElementById() à la place."

Quid du morceau suivant, simpliste à souhait et certes un peu bete, mais
c'est autorisé.

<script>
var double = true;
var nombre = false;
</script>
<input name="double" type="text" id="double">
<input name="nombre" type="text" id="nombre"
onclick="double.value=nombre.value*2">

Qui est référencé par le nom "double" ou le nom "nombre" maintenant
quand je clique ??

Le mieux, à mon sens, c'est de juste créer les éléments HTML sans aucun
"onclick", "onmouseover", "onkeyup" ni autre attributs du même accabit
qui n'ont rien à faire avec la structure HTML et ensuite d'ajouter les
événements javascript par dessus. Ca permet de séparer le HTML (la
structure) du javascript (la logique).

<script>
/**
* Petit raccourci,
* j'aime pas écrire document.getElementById() en permanence
*/
function $(x) { return document.getElementById(x); }

/**
* J'utilise ici la function addEvent() pour ajouter un événement,
* mais je laisse à chacun le soin de trouver sa version préférée,
* il y a énormément de littérature sur la question.
*/
addEvent(window, "load", starting);

function starting(evt) {
addEvent($('nombre'), 'click', doubleNombre);
}

function doubleNombre(evt) {
$('double').value = $('nombre').value * 2;
}
</script>
<form>
<input type="text" id="nombre">
x 2 = <input type="text" id="double">
</form>

--
laurent


Avatar
ASM

Pour etre vraiment certain d'etre compris :
onClick="with(document.forms['calcul']) {
elements['double'].value = elements['nombre'].value*2; }">


C'est pas pour être certain d'être vraiment compris mais c'est
simplement pour lui passer du code correct.


c'était une manière de s'exprimer :-)
je vois que je suis touj aussi bien interprété :-(

La notation en référençant directement le name ou le ID d'un élément est
une très mauvaise façon de faire, bien que ça passe à peu pres bien dans
les cas simples. D'ailleurs quand on essaye de faire ça, mon firefox
génère un warning dans la console : "Elément référencé par son ID/NAME
dans le contexte global. Utilisez la propriété standard du W3C
document.getElementById() à la place."


Bien entendu, je ne suis pas du tout d'accord :
- 1 - il n'y a pas que le DOM dans la vie
- 2 - les collections (links, images, forms ...) existent toujours
- 3 - les noms sont autorisés pour les éléments de formulaires
(si je ne m'abuse, le W3C le précise bien)
- 4 - Quid des vieux brouteurs ?
(il parait que dans cetaines régions du monde, dont les US
une frange non vraiment négligeable d'internautes
utilise encore des NC4.x)
- 5 - Après tout FF n'émet que des "warnings"
(il ne fait que militer pour le W3C)

Quid du morceau suivant, simpliste à souhait et certes un peu bete, mais
c'est autorisé.

<script>
var double = true;
var nombre = false;
</script>
<input name="double" type="text" id="double">
<input name="nombre" type="text" id="nombre"
onclick="double.value=nombre.value*2">

Qui est référencé par le nom "double" ou le nom "nombre" maintenant
quand je clique ??


d'où mon complément : "Pour etre vraiment certain d'etre compris"

Le mieux, à mon sens, c'est de juste créer les éléments HTML sans aucun
"onclick", "onmouseover", "onkeyup" ni autre attributs du même accabit
qui n'ont rien à faire avec la structure HTML et ensuite d'ajouter les
événements javascript par dessus. Ca permet de séparer le HTML (la
structure) du javascript (la logique).


Je ne puis qu'être d'accord avec ce point de vue.
Mais c'eût été sympa de donner une fonction pour le addEvent()
celle que j'ai récupérée (via google)
ne fonctionne pas avec mon IE (Mac) :-(

il eût été préférable d'ajouter un 'onchange' au lieu d'un 'onclick'

Perso, je préfère des méthodes moins sophistiquées et plus directes :

// logiquement un input ne peut être que dans un form
// logiquement un élément de form porte un nom
// (et accessoirement un id)

document.forms[0].elements['nombre'].onchange = function(){
document.forms[0].doubleNombre.value=this.value*2; }

et hop! en 2 lignes seulement par les vieilles méthodes ...

<script>
/**
* Petit raccourci,
* j'aime pas écrire document.getElementById() en permanence
*/


// on se demande bien ce qui leur a pris d'inventer de telles noms
// de fonctions à rallonges :-(

function $(x) { return document.getElementById(x); }

/**
* J'utilise ici la function addEvent() pour ajouter un événement,
* mais je laisse à chacun le soin de trouver sa version préférée,
* il y a énormément de littérature sur la question.
*/
addEvent(window, "load", starting);

function starting(evt) {
addEvent($('nombre'), 'click', doubleNombre);
}

function doubleNombre(evt) {
$('double').value = $('nombre').value * 2;
}
</script>
<form>
<input type="text" id="nombre">
x 2 = <input type="text" id="double">
</form>




--
Stephane Moriaux et son [moins] vieux Mac


Avatar
jean.emberger
Merci pour cette réponse, effectivement ça marche.
Mais cela ne répond pas à ma question, à savoir qu'y a-t-il de faux
dans mon code précédent ?
Firefox ne reconnait-il pas les noms des champs ?
Javascript est bien un langage avec syntaxe pointée.
J'ai aussi lu les posts suivants.
C'est bien sûr intéressant et cela marche surement, mais c'est comme
toujours avec les puristes, il faut utiliser 3 fonctions et 10 lignes
quand une seule (moins élégante je le concède) suffirait.
Jean
Avatar
YD
Mais cela ne répond pas à ma question, à savoir qu'y a-t-il de faux
dans mon code précédent ?
Firefox ne reconnait-il pas les noms des champs ?

<form action="" method="post" name="calcul" id="calcul">
<p>Votre premier nombre :
<input name="nombre" type="text" id="nombre">
</p>
<p>Voici son double :
<input name="double" type="text" id="double">

<input type="button" name="Submit" value="calcul"
onClick="document.calcul.double.value=document.calcul.nombre.value*2">
</p>
</form>


Ce ne sont pas les noms de champ qui posent problème mais la façon d'adresser
le formulaire. calcul n'est pas un élément de document mais de la collection
document.forms. Donc soit tu l'adresses par exemple ainsi :
document.forms.calcul (ou document.forms["calcul"])
soit implicitement, en utilisant l'élément à l'origine de l'évènement this :
this.form.double ou this.form.elements.double
ce qui donne par ex.
onClick="this.form.double.value=this.form.nombre.value*2"
(et, bonus, c'est plus court que ton code).

Javascript est bien un langage avec syntaxe pointée.


Certes, mais en JavaScript écrire a["b"] est strictement équivalent à
écrire a.b : dans les deux cas on adresse la propriété b de l'objet a.

J'ai aussi lu les posts suivants.
C'est bien sûr intéressant et cela marche surement, mais c'est comme
toujours avec les puristes, il faut utiliser 3 fonctions et 10 lignes
quand une seule (moins élégante je le concède) suffirait.


Il n'est pas forcément question d'être puriste mais que son code marche
dans le plus de navigateurs possible, non ? Ce qui n'est pas le cas du
code proposé par Laurent Vilday, j'ai l'impression.

--
Y.D.

Avatar
jean.emberger
Ok, merci pour cette réponse.
Jean
Avatar
Cenekemoi

<form action="" method="post" name="calcul" id="calcul">
<p>Votre premier nombre :
<input name="nombre" type="text" id="nombre">
</p>
<p>Voici son double :
<input name="double" type="text" id="double">


en raccourci on fait (si tout se passe dans le même form) :
onClick="double.value=nombre.value*2">

Pour etre vraiment certain d'etre compris :
onClick="with(document.forms['calcul']) {
elements['double'].value = elements['nombre'].value*2; }">


C'est pas pour être certain d'être vraiment compris mais c'est
simplement pour lui passer du code correct.
(...)


Pour ma part, je préfère, et de loin, écrire ceci :

onClick="this.form.double.value=this.form.nombre.value*2">

Compatibilité assurée, objets garantis ==> le bonheur, quoi !


Rappel pour les néophytes :

"this.form" pointe toujours vers l'objet formulaire, étant
sous-entendu que "this" représente un champ de type "input, textarea,
etc..."

--
Cordialement, Thierry ;-)



Avatar
Cenekemoi
Pour ma part, je préfère, et de loin, écrire ceci :

onClick="this.form.double.value=this.form.nombre.value*2">

Compatibilité assurée, objets garantis ==> le bonheur, quoi !


Rappel pour les néophytes :

"this.form" pointe toujours vers l'objet formulaire, étant
sous-entendu que "this" représente un champ de type "input, textarea,
etc..."


Oups, désolé, YD, je n'avais pas vu ta réponse d'hier...ceci dit, nous
sommes bien d'accord !

--
Cordialement, Thierry ;-)

Avatar
Laurent Vilday
je vois que je suis touj aussi bien interprété :-(


non, non, t'inquiètes, on me comprend pas non plus. c'est pas grave :)

La notation en référençant directement le name ou le ID d'un élément
est une très mauvaise façon de faire
Bien entendu, je ne suis pas du tout d'accord :

- 1 - il n'y a pas que le DOM dans la vie


C'est sur, c'est bien pour ça qu'on se retrouve avec des librairies de
compatibilité énormes.

- 2 - les collections (links, images, forms ...) existent toujours


Oui, mais cela n'a aucun rapport avec un ID référencé directement. Plein
d'objets sont automatiquement créés.

<input type="text" name="window" id="window">

Dans un cas comme celui la, je pense qu'il est préférable de pas
utiliser la variable "window" directement pour accéder à cet input, ça
me semble compromis. Certes on peut arguer que c'est un mauvais choix de
nom de variable mais bon, j'ai le droit de la faire. Et il y en a des
tonnes j'en suis persuadé, <input id="document", id="this", etc.

Donc *oui* pour l'accès par les collections automatiquement créées
(document.forms[0].elements['inputName']) elles sont là pour ça et
évidemment *oui* pour l'accès par les méthodes ad hoc
(document.getElementById('inputName')).

Mais *non* pour l'accès en référencant directement l'id de l'objet
(inputName), il y a trop de risque de confusion et d'incompatibilités.

- 3 - les noms sont autorisés pour les éléments de formulaires
(si je ne m'abuse, le W3C le précise bien)


Humm ? Ca ne me dit rien du tout ça, tu aurais une référence stp ?

- 4 - Quid des vieux brouteurs ?
(il parait que dans cetaines régions du monde, dont les US
une frange non vraiment négligeable d'internautes
utilise encore des NC4.x)


Il faut passer en mode "traditionnel" element.onclick = function
Mais tu as beaucoup moins de latitude pour ajouter plusieurs évènements
similaires sur le même élément.

A mois de faire des contorsions comme :

// on sauvegarde l'ancien événement
// attention, on créé une closure, peut potentiellement créer
// des fuites de mémoires avec IE win suivant les types d'objets
// qu'on a dans notre fonction
var oldonclick = element.onclick;

// on remplace l'événement par notre nouvelle fonction
element.onclick = function() {
// si oldonclick est une fonction, on l'appelle
if (typeof oldonclick=='function) oldonclick();
// le reste de notre événement ici}
};

et encore, il faudrait prendre en compte le return de la function
précédente, au cas ou elle aurait fait return false; afin d'annuler
l'événement en cours.

- 5 - Après tout FF n'émet que des "warnings"
(il ne fait que militer pour le W3C)


Certes, mais pourquoi conserver des "erreurs" quand on peut les éviter ?

Mais c'eût été sympa de donner une fonction pour le addEvent()
celle que j'ai récupérée (via google)
ne fonctionne pas avec mon IE (Mac) :-(


IE Mac 5.2 ne fonctionne que en version traditionnelle
http://www.quirksmode.org/js/events_compinfo.html#link6

Tu peux démarrer un thread si tu crois que ca vaut la peine d'être
approfondi. Je suis sur qu'il y a plein de personnes ici qui ont plein
de choses à dire sur la gestion des événements.

document.forms[0].elements['nombre'].onchange = function(){
document.forms[0].doubleNombre.value=this.value*2; }


Oui, en méthode traditionnelle (onchange) comme ici ca marche très bien
aussi. C'est ce que j'aime avec javascript, il y a plein de façons
d'arriver à l'objectif :)

Mais je confesse ne jamais m'être penché sur le problème des MAC, bien
assez de problèmes comme ça.

--
laurent


Avatar
ASM

- 2 - les collections (links, images, forms ...) existent toujours


<input type="text" name="window" id="window">


il est certain que si on utilise tout et n'importe quoi comme name
on va aller au devant de qques déboires :-)

Et il y en a des
tonnes j'en suis persuadé, <input id="document", id="this", etc.


tu es trop tordu pour moi :-)
(même pas imaginé qu'on puisse s'amuser à çà)

- 3 - les noms sont autorisés pour les éléments de formulaires
(si je ne m'abuse, le W3C le précise bien)


Humm ? Ca ne me dit rien du tout ça, tu aurais une référence stp ?


http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.3
name = cdata [CI]
This attribute names the element so that it may be referred to
from style sheets or scripts.
Note. This attribute has been included for backwards compatibility.
http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.4
name = cdata [CI]
This attribute assigns the control name.
http://www.la-grange.net/w3c/xhtml1/#h-4.10
etc ...
En fait, et si j'ai bien compris, ils vont même bien au delà
puisque incluent aussi les ancres, images, etc ...
http://www.w3.org/TR/REC-html40/struct/objects.html#h-13.2

- 4 - Quid des vieux brouteurs ?


Il faut passer en mode "traditionnel" element.onclick = function
Mais tu as beaucoup moins de latitude pour ajouter plusieurs évènements
similaires sur le même élément.


oui, vaut mieux le prévoir d'avance
mais de l'autre façon (addEvent) aussi, non?
(çà ne va pas s'inventer tout seul selon le besoin)

// on sauvegarde l'ancien événement


tu peux passer par du conditionnel

- 5 - Après tout FF n'émet que des "warnings"
(il ne fait que militer pour le W3C)


Certes, mais pourquoi conserver des "erreurs" quand on peut les éviter ?


reste à juger de l'erreur ...

Est-ce qu'un form en GET va envoyer les éléments du form liés
à l'url de l'action si ces éléments n'ont qu'un id ?

celle que j'ai récupérée (via google)
ne fonctionne pas avec mon IE (Mac) :-(


IE Mac 5.2 ne fonctionne que en version traditionnelle
http://www.quirksmode.org/js/events_compinfo.html#link6

Tu peux démarrer un thread si tu crois que ca vaut la peine d'être
approfondi.


à propos d'IE Mac ?
m'étonnerait que çà passionne :-)
Déjà qu'il y a l'incontournable IE6 et ses grands parents ...

Je suis sur qu'il y a plein de personnes ici qui ont plein
de choses à dire sur la gestion des événements.


par contre à propos des événements il y a de quoi faire.

Mais je confesse ne jamais m'être penché sur le problème des MAC, bien
assez de problèmes comme ça.


Il ne faut pas confusionner : les Macs n'ont rien à voir dans l'affaire
C'est une question de navigateur, ceux développés pour Mac et PC
(win ou linux) de manière quasi parallèle montrent les mêmes
symptomes d'un environnement à l'autre à version égale.

L'exemple du IE Mac n'était que pour dire, ou montrer, qu'on
rencontre qques couacs (et sans remonter jusqu'au NC4.5).

--
Stephane Moriaux et son [moins] vieux Mac


1 2