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 :
(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; }
(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;
}
(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; }
??? "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
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
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.
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
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>
??? "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>
??? "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>
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.
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.
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.
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.
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 ?
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 !)
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 ?
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
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
??? "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
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.
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.
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.
: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>
: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>
: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>
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
Le jeudi 02/07/09 à 15h17,
Pascal PONCET <poncet.pascal@club-internet.fr> 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.
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.