узнать номер елемента в массиве при клике
есть 5 дивов, с классом а
есть переменная myVar где -- > .getElementsByClassName('a'); потом addEvent.... и функция в которой нужно: чтобы при клике на див у меня был alert с номером дива в массиве. Пример для того чтобы обратиться к одному из дивов мне нужно делать так : myVar[х]. нужно чтобы в "х" заганялся номер дива на которого я кликнул и выводился через alert |
var myVar = document.getElementsByClassName('a'); myVar[0].parentNode.addEventListener('click', function(e) { var self = e.target; if(self.className != 'a') return; var i = myVar.length; while(i--) { if(myVar[i] == self) { var x = i; break; } } alert(x); }); |
<style> div.a { padding:5px; margin: 5px; background-color: red; float: left; } </style> <div class="a">1</div> <div class="a">2</div> <div class="a">3</div> <div class="a">4</div> <div class="a">5</div> <script> (function () { var divs = document.querySelectorAll("div.a"), len = divs.length, i = 0; for (; divs[i].setAttribute("onclick", "clval(" + i + ")"), ++i < len;); clval = function (e) { alert(e); }; }()); </script> |
Фу setAttribute('onclick'), фу clval без var.:-E
<style> div.a { padding:5px; margin: 5px; background-color: red; float: left; } </style> <div class="a">1</div> <div class="a">2</div> <div class="a">3</div> <div class="a">4</div> <div class="a">5</div> <script> (function () { var divs = document.querySelectorAll("div.a"); var handler = function() { // var index = this.dataset.index; var index = this.getAttribute('data-index'); alert(index); } for (var i = 0; i < divs.length; i++) { // divs[i].dataset.index = i; divs[i].setAttribute('data-index', i); divs[i].onclick = handler; } }()); </script> ES5: <style> div.a { padding:5px; margin: 5px; background-color: red; float: left; } </style> <div class="a">1</div> <div class="a">2</div> <div class="a">3</div> <div class="a">4</div> <div class="a">5</div> <script> (function () { var divs = document.querySelectorAll("div.a"); var handler = function() { var index = Array.prototype.indexOf.call(divs, this); alert(index); } for (var i = 0; i < divs.length; i++) { divs[i].onclick = handler; } }()); </script> |
Вообще, имхо, индекс нафиг не нужен, как и массив. Кликнутый див в колбэк и так передаётся через target/this.)
|
var elements = document.querySelectorAll('.a') || []; elements = [].slice.apply(elements); // toArray elements.forEach(function (element, i) { element.addEventListener('click', function () { alert(this); // див на который кликнули alert(element); // див на который кликнули alert(i); // номер дива на который кликнули }) }); учитесь рукожопчики мои |
показал заодно парню как с селекторами работать, как ты заметил. думаешь путаницы больше вносит?
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Цитата:
var elements = [].slice.call(document.querySelectorAll('.a')); elements.forEach(function (element, i) { element.addEventListener('click', function () { alert(this); // див на который кликнули alert(element); // див на который кликнули alert(i); // номер дива на который кликнули }) }); |
Цитата:
Цитата:
<style> div.a { padding:5px; margin: 5px; background-color: red; float: left; } </style> <div class="a">1</div> <div class="a">2</div> <div class="a">3</div> <div class="a">4</div> <div class="a">5</div> <script> (function () { "use strict"; var divs = document.querySelectorAll("div.a"), len = divs.length, i = 0; for (; divs[i].setAttribute("onclick", "clval(" + i + ")"), ++i < len;); clval = function (e) { alert(e); }; }()); </script> Ну и вобще речь не про работает/не работает. Ты ведь сам знаешь - бывает код работает, но в адрес его автора хочется сказать много нехороших слов. |
Почему никто не юзает Array.apply(null, arrayLike) ??
Этож самый короткий и самый шустрый способ приведения (Кроме Array.from, кстати его не вычеркнули из ES6?) |
Цитата:
Даниил эт ты кому пишешь? |
Цитата:
Цитата:
Цитата:
|
Цитата:
И поясни Цитата:
|
Писал про селектор div.a
|
Цитата:
|
так автору адресуй про селектор div.a и
что ты скажешь про "use strict"; в примере <style> div.a { padding:5px; margin: 5px; background-color: red; float: left; } </style> <div class="a">1</div> <div class="a">2</div> <div class="a">3</div> <div class="a">4</div> <div class="a">5</div> <script> var aa = function(){ "use strict"; } (function () { var divs = document.querySelectorAll("div.a"), len = divs.length, i = 0; for (; divs[i].setAttribute("onclick", "clval(" + i + ")"), ++i < len;); clval = function (e) { alert(e); }; }()); var bb = function(){ "use strict"; } </script> |
Вышестоящей - вмысле выше по уровню, а не по расположению :)
(function(){ 'use strict'; (function(){ // тут тоже строгий режим действует })() })() |
Принято :) Т.С должен был исковеркать код
Теперь divs[i].onclick = handler; и мой вариант divs[i].setAttribute("onclick", "clval(" + i + ")") ты вешаешь на каждый элемент обработчик, а я к каждому элементу добавляю вызов функции приведи аргументы, что твой вариант лучше |
Лучше, ибо не говнокод.)
Внутри javascript записывать javascript код в виде строки(какие бы на то ни были причины) - моветон. Это очевидно любому, у кого наличествует чувство прекрасного.) |
Цитата:
другие аргументы будут |
Цитата:
В твоем же случае создается по обработчику на элемент. Причем со всеми недостатками eval'а. А также неявно создается несколько with(){} блоков, что тоже не есть гуд. |
Цитата:
|
Maxmaxmaxmaximus8, с forEach гениальный вариант! :)
<!DOCTYPE HTML> <html> <head></head> <body> <div class="a">Div 1</div> <div class="a">Div 2</div> <div class="a">Div 3</div> <div class="a">Div 4</div> <div class="a">Div 5</div> <script> var a = document.querySelectorAll('div.a'); [].forEach.call(a, function(e, i) { e.onclick = function() { alert('Элемент ' + i + ': ' + e.textContent); } }); </script> </body> </html> |
кококококомбо
<!DOCTYPE HTML> <html> <head></head> <body> <div class="a">Div 1</div> <div class="a">Div 2</div> <div class="a">Div 3</div> <div class="a">Div 4</div> <div class="a">Div 5</div> <script> var elements = [].slice.call(document.querySelectorAll('div.a')); var listener = function () { alert(elements.indexOf(this)) }; elements.forEach(function (element) { element.addEventListener('click', listener) }); </script> </body> </html> |
Maxmaxmaxmaximus8, а почему сразу не [].forEach.call? Или есть подвох?
|
Цитата:
|
danik.js, ай всё, протупил. :)
|
Цитата:
Цитата:
Так что юзаем мой вариант Array.apply(null, nodeList) :) |
я новичок в джаве --- подскажите чем плох мой код для такого случая?
<!DOCTYPE HTML> <html> <head></head> <body> <div class="a">Div 1</div> <div class="a">Div 2</div> <div class="a">Div 3</div> <div class="a">Div 4</div> <div class="a">Div 5</div> <script> var elem = document.getElementsByTagName('div'); var elements = []; for(var i=0; i<elem.length;i++){ var option = elem[i].getAttribute('class'); if(option=='a'){ elements.push(elem[i]); } } for(var j=0;j<elements.length;j++){ elements[j].onclick = function () { alert(elements.indexOf(this)); } } </script> </body> </html> |
Цитата:
и зачем вычислять то что уже известно строка 22 |
рони,
спасибо, с className ранее я не пользовался -- думал в старых браузерах не работает) а по строке 22 как лучше записать? и является ли мой код оптимальным или выше по форуму предлагали реализации значительно лучше? |
Pechen,
чем вас самого иные варианты неустроили? Цитата:
|
Pechen,
<!DOCTYPE HTML> <html> <head></head> <body> <div class="a">Div 1</div> <div class="a">Div 2</div> <div class="a">Div 3</div> <div class="a">Div 4</div> <div class="a">Div 5</div> <script> for (var elem = document.getElementsByTagName("div"), a = 0, i = 0; i < elem.length; i++) { var option = elem[i].className; "a" == option && (elem[i].onclick = function(b) { return function() { alert(b) } }(a++)) }; </script> </body> </html> |
Цитата:
у меня недостаточно знаний чтобы понять как работает ваш пример))) в частности откуда берется значение b) возможно, я не так выразился -- говоря "оптимальный" я имел ввиду можно ли его использовать или следует переписать? |
Pechen,
если работает то можно ))) Цитата:
|
|
рони, че за уродство постишь? Не показывай ЭТО людям ))
|
danik.js,
что не так? |
|
Часовой пояс GMT +3, время: 01:43. |