javascript - Js 事件处理重叠元素不起作用。与范围有关吗?关于真/假?

标签 javascript event-handling scope

好的。让我告诉你我的问题很简单。

当我在元素上提供一些事件(如“点击”)时,某些情况下它不起作用。

例如,我在 id 'abc' 上触发...

 event of this element works fine : <li id="abc"> 123123123 </li>

 But this isn't : <li id="abc"> <b> 123123 </b> </li>

不知道为什么。

下面是代码:

entrance = document.getElementById('entrance');
joinSite = document.getElementById('joinSite');

// Event controller for multi browsers.
var Event = {
    add: function(element, type, handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler, true);
        } else if (element.attachEvent) {
            element.attachEvent("on" + type, handler);
        } else {
            element["on" + type] = handler;
        }
    },

    remove: function(element, type, handler) {
        if (element.removeEventListener) {
            element.removeEventListener(type, handler, true);
        } else if (element.detachEvent) {
            element.detachEvent("on" + type, handler);
        } else {
            element["on" + type] = null;
        }
    },

    getEvent: function(event) {
        return event ? event : window.event;
    },

    getTarget: function(event) {
        return event.target || event.srcElement;
    },

    preventDefault: function(event) {
        if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },

    stopPropagation: function(event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    }
}

// Event delegation
Event.add(document,'click',function(event) {
    event = Event.getEvent(event);
    target = Event.getTarget(event);

    switch(target.id) {
        case 'linkLogin': // <li id="linkLogin> test </li> : works fine.
            entrance.style.display = 'block';
            break;

        case 'linkJoin': // <li id="linkJoin> <b> test </b> </li> : didn't work.
            alert('asdf');
            break;


        }       
    }
);

我真的不知道为什么。

据我所知,如果为事件处理程序提供“true”选项,事件捕获序列将接近文档的最低级别。

“窗口 - 文档 - 正文 - 父元素 - 子元素”

因此,如果为“文档”提供单击事件,则当我单击文档内的“元素儿子”时,该事件将起作用。

但这次不是。即使我在事件处理程序上给出 true 或 false 选项。

有谁知道这是为什么吗?

最佳答案

这与捕获阶段和冒泡阶段无关。这是您对事件委托(delegate)的使用:当您单击<b>时元素,该元素变为 target ,它没有预期的 id。您需要测试目标的所有父节点(直到 currentTarget ,即您的情况下的 document )是否是您想要监听的元素。

关于javascript - Js 事件处理重叠元素不起作用。与范围有关吗?关于真/假?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25592023/

相关文章:

c# - 在 for 循环中分配委托(delegate)的问题

c# - 前缀 "On"在 C# 编码中的事件案例中实现了什么?

c++ - vector 问题中的 shared_ptr - 迭代和丢失范围 - 获取损坏的数据

javascript - 如何在 Dojo 中创建私有(private)属性/方法?

javascript - 如何获取进程nodejs的局部范围内的所有变量

javascript - 在 Windows 上安装 gifify

javascript - 回调函数返回未定义?

javascript - Chrome扩展中的POST请求数据和地址栏更改

javascript - jQuery $ 变量差异

javascript - Chartjs,创建图表后如何编辑数据选项?