Inverser une sélection de cases à cocher

Le
Denis Bitouzé
Bonjour,

j'en suis à mes débuts en javascript et, voulant proposer un moyen
simple d'inverser une sélection de cases à cocher, j'ai trouvé sur la
toile un script que j'ai un peu adapté et qui fonctionne bien :

function invert(){
void(d=document);
void(el=d.getElementsByName('absents'));
for(i=0;i<el.length;i++)
if(el[i].checked == 1)
{
el[i].checked = 0;
}
else {
el[i].checked = 1;
}
}

(au passage, je ne comprends pas du tout ce qu'est ce « void » mais
passons)

Je me disais qu'il serait peut-être plus efficace, en tout cas plus «
joli », de définir cette fonction de la façon suivante :

function invert(){
void(d=document);
void(el=d.getElementsByName('absents'));
for(i=0;i<el.length;i++)
el[i].checked=!el[i].checked;
}

mais, à ma grande surprise, ça ne fonctionne pas, et même en passant
par un intermédiaire, du genre :

est_coche=el[i].checked;
el[i].checked=!est_coche;

J'aurais bien aimé comprendre seul pourquoi mais je n'ai réussi à fai=
re
fonctionner aucun débogueur javascript :(

Merci d'avance pour tout éclaircissement
--
Denis
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickaël Wolff
Le #19682631
Denis Bitouzé a écrit :

function invert(){
void(d=document);
void(el=d.getElementsByName('absents'));
for(i=0;i<el.length;i++)
if(el[i].checked == 1)
{
el[i].checked = 0;
}
else {
el[i].checked = 1;
}
}

(au passage, je ne comprends pas du tout ce qu'est ce « void » mais
passons...)



À étouffer les messages d'erreur du moteur Javascript. En effet, il
faut déclarer une variable avant de pouvoir l'utiliser, sinon un warning
doit être émis. Ici l'usage de l'opérateur void est maladroit, et risque
même de générer des bogues indécrotables.

Je me disais qu'il serait peut-être plus efficace, en tout cas plus «
joli », de définir cette fonction de la façon suivante :

function invert(){
void(d=document);
void(el=d.getElementsByName('absents'));
for(i=0;i<el.length;i++)
el[i].checked=!el[i].checked;
}



Pourtant chez moi ça marche ©

var invert = function(node)
{
node.checked = ! node.checked ;
}

var invertAll = function()
{
var nodes = document.getElementsByName('toto[]') ;
Array.forEach(nodes, invert) ;
}

J'aurais bien aimé comprendre seul pourquoi mais je n'ai réussi à faire
fonctionner aucun débogueur javascript :(



Qu'est-ce que tu appelles « débogueur javascript » ?

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position
Pascal PONCET
Le #19683011
Mickaël Wolff a écrit :
Array.forEach(nodes, invert) ;




Bonjour,

??? "forEach()"...
C'est une méthode d'itération perso ajoutée aux objets tableaux, ou elle
existe en standard dans une version récente de JS ?

Cordialement,
Pascal
Pascal PONCET
Le #19683001
Denis Bitouzé a écrit :
function invert(){
void(d=document);
void(el=d.getElementsByName('absents'));
for(i=0;i<el.length;i++)
el[i].checked=!el[i].checked;
}

mais, à ma grande surprise, ça ne fonctionne pas



Bonjour,

Pas de raison que ça ne fonctionne pas, a priori.
Ah si, il manque une accolade autour de la boucle.
Généralement c'est pas obligatoire, sauf si c'est confusant pour
l'interpréteur, et là ça peut l'être à cause de l'accolade de fermeture
de la fonction (sous réserve de test).

Par contre les "void" ne me paraissent pas très utiles, à moins que par
une subtilité que j'ignore, ils permettent d'éviter la copie, très
coûteuse en mémoire, de l'objet "document" !
Mais vu qu'il n'y a pas de réemploi de la variable, je ne vois pas, là
non plus, l'intérêt de la substitution.

Donc, plutôt :

<code>
function invertCheckBox(boxName) {
var boxArray = document.getElementsByTagName(boxName);
for(var i=0; i < boxArray.length; i++) {
if(boxArray[i].type.toLowerCase != "checkbox") continue;
boxArray[i].checked = ! boxArray[i].checked;
}
}
</code>

Remarques :
* J'ai changé le nom de la fonction pour plus de précision, car il
pourrait y avoir plus d'une fonction d'inversion dans un code plus fourni.
* J'ai passé le nom de la checkbox en argument, comme ça la fonction est
réutilisable avec une autre liste.
* le test intermédiaire permet d'éviter le traitement sur autre chose
que la checkbox, car le HTML n'oblige pas, au contraire, à ce que la
valeur d'un attribut "name" soit un identifiant unique.

Cordialement,
Pascal
Mickaël Wolff
Le #19683621
Pascal PONCET a écrit :
Mickaël Wolff a écrit :
Array.forEach(nodes, invert) ;




Bonjour,

??? "forEach()"...
C'est une méthode d'itération perso ajoutée aux objets tableaux, ou elle
existe en standard dans une version récente de JS ?



Standard (Ecmascript 262 implémenté dans Mozilla Javascript > 1.6)


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position
Olivier Miakinen
Le #19683611
Le 02/07/2009 17:26, Mickaël Wolff a écrit :

??? "forEach()"...
C'est une méthode d'itération perso ajoutée aux objets tableaux, ou elle
existe en standard dans une version récente de JS ?



Standard (Ecmascript 262 implémenté dans Mozilla Javascript > 1.6)



Non, pas standard. En tout cas ce n'est pas dans la norme ECMA-262 de
décembre 1999.




Merci. J'y lis ceci :

Compatibility

forEach is a JavaScript extension to the ECMA-262 standard; as such it
may not be present in other implementations of the standard. You can
work around this by inserting the following code at the beginning of
your scripts, allowing use of forEach in ECMA-262 implementations which
do not natively support it. This algorithm is exactly the one used in
Firefox and SpiderMonkey.

if (!Array.prototype.forEach)
{
Array.prototype.forEach = function(fun /*, thisp*/)
{
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();

var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this)
fun.call(thisp, this[i], i, this);
}
};
}

