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("*");
4

2 回答 2

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);
};

您可以使用thiswhich 将指向单击的元素。 至于Phil H IE 8 不能那样工作。但无论如何,应该使用.targetor .srcElement。也许得到它的id会更好。Name 属性对 div、span 等无效。

但是您也将事件附加到document. 这将指向一个文档。取而代之的是,您应该使用el.target || el.srcElementwhere.target/.srcElement是指向实际发生单击的节点的指针。

另外,我认为您无法获取数组(实际上是节点列表)中返回的元素的索引document.getElementsByTagName("*")(嗯,您可以获取该列表并在循环中遍历它并检查每个元素是否等于this)。另外,我不知道为什么需要它。

于 2012-11-13T13:40:24.983 回答
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/

立即调用的函数只是强制定义 and 的作用域thisNodelocalval否则所有元素都会引用同一个变量(javascript 作用域很有趣)。

我建议不要使用索引(范围 via localval),因为它需要保留原始节点数组。由于节点会随时间而变化,并且 javascript 会为您进行引用计数,因此您希望避免使用这些长节点数组。

请注意this,在 IE8 及以下,并不总是有被点击的元素指向全局窗口对象

于 2012-11-13T13:44:19.590 回答