2012-11-13 53 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

相关问题