2013-04-11 2 views
1

Я Создал NodeList пути получения HTML-элементов с общей Classname по:JavaScript - обнаружить индекс элемента, щелкнул в Nodelist

> var btn = document.getElementsbyClassName("btn") 

Это HTML код:

<div id="main"> 
    <div class="btn"> 
    </div> 
    <div class="btn"> 
    </div> 
    <div class="btn"> 
    </div> 
    <div class="btn"> 
    </div> 
</div> 

Таким образом, эти конкретный объект NodeList имеет длину 4.

Теперь я хочу вызвать функцию при щелчке одного из этих элементов. Я совершаю, что при использовании для цикла:

for(var i = 0; i < btn.length ; i++) { 
    btn[i].onclick = doSomething; 
}; 

function doSomething() { 
    // here come some code. 
}; 

Но как я могу получить индекс NodeList, на котором было уволены те события? И как я могу назначить уникальные имена для каждого из элементов массива?

+0

в дополнение: что делать, если код функции йоЗотеЬЫпд() будет: БТН [1]. innerHTML = // Указатель элемента, на который нажимается –

ответ

0

Вы можете включить его в подписи функции:

for(var i = 0; i < btn.length ; i++) { 
    btn[i].onclick = doSomething(i); 
}; 

function doSomething(i) { 
    return function() { 
     btn[1].innerHTML = i; 
    } 
}; 
+0

Это не сработает: потому что если вы передадите аргумент функции doSomething(), функция будет вызвана перед событием. –

+0

Верно, но он возвращает функцию, поэтому не будет ли свойство onclick присвоить обработчик события? –

+0

@BarendHuberts: нет закрытия будет инкапсулировать переменную ... Вы можете проверить это здесь: http://jsfiddle.net/8xXRu/. –

2

Вот что я хотел бы сделать:

var btn = document.getElementById('main').getElementsByTagName('div'); 
for(var i = 0; i < btn.length ; i++) { 
    btn[i].id = "btn"+i; 
    if(btn[i].className=="btn") 
     btn[i].onclick = doSomething; 
}; 

function doSomething() { 
    var num = this.id.substr(3); 
    alert("Div " + num + " clicked"); 
}; 

(я вынул getElementsByClassName(), чтобы сделать его кросс-браузер, который имеет. предполагая, что вы не реализовали свое собственное переопределение для метода, чтобы сделать его перекрестным браузером).

Edit: Для вашего innerHTML вопрос, проверьте прилагаемую скрипку, чтобы он работал отлично: http://jsfiddle.net/TdCD8/

+0

thx, это было действительно полезно. У меня возникли проблемы с назначением каждому имени имени уникального имени. И этот код решает это. Это был хороший мозговой пуд :) –

+0

Рад, что это помогло :) В цикле было бы более эффективно поместить btn [i] в ​​переменную, поэтому вам не придется вытягивать из массива каждый раз, но разница в производительности, скорее всего, будет не заметны. – MasNotsram

Смежные вопросы