【问题标题】:Blur event is fired on focused parent element if focused element's child is clicked如果单击焦点元素的子元素,则会在焦点父元素上触发模糊事件
【发布时间】:2012-06-22 09:42:47
【问题描述】:

我被这个问题困扰了好几个小时。我需要创建一个表单的一部分,如果你点击一个选择,一个复选框字段应该弹出,如果你再次点击其他任何地方,这个字段应该消失。我想在单击选择后通过聚焦字段来执行此操作,但由于某种原因,我的复选框字段不仅会在您单击其他任何地方时失去焦点,甚至当您单击复选框 INSIDE 的标签时也会失去焦点其中。所以问题是我正在关注一个元素,我在其中单击标签,并且由于某种我无法弄清楚的原因,聚焦的父元素失去了焦点。

代码:http://jsfiddle.net/RELuL/2/

任何帮助表示赞赏!

附:

只是一些额外的问题:) 如您所见,如果您单击选择输入,我的隐藏复选框部分显示得有点晚,它没有立即显示,看起来有点糟糕。任何提示如何优化它?

编辑:我使用 Firefox 13.0.1

【问题讨论】:

  • 那么这个表单是选择还是复选框,为什么要更改它?
  • 这是一个选择,但是如果点击它,它必须弹出这个复选框。这是我必须做的任务,我不同意这种方法,但必须这样做。
  • 愚蠢的问题 - 你为什么要这样做而不是直接使用普通的多选框或那些复选框?不要让它变得过于复杂。
  • 正如我在上一条评论中所说:“这是我必须做的任务,我不同意这种方法,但必须这样做。”
  • @skywlkr 已回答问题并获得奖励 :)

标签: javascript jquery javascript-events


【解决方案1】:

当您单击<label> 时,浏览器会聚焦关联的输入字段。因此焦点离开父级并转到复选框(并调用您的模糊事件处理程序)。

不是聚焦父 div 并依赖它被模糊,而是将点击处理程序附加到文档:

$(document).click(function() {
    multiSelectUpdate();
});

$('.multiselect.container').click(function(event) {
    event.stopPropagation(); // prevent click event from reaching document
});

另外,在 Webkit 中点击 <select> 不会触发点击事件。一种解决方法是改用焦点事件。

Demo

【讨论】:

  • 这是迄今为止最好的解决方案,但是我已经升级了它,只在打开选择框后绑定文档的点击侦听器,关闭后,我取消绑定单击文档中的侦听器,因此每次单击页面上的某个位置时它都不会运行 multiSelectUpdate() 函数。谢谢,赏金即将到来!
【解决方案2】:

好的,两个简单的更改使这个工作首先将选择框上的单击侦听更改为mousedown 侦听器,就像这样。

 $('.multiselector').mousedown(function(event) {
        event.preventDefault();
        currentMulti = $(this).attr('id');
        thisOffset = $(this).offset();
        $(this).hide();
        $('#' + currentMulti + '-container')
            .css('top', thisOffset.top + 'px').show().attr("tabindex", -1).focus();
        $(this).addClass('active');
    });

这会在盒子出现之前触发,因此它永远不会显示。

其次,当孩子获得焦点以修复此更改为 focusout 时,模糊侦听器认为它失去了焦点。

 $('.multiselect.container').focusout(function() {
        multiSelectUpdate();
    });

这仅在选择器失去焦点时触发,即使当前焦点在选择器的子级上。

固定fiddle

享受:)

编辑

由于某种原因,模糊会在 FF 上多次触发,因此要解决此使用问题,而不是使用模糊鼠标离开。

$('.multiselect.container').mouseleave(function() {
        multiSelectUpdate();
    });

【讨论】:

  • 我想接受它作为答案,但正如您所见,您的解决方案不能完美运行,因为如果我在框外单击,容器不会失去焦点,focusout 事件不会触发。
  • @skywlkr 现在尝试似乎我没有更新大声笑,它确实触发了小提琴没有实现 focusout
  • 是的,它现在失去焦点,但在 Firefox 中,如果我点击标签,它仍然失去焦点。你测试什么?因为在 Chrome 上,它可以工作,但它也必须在 FFox 上工作。
  • @skywlkr 我在 chrome 中测试过,是的,在 FF 中,当您单击一个孩子并触发事件时,它会变得模糊,解决方法正在编辑中:)
  • 我非常感谢您在此解决方案中投入的时间和工作,但我必须接受 Jeffrey To 的回答,因为它最接近我想要实现的目标。 Mouseleaving 不是我想在之后触发我的函数的事件:/ 我希望我也能给你一些赏金,但我没有任何:P 但是再次感谢,祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2012-12-07
  • 2022-10-17
  • 2018-12-26
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多