J'ai besoin de connaître l'index de l'élément cliqué. Impossible de comprendre comment le faire
for (i = 0; i < document.getElementById('my_div').children.length; i++) {
document.getElementById('my_div').children[i].onclick = function(){'ALERT POSITION OF CLICKED CHILD'};
}
cet.index?
voici un exemple de ce que j'essaie de faire (il n'en restitue que 6):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Untitled Document</title>
<style type="text/css">
body{margin:0;}
#container div{height:50px;line-height:50px; text-align:center}
</style>
</head>
<body>
<div id="container">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
<script>
for (i = 0; i < document.getElementById('container').children.length; i++) {
document.getElementById('container').children[i].onclick = function(){alert('Number ' + i + ' was clicked')};
}
</script>
</body>
</html>
Voici un morceau de code qui peut vous aider à obtenir l’index de l’élément cliqué dans la boucle for
. Tout ce dont vous avez besoin est un nouveau scope :
var g = document.getElementById('my_div');
for (var i = 0, len = g.children.length; i < len; i++)
{
(function(index){
g.children[i].onclick = function(){
alert(index) ;
}
})(i);
}
Edit 1: Incorporer les commentaires de l'utilisateur Felix Kling à la réponse.
gestionnaire d'événements est déjà une fermeture
Edit 2: Mise à jour du lien de violon
Avec ES6 déstructuration, vous pouvez faire
const index = [...el.parentElement.children].indexOf(el)
ou
const index = Array.from(el.parentElement.children).indexOf(el)
ou version ES5
var index = Array.prototype.slice.call(el.parentElement.children).indexOf(el)
La réponse acceptée (de Ashwin Krishnamurthy) est loin d’être optimale.
Vous pouvez juste faire:
const g = document.getElementById('my_div');
for (let i = 0, len = g.children.length; i < len; i++)
{
g.children[i].onclick = function(){
alert(index) ;
}
}
pour éviter de créer des fermetures inutiles. Et même dans ce cas, ce n’est pas optimal puisque vous créez 6 gestionnaires d’événements DOM (6 divs
dans l’exemple ci-dessus) uniquement pour obtenir le numéro d’un seul clic sur div
.
Ce que vous devriez réellement faire est d’utiliser une délégation d’événements (attacher single événement click au parent) puis de vérifier l’index du e.target
en utilisant la méthode que j’ai mentionnée précédemment et ci-dessus ( Obtenir l’index de l’élément cliqué en pure javascript ).
Les éléments de cellule de tableau ont une propriété cellIndex
, mais je ne connais pas les autres éléments. Vous devrez soit
i
previousSibling
sindex
dans votre boucle for et lisez-la (n'augmentez pas les objets Host).L’approche de la fermeture sera la plus facile, je pense. Assurez-vous que vous avez bien compris le fonctionnement des fermetures. De bonnes explications sont disponibles sur le Web.
function makeAlertNumber(element, i) {
element.addEventListener('click', function() {
alert('Number ' + i + ' was clicked');
}, false);
}
[].slice.call(document.getElementById('container').children).forEach(makeAlertNumber); // homework: find a way to express this for older browsers :-)
L'indice par rapport à quoi?
S'il s'agit de l'index de la collection HTML actuelle, il serait simplement représenté avec votre variable de compteur i
.
Un mot d'avertissement: étant donné que les HTMLCollections sont "actives", vous devez les utiliser pour déterminer le .length
dans une boucle. S'il se trouve que ces éléments sont ajoutés ou supprimés dans la boucle, des choses étranges et dangereuses peuvent se produire. Mettez en cache la valeur .length
avant d'appeler la boucle.
getIndexOfNode: function(node){
var i = 1;
while(node.previousElementSibling != null){
i++
}
return i;
}
la fonction retournera l'index du noeud passé dans son élément parent.