javascript - 模糊事件.relatedTarget 返回 null

标签 javascript events onblur lost-focus focusout

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

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

但是,正如您在下面的代码片段中看到的,它根本不起作用。 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>

最佳答案

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

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

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

  • <a> elements with href attribute specified
  • <link> elements with href attribute specified
  • <button> elements
  • <input> elements that are not hidden
  • <select> elements
  • <textarea> elements
  • <menuitem> elements
  • elements with attribue draggable
  • <audio> and <video> elements with controls attribute specified

所以event.relatedTargetonblur 时将包含以上元素发生。 所有其他元素将不被计算在内,点击它们将放置 nullevent.relatedTarget .

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

The tabindex content attribute allows authors to indicate that an element is supposed to be focusable, whether it is supposed to be reachable using sequential focus navigation and, optionally, to suggest where in the sequential focus navigation order the element appears.

这是更正后的代码片段:

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>

关于javascript - 模糊事件.relatedTarget 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42764494/

相关文章:

html - 如何防止默认 Css 滚动 onclick 并仅允许 javascript 事件?

javascript - 已编辑的 html 元素的值

javascript - 在 d3.js 中对同一数据集实现多个过滤器

c# - 选择不在 C# 程序中使用委托(delegate)

javascript - 如何从具有 css 过滤器的 html 创建图像或 pdf?

powershell - 如果我在 powershell 脚本中使用 System.Windows.Forms,则使用 System.Net.WebClient 异步上传文件的 Register-ObjectEvent 将停止工作

javascript - OnBlur 验证需要在纯 Javascript 中单击两次提交按钮

javascript - 当文本区域/输入模糊/失去焦点时仍然显示 div

javascript - 谷歌金融 api 从 6/september/2017 开始不工作

javascript - 将 Javascript 正则表达式结果转换为字符串(?)