jquery focusin()并防止冒泡

时间:2010-03-16 21:56:48

标签: jquery event-bubbling focusin

更新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()});

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

http://jsbin.com/axefo3/16

对于内部div中的第一个链接的标签,确实会在父div上设置focusin事件。这很好!但随后tabd到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。

我的想法是,在那种情况下,我可以在身体上使用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中焦点事件的问题,似乎通过触发它在身体上冒出来。

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

2 个答案:

答案 0 :(得分:0)

显示2个div会不会更容易。一个透明(不可见)div覆盖整个页面,另一个你真正想要显示。然后你只需要设置z-index正确的身体< invisblediv< contentdiv。

然后为不可见的div注册click事件,单击时删除两者。成品。至少这是大多数例如模式对话框jquery插件工作我想

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

答案 1 :(得分:0)

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