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

Inverser une sélection de cases à cocher

19 réponses
Avatar
Denis Bitouzé
Bonjour,

j'en suis =E0 mes d=E9buts en javascript et, voulant proposer un moyen
simple d'inverser une s=E9lection de cases =E0 cocher, j'ai trouv=E9 sur la
toile un script que j'ai un peu adapt=E9 et qui fonctionne bien :

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

(au passage, je ne comprends pas du tout ce qu'est ce =AB void =BB mais
passons...)

Je me disais qu'il serait peut-=EAtre plus efficace, en tout cas plus =AB
joli =BB, de d=E9finir cette fonction de la fa=E7on suivante :

function invert(){
void(d=3Ddocument);
void(el=3Dd.getElementsByName('absents'));
for(i=3D0;i<el.length;i++)
el[i].checked=3D!el[i].checked;
}

mais, =E0 ma grande surprise, =E7a ne fonctionne pas, et m=EAme en passant
par un interm=E9diaire, du genre :

est_coche=3Del[i].checked;
el[i].checked=3D!est_coche;

J'aurais bien aim=E9 comprendre seul pourquoi mais je n'ai r=E9ussi =E0 fai=
re
fonctionner aucun d=E9bogueur javascript :(

Merci d'avance pour tout =E9claircissement...
--=20
Denis

10 réponses

1 2
Avatar
Mickaël Wolff
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 <http://lupusmic.org/pro/>
Avatar
Pascal PONCET
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
Avatar
Pascal PONCET
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
Avatar
Mickaël Wolff
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)
<https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/forEach>


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

Seeking for a position <http://lupusmic.org/pro/>
Avatar
Olivier Miakinen
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.

<https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/forEach>



Merci. J'y lis ceci :

<cit.>
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);
}
};
}
</cit.>

Et donc, quoique ce ne soit pas standard, le code ci-dessus permet d'en
avoir une implémentation dans tous les cas.
Avatar
Pascal PONCET
Mickaël Wolff a écrit :
Standard (Ecmascript 262 implémenté dans Mozilla Javascript > 1.6)
<https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/forEach>



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 ?
Avatar
SAM
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)
<https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/forEach>



donc tu fais d'abord :
<script language="JavaScript.1.7" blabla>
?

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

--
sm
Avatar
Mickaël Wolff
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 <http://lupusmic.org/pro/>
Avatar
Mickaël Wolff
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 :
<script language="JavaScript.1.7" blabla>
?



Je crois, mais sans certitude, que la forme consacrée est :
<script type='text/javascript;1.7'>blah</script>

Au fait, Array.forEach sera normalisé dans Ecmascript 5 :
<https://developer.mozilla.org/En/JavaScript/ECMAScript_5_support_in_Mozilla>

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

Seeking for a position <http://lupusmic.org/pro/>
Avatar
Denis Bitouzé
Le jeudi 02/07/09 à 15h17,
Pascal PONCET a écrit :

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
1 2