2012-11-13 55 views
0

我想添加一個事件偵聽器點擊,我想知道,被點擊檢測子節點數量

function evl(etna) { 
    document.addEventListener("click", function (el) { 
     alert("You clicked on " + 'the name of element that was clicked or his array code'); 
    }, false); 
}; 

節點的位置etna是:

document.getElementsByTagName("*"); 

回答

1
function evl(etna){ 
    document.addEventListener("click",function (el) { 
     var clickedElement = el.target || el.srcElement; 
     alert("Link detected a click. Cancellable: "+clickedElement.name); 
     for(var i = 0; i < etna.length; i++) { 
      if(etna[i] === clickedElement) { 
       //i is a position of an element in etna 
       break; 
      } 
     } 
     },false); 
}; 

您可以使用this這將指向一個點擊元素。至於Phil H IE 8不能這樣工作。但無論如何,應該使用.target.srcElement。也許它會更好地獲得它的ID。名稱屬性不適用於div,跨度等。

但是,您也正在將事件附加到document。這將指向一個文件。 而不是你應該使用el.target || el.srcElement其中.target/.srcElement是一個指向實際發生點擊的節點的指針。我不認爲你可以得到由document.getElementsByTagName("*")返回的數組中的元素的索引(實際上,節點列表)(好吧,你可以得到這個列表並循環遍歷它,並檢查每個元素是否相等到this)。另外,我不知道爲什麼可能需要它。

+0

在IE8及以下版本中,事件不會設置this,所以它仍然指向全局窗口對象:[sitepoint.com](http://www.sitepoint.com/javascript-this-event-handlers /)。 –

+0

可能。但看起來我們都錯過了附加元素事件的一個點:) –

+0

我不想現在他的arrey位置也喜歡el [10] – Karim

0

添加循環和etna數組中設置不同的事件偵聽每個項目:

function evl(etna){ 
    for(var i=0; i < etna.length; ++i) { 
     (function() { 
      var thisNode = etna[i]; 
      var localval = i; 
      etna[i].addEventListener("click",function (el) { 
       alert("Link detected a click. Cancellable: "+ thisNode.id + " which is id " + localval); 
      },false); 
     })(); 
    } 
} 

工作的jsfiddle:http://jsfiddle.net/5xDjE/

是馬上打電話僅僅是爲了迫使作用域功能thisNodelocalval,否則所有元素都會獲得對相同變量的引用(javascript範圍是有趣的)。

我建議不要使用索引(範圍在localval),因爲它需要保留原始數組節點。由於節點會隨着時間的推移而改變,而且javascript會爲您計算引用數量,所以您希望避免這種長長的節點數組。

請注意,this並不總是有被點擊的元素,在IE8和低於this points to the global window object

相關問題