当前位置: 首页 > 知识库问答 >
问题:

选项卡不会触发focusout事件[JS,HTML]

倪德业
2023-03-14

我有一个弹出列表,建议搜索结果有点像在谷歌上搜索。我有2个事件监听器,应该显示和隐藏弹出窗口,如果你点击该地区。它适用于点击,但如果你试图用标签导航,它只会让它永远打开。

使用选项卡导航时,如何使focusout事件发生?

js prettyprint-override">var popup2 = document.querySelector(".suggest-pop-up.s2");

document.getElementById('tags').addEventListener('focusout', e => {
  if (!popup2.contains(e.relatedTarget)) {
    popup2.style.display = "none";
    popup2.style.pointerEvents = "none";
  }
});
document.getElementById('tags').addEventListener('focusin', e => {
  if (!popup2.contains(e.relatedTarget)) {
    popup2.style.display = "block";
    popup2.style.pointerEvents = "all";
  }
});
<input id="tags" type="text" class="suggest s2" name="tags" required="required" autocomplete="off">
<div class="suggest-pop-up s2" style="display: block; pointer-events: all;">
  <div class="suggest-box s2">
    <li tabindex="0">#THING 1</li>
    <li tabindex="0">#THING 2</li>
  </div>
</div>

<br><div>I want #THING 1 and #THING 2 to appear on 1. tab press, then to be selectable while on any of the <li> and then to go away when tabing to the next element outside suggest-box s2.</div>

共有3个答案

嵇昱
2023-03-14

某事是错误的:

if (!popup2.contains(e.relatedTarget)) {
翟俊远
2023-03-14

我没有太多的时间,所以我给你留下这个,尝试使用这个变量的标签导航

// check for focus
var isFocused = (document.activeElement === popup2);
alert(isFocused); // will come out false if not focused
许俊贤
2023-03-14

当它离开时,你只有一次可以将焦点移出,所以更好的方法可能是在身体上委派一个事件。

下面是一个在body标记上使用委托事件的示例,然后它使用最近来查看它是否是任何项,如果是的话,它不会崩溃。

const popup2 = document.querySelector(".suggest-pop-up.s2");

document.body.addEventListener('focusout', e => {
  if (e.relatedTarget && e.relatedTarget.closest('.suggest-pop-up')) return;
  popup2.style.display = "none";
  popup2.style.pointerEvents = "none";
}); 

document.getElementById('tags').addEventListener('focusin', e => {
  popup2.style.display = "block";
  popup2.style.pointerEvents = "all";
});
html lang-html prettyprint-override"><input id="tags" type="text" class="suggest s2" name="tags" required="required" autocomplete="off">
<div class="suggest-pop-up s2" style="display: none; pointer-events: all;">
  <div class="suggest-box s2">
    <li tabindex="0">#THING 1</li>
    <li tabindex="0">#THING 2</li>
  </div>
</div>
  
<div>
  <input/>
</div>
 类似资料:
  • 用户可以从datalist或can类型中选择一个项目,输入它自己的值。我通过JSON调用PHP脚本连接到数据库,以填充表单其余部分的其他信息。我希望当用户在列表输入中键入名称时(因此当内容模糊时),或者当用户单击DataList中的某个选项时,这会触发。 使用当输入失去焦点时会触发该函数,但当从数据列表中选择一项时,它也会等待“直到输入失去焦点,我希望事件立即触发” 使用单击datalist中的一

  • 问题内容: 对于jQuery,这是一个非常奇怪的问题。我正在加载一个div 页面加载。每条记录都是表格数据,并带有与之关联的“删除” ajax函数。当页面加载并单击“删除”链接时,ajax调用会触发。但是,一旦触发事件,就会从ajax调用返回数据,并且div中会填充数据(但页面不会刷新或重新加载)。当我再次单击链接时,ajax脚本将不会触发。这是我的代码: 问题答案: 当您删除元素然后通过java

  • 触发AWS Lambda函数时遇到问题。 当我单击Test时,该函数工作得非常好,但我创建了一个新的计划规则,该规则每分钟触发Lambda函数。它工作一次,然后再也不会工作了。我还尝试使用Cron,结果相同。 日志应输出打印功能,但它们会读取以下内容: 我单击了“CloudWatch Events将为目标添加必要的权限,以便在触发此规则时调用它们”,所以我怀疑我的权限不是问题。 顺便说一句,我已经

  • 我想在点击某个div(“.checker”)后触发点击输入事件。换句话说,点击'.checker'将模拟点击复选框上的点击事件,远程检查它。 我写的代码可以工作,但click只有在第二次单击后才触发,第一次单击失败时才触发。这种情况甚至不会发生在'.checker'上,也会发生在checkbox上。 下面的所有HTML都包装在jquery折叠菜单中。单击“H3”后,“.sub-tree-wrap”

  • 描述 (Description) JavaScript事件可当你用的窗格的JavaScript代码的工作中使用。 例子 (Example) 下面的例子演示了如何使用JavaScript事件在Framework7选项卡 - <!DOCTYPE html> <html> <head> <meta name = "viewport" content = "width = device-

  • 使用mui.trigger()方法可以动态触发特定DOM元素上的事件。 .trigger( element , event , data ) element Type: Element 触发事件的DOM元素 event Type: String 事件名字,例如:'tap'、'swipeleft' data Type: Object 需要传递给事件的业务参数 示例 自动触发按钮的点击事件: var