javascript - 检测到 "empty"区域的点击

标签 javascript html onclick

假设我们有下一个 html/css:http://jsfiddle.net/rbDKm/2/

<div id="header">header</div>
<div id="content">
    <div class="actions">
        <div class="actions-row">
            <div class="action ">home</div>
            <div class="action ">search</div>
            <div class="action ">settings</div>
        </div>
        <div class="actions-row">
            <div class="action">...</div>
            <div class="action">...</div>
            <div class="action">...</div>
        </div>
    </div>
</div>
<div id="footer">footer</div>

我需要的是检测在“空白”区域上进行的任何点击。 在提供的 fiddle 中,空白区域将是一切,具有白色或橙色。

有什么技术/方法可以做到这一点吗?

最佳答案

根据您现在的标记,我认为这意味着您需要检测任何 div.action#header 之外的点击> 或#footer

为此,您需要在 body 上 Hook click,然后查看到达 body 所需的路径:

document.body.addEventListener("click", function(e) {
    var elm = e.target;
    while (elm !== document.body) {
        if (elm.id === "header" || elm.id === "footer") {
            return;
        }
        if (elm.tagName.toUpperCase() === "DIV" && /(?:^| )action(?:$| )/.test(elm.className)) {
            return;
        }
        elm = elm.parentNode;
    }
    // If we got here, it's on one of the desired areas
});

您可以执行几种变体。例如,您可以使用 classList 而不是 className.match在现代浏览器上。现代浏览器还提供 Element#closest您可以使用它来代替循环。

或者,您将 click Hook 到 body 上,并将 click Hook 到相关的其他元素上,并防止点击传播:

function stopTheEvent(e) {
    e.stopPropagation();
}
document.body.addEventListener("click", function(e) {
    // It's one of the desired areas
});
var list = document.querySelectorAll("#header, #footer, div.action");
var index;
for (index = 0; index < list.length; ++index) {
    list[index].addEventListener("click", stopTheEvent);
}

...但这看起来更困惑。


注意:在上面,我没有考虑到 IE8 缺少 addEventListener。如果您需要支持 IE8,请查看 attachEvent("onclick", ...) 并使用 window.event.returnValue = false; 停止传播(或使用将这些东西抽象出来的库)。

关于javascript - 检测到 "empty"区域的点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025685/

相关文章:

javascript - hyperHTML:自定义 bool 属性

javascript - 让 float 的 div 在到达另一个 div 时停止

文本问题上的 HTML 链接

jquery - 为什么这个输入框不触发 IE 上的焦点事件?

javascript - 使用 d3js 的 onclick 在新选项卡中绘制图表

c++ - 有没有办法在 MFC 应用程序中获取控件映射到的处理函数?

javascript - Angularjs模块工厂服务问题

javascript - 从 ES6 导入带有命名空间的旧 javascript

html - 将第三个水平 div 定位到其他 div 的底部?

javascript - 使用 jQuery 拆分和修改元素