【问题标题】:Add event to all elements except the given with jQuery将事件添加到除 jQuery 给定之外的所有元素
【发布时间】:2011-01-29 14:58:16
【问题描述】:

我创建了一个日期选择器,它使用 ajax 填充 id 为 calendarContainer 的元素。当用户单击按钮以调出日历时,我希望用户能够单击屏幕上除日历之外的任何其他位置并将其隐藏。 calendarContainer 位于 dom 的根目录,我已经尝试了所有我能想到的方法来让它工作。

我已经让日历在未点击时消失。但是,当我单击日历时,它也会消失。我只希望日历在未被点击时消失。

这是我尝试过的所有方法。

$(":not(#calendarContainer > table)").live('click', function() { $.Calendar.hide(); });
$(":not(#calendarContainer").live('click', function() { $.Calendar.hide(); });
$(":not(#calendarContainer)").click(function() { $.Calendar.hide(); });
$("body:not(#calendarContainer)").click(function() { $.Calendar.hide(); });
$(":not(#calendarContainer, #calendarData)").live('click', function() { $.Calendar.hide(); });

感谢您的帮助,大都会

【问题讨论】:

    标签: jquery ajax calendar css-selectors


    【解决方案1】:

    你需要选择一些东西。有没有

    $("*:not(#calendarContainer").live('click', function() { $.Calendar.hide(); });
    

    工作?

    【讨论】:

    • 感谢汤姆的帮助。这和以前做的一样。我想如果你这样做 $(":not(#calendarContainer").live('click', function() { $.Calendar.hide(); });,它和 *.是一样的>
    • 我也试过 $("body:not(#calendarContainer)").click(function() { $.Calendar.hide(); });之前,它也在做同样的事情,我认为这和 * 是一样的。
    • 'body:not' 会查找没有该 id 的正文标签。
    【解决方案2】:

    你应该看看点击outside plug in。基本上它所做的是在 body 元素上设置一个点击事件,然后比较事件目标以查看它是否等于您需要的选择器并从那里停止传播。

    【讨论】:

      【解决方案3】:

      您看到这种行为是因为事件冒泡,当您点击日历时,您仍然会点击它的每个父元素,因为它会冒泡。要停止这种情况,您需要停止气泡,如下所示:

      $("body").click(function() { $.Calendar.hide(); });
      
      $("#calendarContainer").click(function(e) {
        e.stopPropagation(); //Stop click from bubbling to the body element
      });
      

      【讨论】:

      • 太棒了!非常感谢尼克。我从来没有完全理解冒泡。我认为这可能是这里的情况,但我并不积极。我了解冒泡是如何在小范围内工作的,但不是在整个 dom 上。你有什么好的冒泡技巧或好的教程吗?
      • @Metropolis - 我认为 Quirksmode 对此有一个不错的解释:quirksmode.org/js/events_order.html 在小规模和大规模方面确实没有什么不同,除非你阻止它们,否则事件只会在 DOM 中一直冒泡。有些事件不会冒泡,或者在某些浏览器中不会冒泡(尽管 jQuery 在大多数情况下会对此进行补偿),所以有一些怪癖,但基本没有什么特别复杂的。
      • 如果我停止传播……那会干扰它之后的任何事件吗?我怎么知道我正在停止什么以及我想继续工作什么?我以前看过那篇关于冒泡的文章,非常好。感谢您的帮助。
      • @Metropolis - stopPropagation() 只会阻止特定点击冒泡到身体上方,它不会影响任何其他事件。在这种情况下,您只是停止了源自 #calendar 内部的点击气泡,没有别的。
      • 啊,这更有意义。我会考虑一下,并确保我理解它。如果我能想到其他任何事情,我会再发表评论。再次感谢尼克
      猜你喜欢
      • 2017-02-05
      • 2013-10-09
      • 2011-07-06
      • 2015-07-25
      • 2015-11-08
      • 2019-04-17
      • 2010-11-05
      • 2014-02-14
      • 1970-01-01
      相关资源
      最近更新 更多