3

我试图在单击 div 时将一些 html 附加到页面,然后当单击页面的任何其他部分时(新附加的 div 和单击附加它的 div 除外)删除附加的 div。出于某种原因,我的:not()选择器没有像我期望的那样工作。

 $("*").on("click", "body:not(._tlh_dropdown, ._tlh_dropdown_content)", function () {
   // ... remove previously attached div
});

http://jsfiddle.net/qUHAB/5/

_tlh_dropdown当单击除两个类和之外的任何内容时,如何删除此 div _tlh_dropdown_content

4

1 回答 1

4

好:

$("*").on("click", "body:not(._tlh_dropdown, ._tlh_dropdown_content)", function () {

几乎可以肯定不是你想要的。这为页面上的每个元素添加了一个事件处理程序,要求它检查来自 的事件<body>是否已冒泡。这有点没有意义。

$("body").on("click", "*:not(._tlh_dropdown, ._tlh_dropdown_content)", function () {

您的测试页会有问题,因为<body>除了您的标题之外没有其他内容。

将其更改为上面的第二件事(就像在您的原始问题中一样),然后在其中的内容之后添加一个<div>带有一些文本的内容,然后单击该内容。或者,将其更改为:

$(document).on("click", "*:not(._tlh_dropdown, ._tlh_dropdown_content)", function () {

这将捕获从<body>.

编辑——如果你使用$(document),它也是一个好主意(特别是如果你希望它工作:-) 向处理函数添加一个“事件”参数,并在每个函数中调用

event.stopPropagation();

在第一个事件处理程序(打开额外内容的那个)中,当标题上的“单击”冒泡到正文时,这将阻止第二个处理程序运行。对于第二个处理程序,停止传播并不那么重要,但它会避免重复尝试关闭添加的内容。

再编辑一些——见下面的评论;“关闭”处理程序有一些微妙之处,使得使用“开启”选择器方法实现它有点问题。

于 2013-07-16T19:15:03.610 回答