为DOM中所有元素的click事件附加事件处理程序

问题描述 投票:2回答:3

因此,我希望能够找出页面的哪一部分已被单击。 不能一开始就保证所有元素都在页面上,这意味着我需要使用jquery委托之类的东西。

一种方法是遍历DOM中的所有元素,然后将事件处理程序附加到每个元素-但这将很慢且很复杂-每当动态添加新的html时,我要么必须重新附加所有处理程序,或找出添加的html的子集。

另一种方法是使用事件冒泡-因此将事件处理程序添加到文档或正文中,并依赖于事件冒泡

像这样的东西

        $('body').delegate('div', 'click', function(e){
            dummyId++;
            console.log(e);
            console.log(e.currentTarget);
            console.log("=====");

        });

但是,使用此代码后,当我单击页面上的按钮时,将得到按钮周围的div,而不是实际的按钮。 换句话说,以上内容过于具体。 此外,我觉得原始选择器应该是文档,而不是body标签。

明确地说,我想知道何时在页面上单击了任何元素-我该怎么做?

谢谢

所以我用.on尝试了这段代码

$(document).on('click', function(e){
    console.log("EVENT DUMMY ID");

    console.log(e.target);
    console.log("=====");

});

但是,当我单击应用程序中的按钮时,不会触发任何操作-单击其他元素时,控制台日志会运行。

我知道如果没有更多背景信息,这可能很难回答-您还需要什么?

javascript jquery events dom javascript-events
3个回答
7
投票

currentTarget返回事件冒泡到的节点(如果有的话)。 而是询问target ,所以:

香草:

document.addEventListener('click', function(evt) {
    alert(evt.target.tagName);
}, false);

jQuery的:

$(document).on('click', function(evt) {
    alert(evt.target.tagName);
});

http://jsfiddle.net/qsbdr/


-1
投票

尝试这个:

$(document).on('click', function(e) {
   // now use e.target here
});

您还可以使用e.stopPropagation() click事件的冒泡


-1
投票

尽管我的建议确实依赖MutationEvents,但我认为无需替换,但我认为不需要使用jQuery这样的东西。

您可以在将任何新节点插入DOM时得到通知。 在触发的回调中,您可以将onclick处理程序附加到新节点上。 我只处理了添加新节点的情况。

<!DOCTYPE html>
<html>
<head>
<script>
window.addEventListener('load', onDocLoaded, false);

function onDocLoaded()
{
    window.addEventListener('DOMNodeInserted', onNodeInserted, false);
    document.body.appendChild( newEl('div') );
}

function onNodeInserted(evt)
{
    evt.srcElement.addEventListener('click', onNodeClicked, false);
}

function onNodeClicked()
{
    document.body.appendChild( newEl('div') );
}
</script>
<style>
div
{
    border: solid 1px red;
    padding: 8px;
    margin: 4px;
    display: inline-block;
}
</style>
</head>
<body>
</body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.