【问题标题】:jquery focusin() and preventing bubblingjquery focusin() 和防止冒泡
【发布时间】:2010-03-16 21:56:48
【问题描述】:

更新 2:

我睡在上面,然后编写了一些示例代码来尝试进一步找出问题所在。

这是一个使用 firebug 的 console.log 的示例,向您展示哪个对象触发了 focusin 事件:

http://jsbin.com/axefo3/11

1) 点击第一个链接:黄色 div 显示 2)点击tab键:它应该进入黄色div内的链接

它这样做了,但随后它触发了 focusin 事件,并且由于某种原因,它似乎再次冒泡到红色 div,然后被告知关闭黄色 div。

即使在我告诉黄色 div 不传播焦点事件之后也是如此:

$('#innerDiv').focusin(function(e){e.stopPropagation()});

然后我尝试仅在我关注内部 div 之后将 focusin 事件附加到父 div 上。

http://jsbin.com/axefo3/16

发生的情况是,在内部 div 中的第一个链接上切换确实会在父 div 上设置 focusin 事件。这很好!但是,然后在 innerdiv 中跳到下一个链接会再次冒泡 focusin 事件,从而关闭 div。

所以,我想我还是被难住了。看来我无法阻止专注于冒泡。想法?理论?

下面是原帖...

=============================

我通过 onclick 事件显示一个 div。如果您单击 div 外部,我想隐藏它。为此,我在正文上绑定了一次单击事件:

$('body').one('click.myDivPopup', function(e) {
    ...close my div...
});  

在 div 本身中,我告诉它不要传播事件,以便在 div 中实际单击不会触发对主体的单击:

$myDiv.click(function(e){e.stopPropagation()});

这可以正常工作。

如果 div 中有一个标签,我也想隐藏 div。

我的想法是,在那种情况下,我可以在 body 上使用 focusin 事件:

$('body').one('focusin.myDivPopup', function(e) {
    ...close my div...
}); 

再次,我不希望事件从 div 本身中冒出来,所以添加了这个:

$myDiv.focusin(function(e){e.preventDefault()});

这不起作用。在 myDiv 中更改元素内的焦点会触发 body 上的 focusin 事件。

这可能是 jQuery 中的错误吗?如果是这样,有没有更好的方法来实现这一点?

更新:

问题似乎是似乎无法确定 DIV 是否失去焦点,因为它永远无法获得焦点。我的解决方案逻辑是查看 ELSE 的焦点是否在 div 之外(因此使用 focusin),但我遇到了 div 中的 focusin 事件似乎通过在身体上触发而冒泡的问题。

目前,我认为我的解决方案是在弹出窗口中添加一个 CLOSE 元素,然后让人们明确触发它。但并不理想,尤其是对于键盘导航。

【问题讨论】:

  • 最终的解决方案是什么(如果有的话)?
  • @MykaEyl 这是不久前的事了。 :) 我相信最终的解决方案是一个设计决定,以确保弹出窗口具有“关闭”链接,可以通过标签进入并激活以关闭 DIV。鼠标用户仍然可以点击 div 之外的任何地方,但键盘用户必须明确选择关闭 div。

标签: jquery event-bubbling focusin


【解决方案1】:

显示 2 个 div 不是更容易吗?一个覆盖整个页面的透明(不可见)div 和您真正想要显示的另一个。那么你只需要设置z-index正确的body

然后为不可见的 div 注册单击事件,并在单击时将两者都删除。完成的。至少这是大多数人的方式,例如我猜模态对话框 jquery 插件可以工作

演示http://jsbin.com/uzoyo/3

【讨论】:

  • 不确定是否更容易,但这是一个选择。不过,不确定 div 是否能获得焦点。
  • 适用于点击,但不能跳出。在您的示例中,显示 div,然后单击文本(使焦点位于 div 内),然后按 TAB 以从 div 中跳出。我需要 div 在两种情况下都消失(单击其他地方或从 div 中跳出)。目标是适应键盘导航。
  • ..聪明!唉,仍然是一种 hack,因为它只是检查 tab 键的按下。我可能只需要最终这样做(参见上面的更新部分)。不过,人们仍然可以通过任何其他方式通过键盘离开 div。
【解决方案2】:

如果你想使用focusin但不使用事件冒泡,为什么不直接使用focus...?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多