开发者问题收集

检测对“空白”区域的点击

2013-11-17
4322

假设我们有下一个 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 中,空白区域将是所有具有白色或橙色的区域。

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

2个回答

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

为此,您需要将 click 挂接到 body 上,然后查看到达 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 挂在 body 上,并将 click 挂在相关的其他元素上,并防止点击传播:

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; 来停止传播(或使用抽象这些内容的库)。

T.J. Crowder
2013-11-17

使用事件的“目标”,并检查它的类/id

http://jsfiddle.net/yryQ6/

绑定点击事件时,使用该事件,获取目标并请求它的类:

$('#content').on('click',function(e){
  if ($(e.target).hasClass('action')) {
    // click on an action
  } else {
    // click on smething that's not an action, in this case, action-row o actions, your empty area
  }
}

编辑:假设您使用 jquery,您应该能够使用与 javascript 事件类似的功能

arieljuod
2013-11-17