2013-04-11 54 views
1

我具有由通過獲取與共享的className HTML元素創建的節點列表:的JavaScript - 檢測的元素的索引被點擊在節點列表

> 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循環來實現:

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

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

但是,如何獲取te事件被觸發的NodeList的索引?我怎樣才能爲數組的每個元素分配唯一的名稱?

+0

另外:如果什麼DoSomething的()函數的代碼如下:BTN [1]。 innerHTML = //被點擊的項目的索引 – 2013-04-11 14:45:40

回答

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()函數,該函數將在事件之前被調用。 – 2013-04-11 14:49:17

+0

是的,但它返回一個函數,那麼onclick屬性是不是仍然會被分配一個事件處理程序? – 2013-04-11 14:51:54

+0

@BarendHuberts:沒有封閉將封裝變量...你可以在這裏檢查:http://jsfiddle.net/8xXRu/。 – 2013-04-11 14:52:29

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方法(),使其跨瀏覽器是。當然假設你沒有實現你自己的覆蓋方法使它跨越瀏覽器)。

編輯:爲了您的innerHTML的問題,檢查出的附加撥弄看到它做工精細: http://jsfiddle.net/TdCD8/

+0

thx,這確實是有幫助的。我無法爲每個類名分配一個唯一的名稱。而這段代碼解決了這個問題。這是很好的brainfood :) – 2013-04-11 15:04:09

+0

很高興幫助:)在循環中,將btn [i]放入變量中會更有效,因此您不必每次都從陣列中拉出,但性能差異可能會不明顯。 – MasNotsram 2013-04-11 15:08:25