Et donc, quoique ce ne soit pas standard, le code ci-dessus permet d'en
avoir une implémentation dans tous les cas.
Pascal PONCET
Le #19683961
Mickaël Wolff a écrit :
Standard (Ecmascript 262 implémenté dans Mozilla Javascript > 1.6)



Effectivement, je ne connaissais pas.
Merci pour l'info et le lien.

Mais Olivier a raison, a priori, ce n'est exactement standard.
D'ailleurs, ça n'existe pas en JScript :
http://msdn.microsoft.com/fr-fr/library/k4h76zbx(en-us,VS.85).aspx

Par contre, on en trouve une référence dans ASP.net :
http://msdn.microsoft.com/fr-fr/library/bb397509.aspx
(avec un comportement différent pour les éléments vides !)

Ça a été testé sous IE ?
SAM
Le #19684641
Le 7/2/09 5:26 PM, Mickaël Wolff a écrit :
Pascal PONCET a écrit :
Mickaël Wolff a écrit :
Array.forEach(nodes, invert) ;







Méhouvatiltrouvertoutça ?

Bonjour,

??? "forEach()"...
C'est une méthode d'itération perso ajoutée aux objets tableaux, ou elle
existe en standard dans une version récente de JS ?



Standard (Ecmascript 262 implémenté dans Mozilla Javascript > 1.6)



donc tu fais d'abord :
?

avant de t'en servir
pour que les malheureux ignorants ne gueulent pas à l'erreur

--
sm
Mickaël Wolff
Le #19688841
Olivier Miakinen a écrit :

Non, pas standard. En tout cas ce n'est pas dans la norme ECMA-262 de
décembre 1999.



Rha, je mérite mes orties fraîches. Désolé, j'étais certain de
l'avoir vu dans une norme ECMA. Je vais chercher pour voir si je ne l'ai
pas vu dans une autre version.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position
Mickaël Wolff
Le #19689061
SAM a écrit :
Méhouvatiltrouvertoutça ?



:D Il faut dire que je n'apprends sérieusement le Javascript que
depuis deux semaines. Avant j'étais vraiment dédaigneux, en raison de
l'aspect bricolo de ces implémentations. Mais au final, c'est tout de
même une technologie très intéressante.

Bref, je me tape la lecture des normes Ecmascript, mais aussi de MDC
et bientôt MSDN. Peut-être que je passerais par PDF et Actionscript !

donc tu fais d'abord :
?



Je crois, mais sans certitude, que la forme consacrée est :

Au fait, Array.forEach sera normalisé dans Ecmascript 5 :

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position
Denis Bitouzé
Le #19689161
Le jeudi 02/07/09 à 15h17,
Pascal PONCET
Pas de raison que ça ne fonctionne pas, a priori.
Ah si, il manque une accolade autour de la boucle.
Généralement c'est pas obligatoire, sauf si c'est confusant pour
l'interpréteur, et là ça peut l'être à cause de l'accolade de
fermeture de la fonction (sous réserve de test).



Aaaaahhhh, ça fonctionne, merci !

Par contre les "void" ne me paraissent pas très utiles, à moins que
par une subtilité que j'ignore, ils permettent d'éviter la copie, tr ès
coûteuse en mémoire, de l'objet "document" !
Mais vu qu'il n'y a pas de réemploi de la variable, je ne vois pas, là
non plus, l'intérêt de la substitution.

Donc, plutôt :

<code>
function invertCheckBox(boxName) {
var boxArray = document.getElementsByTagName(boxName);
for(var i=0; i < boxArray.length; i++) {
if(boxArray[i].type.toLowerCase != "checkbox") continue;
boxArray[i].checked = ! boxArray[i].checked;
}
}
</code>

Remarques :
* J'ai changé le nom de la fonction pour plus de précision, car il
pourrait y avoir plus d'une fonction d'inversion dans un code plus
fourni.



Bonne idée.

* J'ai passé le nom de la checkbox en argument, comme ça la fonction
est réutilisable avec une autre liste.



Très bonne idée !

* le test intermédiaire permet d'éviter le traitement sur autre chose
que la checkbox, car le HTML n'oblige pas, au contraire, à ce que la
valeur d'un attribut "name" soit un identifiant unique.



Effectivement.

Merci beaucoup pour ces suggestions.
--
Denis
Publicité
Poster une réponse
Anonyme