узнать номер елемента в массиве при клике
есть 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, время: 11:34. |