【问题标题】:Avoid loosing focus in children避免孩子注意力不集中
【发布时间】:2015-12-22 18:27:34
【问题描述】:

如果您发现更好的内容,请随时编辑问题标题。


我正在为我的网站编写一个小插件,

var main = document.getElementById("main"),
  fakeInput = document.getElementById("fakeInput"),
  zone = document.getElementById("zone"),
  input = document.getElementById("input");

main.addEventListener("focusin", function() {
  zone.style.display = "block";
});
main.addEventListener("focusout", function() {
  zone.style.display = "none";
});
#main {
  width: 200px;
}
#fakeInput {
  background: blue;
  height: 22px;
}
#zone {
  background-color: red;
  height: 100px;
  text-align: center;
}
click in the blue zone :<br>
<div id="main" tabindex="-1">
  <div id="fakeInput"></div>
  <div id="zone" style="display:none">
    <p>Click in the input :</p>
    <input id="input" type="text" />
  </div>
</div>

当我点击它时,它会打开(太棒了!)。我可以(几乎)在任何地方单击,不会触发“focusout”事件。 几乎,因为输入子项将焦点转移到其父项。

我在这里读到:http://www.quirksmode.org/dom/events/blurfocus.html

聚焦和聚焦

在对焦和模糊的同时触发,但会冒泡

在我的示例中,输入字段的焦点事件似乎永远不会到达其父级。

我正在寻找解决此问题的方法,有什么提示吗?

【问题讨论】:

    标签: javascript events onfocus dom-events


    【解决方案1】:

    focusout 事件被发送到一个元素,或任何元素 在里面,失去焦点。这与 blur 事件不同 它支持检测父元素失去焦点(在 换句话说,它支持事件冒泡)。

    因此这之间是有区别的。

    main.addEventListener("focusin", function() {
      zone.style.display = "block";
    });
    main.addEventListener("focusout", function() {
      zone.style.display = "none";
    });
    

    还有这个。

    main.addEventListener("focus", function() {
      zone.style.display = "block";
    });
    main.addEventListener("blur", function() {
      zone.style.display = "none";
    });
    

    看到这个JSFiddle

    【讨论】:

    • 在您的 JSFiddle 中,当我单击蓝色区域然后输入时,它仍然失去焦点(红色区域消失)。只有我吗?
    【解决方案2】:

    在我的示例中,输入字段的焦点事件似乎永远不会到达其父级。

    事实上确实如此。尝试添加一些调试:

    main.addEventListener("focusin", function(event) {
      console.log('focusin', event.target)
      zone.style.display = "block";
    });
    main.addEventListener("focusout", function(event) {
      console.log('focusout', event.target)
      zone.style.display = "none";
    });
    

    你会看到

    【讨论】:

    • 当我点击蓝色区域然后输入时,控制台中只有focusin+main和focusout+main
    • 你的浏览器是什么?操作系统?
    • windows 7 和 chrome 已更新
    • 嗯,在windows下确实不行。无论如何,FF 不支持 focusin/focusout 事件。如果您需要跨浏览器解决方案,最好使用焦点/模糊事件。试试这个:jsfiddle.net/bbopjftp/2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2013-09-10
    • 2013-11-12
    • 2016-12-21
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多