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

Expression d'un indice

6 réponses
Avatar
Nicolas Vasic
Bonjour,

J'ai une fonction :

function calcul (indice, ev){
document.test.elements[indice + 1].value = ev.which;
document.test.elements[indice + 2].value = ev.keyCode; }

et un form:

<FORM NAME="test">
<input type="text" name="a" "value="" onKeyDown="calcul(0, event)">
etc...

Je n'arrive pas à remplacer l'indice en dur 0 (et les suivants, avec
incrémentation de 3) par une abstraction
genre: this.monIndiceDansMonFormulaire


Une idée? Merci à l'avance.

Nicolas

6 réponses

Avatar
SAM
Bonjour,

J'ai une fonction :

function calcul (indice, ev){
document.test.elements[indice + 1].value = ev.which;
document.test.elements[indice + 2].value = ev.keyCode; }

et un form:

<FORM NAME="test">
<input type="text" name="a" "value="" onKeyDown="calcul(0, event)">
etc...

Je n'arrive pas à remplacer l'indice en dur 0 (et les suivants, avec
incrémentation de 3) par une abstraction
genre: this.monIndiceDansMonFormulaire


Une idée? Merci à l'avance.


moyen l'idée sans avoir les 2 éléments suivants.
M'enfin, si les 2 éléments suivants sont des input type=text
essayer :

function calcul (quoi, ev){
var quoi = quoi.nextSibling;
while(quoi.tagName!='INPUT'&&quoi.type!='text')
quoi=quoi.nextSibling;
quoi.value = ev.which;
quoi=quoi.nextSibling;
while(quoi.tagName!='INPUT'&&quoi.type!='text')
quoi=quoi.nextSibling;
quoi.value = ev.keyCode;
}

<input type="text" name="a" "value="" onKeyDown="calcul(this, event)">
<input type="text" name="a1" "value="" disabled>
<input type="text" name="a2" "value="" disabled>
<input type="text" name="b" "value="" onKeyDown="calcul(this, event)">
<input type="text" name="b1" "value="" disabled>
<input type="text" name="b2" "value="" disabled>

--
sm

Avatar
Nicolas Vasic
Merci mais c'est trop compliqué. Je me demandais simplement si un
element input d'un form pouvait transmettre son index dans la table des
éléments du dit form.

Nicolas

SAM wrote:
Bonjour,

J'ai une fonction :

function calcul (indice, ev){
document.test.elements[indice + 1].value = ev.which;
document.test.elements[indice + 2].value = ev.keyCode; }

et un form:

<FORM NAME="test">
<input type="text" name="a" "value="" onKeyDown="calcul(0, event)">
etc...

Je n'arrive pas à remplacer l'indice en dur 0 (et les suivants, avec
incrémentation de 3) par une abstraction
genre: this.monIndiceDansMonFormulaire


Une idée? Merci à l'avance.


moyen l'idée sans avoir les 2 éléments suivants.
M'enfin, si les 2 éléments suivants sont des input type=text
essayer :

function calcul (quoi, ev){
var quoi = quoi.nextSibling;
while(quoi.tagName!='INPUT'&&quoi.type!='text')
quoi=quoi.nextSibling;
quoi.value = ev.which;
quoi=quoi.nextSibling;
while(quoi.tagName!='INPUT'&&quoi.type!='text')
quoi=quoi.nextSibling;
quoi.value = ev.keyCode;
}

<input type="text" name="a" "value="" onKeyDown="calcul(this, event)">
<input type="text" name="a1" "value="" disabled>
<input type="text" name="a2" "value="" disabled>
<input type="text" name="b" "value="" onKeyDown="calcul(this, event)">
<input type="text" name="b1" "value="" disabled>
<input type="text" name="b2" "value="" disabled>




Avatar
SAM
Merci mais c'est trop compliqué.


Y a rien de compliqué (ce n'est pas toi qui pédales, c'est le JS)

Je me demandais simplement si un
element input d'un form pouvait transmettre son index dans la table des
éléments du dit form.


non, pas sans complications
C'est d'ailleurs un gros manque, je trouve.

function indexMoi(quoi) {
far F = document.test;
for(var i=0, L= F.length; i<L; i++)
if(F[i] == quoi) return i;
}

<input onkeydown="calcul(indexMoi(this), ev);" blabla>



Peut-être mieux, bien que semblant plus compliqué
(devrait permettre de ne pas ré-indexer à chaque keyDown):

<input blabla
onkeydown="if(typeof this.idx == 'undefined')
this.idx = indexMoi(this);
calcul(this.idx, ev);">


Pas certain qu'on y gagne en efficacité par rapport à glisser vers les
nextSiblings

--
sm

Avatar
Nicolas Vasic
Y a rien de compliqué (ce n'est pas toi qui pédales, c'est le JS)


Certes, mais le drame du JS est qu'il pédale à la vitesse d'une
grand-mère asthmatique qui aurait oublié de prendre ses médicaments.

Dans les pages ambitieuses il faut vraiment en tenir compte.

Nicolas

Avatar
YD
Y a rien de compliqué (ce n'est pas toi qui pédales, c'est le JS)


Certes, mais le drame du JS est qu'il pédale à la vitesse d'une
grand-mère asthmatique qui aurait oublié de prendre ses médicaments.


N'exagérons pas ! Pour la plupart des besoins les quelques
millisecondes nécessaires passent inaperçues.

Pour ton problème, rien ne t'empêche de créer une propriété
supplémentaire à tes objets. Dans un script en fin de body
ou sur le onload de la page, tu parcours les éléments de
ton formulaire et tu les numérotes en ajoutant une propriété
nommée /index/ (par exemple et hasard).

var a = document.forms['test'].elements;
for (var i=0; a.length>i; i++)
a[i].index = i;

Par la suite, pour connaître son rang dans les éléments :
this.index

Ce qui change la ligne HTML ainsi :
<input type="text" name="a" value=""
onKeyDown="calcul(this.index, event)">

Et c'est tout.
--
Y.D.


Avatar
Nicolas Vasic
YD wrote:
Pour ton problème, rien ne t'empêche de créer une propriété
supplémentaire à tes objets.


Super, merci.

Nicolas