我正在尝试使用jQuery监听器来监听用户对html主体的点击并执行特定功能,如果已经点击了身体上的任何位置,除了特定div和该div中的子项.
我们的想法是div是一个弹出式元素,而不是必须有一个用户可以点击的关闭按钮,他们应该只能点击除该div之外的页面上的任何地方,它将自动关闭.
我一直在使用这个监听器:
var initialClick = false; $('body').on('click.addPhoneListeners',function(event) { var target = EventUtility.getTarget(event); if(initialClick) { if(target.parentNode.id != clone.id && target.id != '') { finish(); }; } initialClick = true; });
它会监听正文上的所有点击,除非点击来自我希望用户能够与之交互的元素,否则它会关闭.不幸的是,这仅适用于只有一级孩子的div.一旦我开始获得多个层次结构,例如:
<div id="addressContainer"> <div id="address" class="hidden row"> <div class="row"> <div id="address.primary" class="hidden">P</div> <div id="address.type"></div> <div id="address.street"></div> <div id="address.editButton" class="hidden"><a id="addressEditButton">Edit</a></div> <div id="address.deleteButton" class="hidden"><a id="addressDeleteButton">Delete</a></div> </div> <div class="row"> <div id="address.city"></div> <div id="address.state"></div> <div id="address.zip"></div> </div> <input type="hidden" id="address.id"></input> </div> </div>
target.parentNode.id为我提供了对象父元素而不是addressContainer id,因此不起作用.是否在嵌套元素中使用顶级父级?其他元素将使用相同的代码,因此它必须处理两个div只有一个级别和div有多个.
更新:发现一些优秀的解决方案,谢谢你们.但我有另外一个问题.请参阅上面的代码,我将initialClick布尔值设置为false,然后将其设置为true.我这样做是因为出于某种原因,如果我不这样做,当我去添加弹出DIV,从用于设置弹出按钮的第一次点击触发听者并关闭弹出之前,我有机会做任何事情.这是我解决问题的方法,但这是唯一的方法吗?或者我只是设置听众略有错误?
解决方法
我通常做这样的事情:
$(document).click(function(e) { // hide popup }); $('#popup_div').click(function(e) { e.stopPropagation(); });
这样,弹出窗口中的点击从不传播到文档,因此close函数永远不会触发.