【问题标题】:blur event.relatedTarget returns nullblur event.relatedTarget 返回 null
【发布时间】:2017-08-03 12:28:47
【问题描述】:

我有一个<input type="text"> 字段,当该字段失去焦点时我需要清除它(这意味着用户单击了页面上的某个位置)。但有一个例外。用户单击特定元素时不应清除输入文本字段。

我尝试使用event.relatedTarget 来检测用户是否不仅点击了某处,还点击了我的特定<div>

但是,正如您在下面的 sn-p 中看到的,它根本不起作用。 event.relatedTarget 总是返回 null

function lose_focus(event) {
  if(event.relatedTarget === null) {
    document.getElementById('text-field').value = '';
  }
}
.special {
  width: 200px;
  height: 100px;
  background: #ccc;
  border: 1px solid #000;
  margin: 25px 0;
  padding: 15px;
}
.special:hover {
  cursor: pointer;
}
<input id="text-field" type="text" onblur="lose_focus(event)" placeholder="Type something...">

<div class="special">Clicking here should not cause clearing!</div>

【问题讨论】:

    标签: javascript events onblur lost-focus focusout


    【解决方案1】:

    简答:tabindex="0" 属性添加到应出现在event.relatedTarget 中的元素。

    解释: event.relatedTarget 包含一个获得焦点的元素。问题是您的 特定 div 无法获得焦点,因为浏览器认为该元素不是按钮/字段或某种控制元素。

    以下是默认可以获得焦点的元素:

    • 指定了href 属性的&lt;a&gt; 元素
    • 指定了href 属性的&lt;link&gt; 元素
    • &lt;button&gt;元素
    • &lt;input&gt; 不是 hidden 的元素
    • &lt;select&gt;元素
    • &lt;textarea&gt;元素
    • &lt;menuitem&gt;元素
    • 属性为draggable的元素
    • 指定了controls 属性的&lt;audio&gt;&lt;video&gt; 元素

    所以当onblur 发生时,event.relatedTarget 将包含上述元素。 所有其他元素都不会被计算在内,点击它们会将null 放入event.relatedTarget

    但是可以改变这种行为。您可以使用 tabindex 属性将 DOM 元素“标记”为可以获得焦点的元素。标准是这样说的:

    tabindex 内容属性允许作者指出一个元素应该是可聚焦的,是否应该使用顺序焦点导航来访问它,并且可以选择建议元素在顺序焦点导航顺序中出现的位置。

    所以这里是修正后的代码 sn-p:

    function lose_focus(event) {
      if(event.relatedTarget === null) {
        document.getElementById('text-field').value = '';
      }
    }
    .special {
      width: 200px;
      height: 100px;
      background: #ccc;
      border: 1px solid #000;
      margin: 25px 0;
      padding: 15px;
    }
    .special:hover {
      cursor: pointer;
    }
    <input id="text-field" type="text" onblur="lose_focus(event)" placeholder="Type something...">
    
    <div tabindex="0" class="special">Clicking here should not cause clearing!</div>

    【讨论】:

    • 请注意,在 macOS/iOS 上的 Safari/Firefox 中,某些表单控件 (at least &lt;button&gt;) 在单击时不会聚焦。
    • 将其设置为 0 会将其添加到键盘选项卡列表中,这可能是不可取的。请改用 -1 来防止这种情况发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2020-06-19
    • 2011-10-15
    相关资源
    最近更新 更多