检测对“空白”区域的点击
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
绑定点击事件时,使用该事件,获取目标并请求它的类:
$('#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