Подтвердить что ты не робот

Получить индекс элемента clicked, используя чистый javascript

Мне нужно знать индекс щелкнутого элемента. Не могу понять, как это сделать.

for (i = 0; i < document.getElementById('my_div').children.length; i++) {
    document.getElementById('my_div').children[i].onclick = function(){'ALERT POSITION OF CLICKED CHILD'};
}

this.index?

вот пример того, что я пытаюсь сделать (он возвращает только 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>
4b9b3361

Ответ 1

Вот фрагмент кода, который может помочь вам получить индекс элемента, по которому щелкнули, внутри цикла for. Все, что вам нужно, это новая сфера:

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);

}

Изменить 1: Включение комментариев пользователя Феликс Клинг в ответ.

обработчик событий уже является закрытием

Редактировать 2: Обновленная скриптовая ссылка

Ответ 2

С разрушением ES6 вы можете сделать

const index = [...el.parentElement.children].indexOf(el)

или

const index = Array.from(el.parentElement.children).indexOf(el)

или версия ES5

var index = Array.prototype.slice.call(el.parentElement.children).indexOf(el)

Ответ 3

Принятый ответ (от Ashwin Krishnamurthy) на самом деле далек от оптимального.

Вы можете просто сделать:

const g = document.getElementById('my_div');
for (let i = 0, len = g.children.length; i < len; i++)
{
    g.children[i].onclick = function(){
        alert(index)  ;
    }
}

чтобы избежать создания ненужных замыканий. И даже тогда это не оптимально, так как вы создаете 6 обработчиков событий DOM (6 divs в приведенном выше примере), чтобы получить несколько однократных нажатий div.

На самом деле вы должны использовать делегирование событий (присоединить одиночное событие click к родительскому элементу), а затем проверить индекс e.target, используя метод, о котором я упоминал ранее и выше (Получить индекс щелкнутого элемента, используя чистый javascript).

Ответ 4

Элементы ячейки таблицы имеют свойство cellIndex, но я не знаю о других элементах. Вам придется либо

  • создать закрытие для резервирования значения i
  • динамически считать previousSibling s
  • добавить свойство index в ваш for-loop и прочитать, что (не увеличивайте объекты хоста).

Как я думаю, подход закрытия будет самым простым. Пожалуйста, убедитесь, что вы поняли, как работают затворы, есть хорошие объяснения в Интернете.

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 :-)

Ответ 5

Индекс по отношению к чему?

Если речь идет о индексе в текущей коллекции HTML, индекс просто будет представлен вашей переменной i.

Одно слово предостережения: поскольку HTMLCollections являются "живыми", вы должны использовать их для определения .length в цикле. Если бывает, что эти элементы добавляются или удаляются внутри цикла, могут возникать странные и опасные вещи. Загрузите значение .length перед вызовом цикла.

Ответ 6

getIndexOfNode: function(node){ var i = 1; while(node.previousElementSibling != null){ i++ } return i; } Функция вернет индекс node, переданный в его родительском элементе.

Ответ 7

У меня была та же проблема, когда мне нужно было перебрать массив и получить индексный номер кликаемого элемента.

Вот как я решил проблему...

//first store array in a variable
let container = [...document.getElementById('container')];

//loop through array with forEach function
container.forEach(item => {
    item.addEventListener('click', () => {
        console.log(container.indexOf(item));
    });
});

Это будет console.log, индексный номер элемента, по которому щелкнули.

Надеюсь, что это отвечает на некоторые вопросы.

Ответ 8

Если вы создаете макет страницы и контролируете, сколько "subdivs" будет завернуто "контейнером", почему бы не использовать javascript для его динамического создания?

for (var i = 0; i < NumberOfSubDivsYouNeed; i++) { 
 var SubDiv = document.createElement("DIV");
  SubDiv.id = i;
  SubDiv.style.*enter any style rules if you wish*;
  SubDiv.onclick=function(){alert(this.id);};
  document.getElementById("container").appendChild(SubDiv);
  }