- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个帮助消息,当用户单击切换按钮以显示帮助消息或通过单击页面上的其他位置来单击离开时,该帮助消息将消失。解决方案似乎是查看 onblur
事件的 relatedTarget
属性,并防止 onblur
处理程序在 relatedTarget
是切换帮助信息的按钮。这似乎在 Chrome 中有效,但在 Firefox 和 Safari 中,relatedTarget
属性设置为容器 div
而不是按钮,这使得无法区分切换按钮点击和“点击离开”。
我创建了一个简单的演示程序来说明问题:
let openState = false;
let contentDiv = document.getElementById("show-hide-content");
let accordionDiv = document.getElementById("accordion");
let showHideButton = document.getElementById("show-hide-toggle");
function setOpenState(state) {
openState = state;
if(openState) {
contentDiv.style.visibility = "visible";
contentDiv.focus();
}
else {
contentDiv.style.visibility = "hidden";
}
}
function toggleVisibility(override) {
if (typeof override === "boolean") {
setOpenState(override);
}
else {
setOpenState(!openState);
}
}
function buttonClickHandler(event) {
toggleVisibility();
}
function contentBlurHandler(event) {
if(!accordionDiv.contains(event.relatedTarget)) {
toggleVisibility(false);
}
}
showHideButton.onclick = buttonClickHandler;
contentDiv.onblur = contentBlurHandler;
.parent {
display: flex;
width: 100vw;
height: 100vh;
flex-direction: row;
background-color: #409958;
}
.accordion {
background-color: #28a7c9;
}
.show-hide-content {
visibility: hidden;
background-color: #c91e63;
}
<h1>Show/Hide Test</h1>
<div class="parent">
<div class="drawer">
<div class="accordion" id="accordion">
<button class="show-hide-toggle" id="show-hide-toggle">Show/Hide</button>
<div class="show-hide-content" id="show-hide-content" tabindex="-1">
<p>This is some content that should be shown or hidden depending on the toggle.</p>
</div>
</div>
<div class="spacer">
</div>
</div>
</div>
此代码在 Chrome 中正常工作。但是,在 Firefox 中,单击“显示/隐藏”按钮会显示隐藏的内容,但再次单击该按钮时不会隐藏它。据我所知,这是因为 onblur
处理程序隐藏了 div,然后 onclick
处理程序再次打开它,即使我正在检查 onblur.relatedTarget
以确保它不在抽屉内的任何地方。
在 Firefox 中检测点击离开的正确方法是什么?
最佳答案
问题是 clicking the <button>
doesn't focus it on some browser/OS combinations (特别是在 macOS 上,Chrome 除外),所以 onblur
的 event.relatedTarget
是null
因为页面上没有任何内容获得焦点。如果您从 <div id="show-hide-content">
按下 SHIFT+TAB ,你会看到 relatedTarget
设置如您所愿,因为按钮在这种情况下确实获得了焦点。
我会运行代码来隐藏 div 一个小的超时,给 click
处理程序有机会首先运行。
在下面的示例中,我实现了这个建议并添加了一些日志记录,以便更容易查看发生了什么:
let openState = false;
let contentDiv = document.getElementById("show-hide-content");
let accordionDiv = document.getElementById("accordion");
let showHideButton = document.getElementById("show-hide-toggle");
function setOpenState(state) {
openState = state;
if(openState) {
contentDiv.style.visibility = "visible";
contentDiv.focus();
}
else {
contentDiv.style.visibility = "hidden";
}
}
function buttonClickHandler(event) {
console.log("click, setting openState to", !openState);
setOpenState(!openState);
}
function contentBlurHandler(event) {
console.log("blur, relatedTarget is", event.relatedTarget);
setTimeout(function() {
console.log("blur, after timeout, openState is", openState);
setOpenState(false);
}, 100);
}
showHideButton.onclick = buttonClickHandler;
showHideButton.onmousedown = function() {console.log("button mousedown"); };
contentDiv.onblur = contentBlurHandler;
showHideButton.onfocus = function(ev) { console.log("button onfocus"); }
.parent {
display: flex;
width: 100vw;
height: 100vh;
flex-direction: row;
background-color: #409958;
}
.accordion {
background-color: #28a7c9;
}
.show-hide-content {
visibility: hidden;
background-color: #c91e63;
}
<h1>Show/Hide Test</h1>
<div class="parent">
<div class="drawer">
<div class="accordion" id="accordion">
<button class="show-hide-toggle" id="show-hide-toggle">Show/Hide</button>
<div class="show-hide-content" id="show-hide-content" tabindex="-1">
<p>This is some content that should be shown or hidden depending on the toggle.</p>
</div>
</div>
<div class="spacer">
</div>
</div>
</div>
关于javascript - 调用 onBlur 时 relatedTarget 在 Firefox 中为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57695377/
$('#lPass').focus(function() { if (this.value == this.defaultValue) this.value = '';
我有一个容器 div,里面包含许多输入和复选框,我想仅在容器 div 失去焦点时触发 onBlur 事件,而不是每次其中的任何元素失去焦点时触发 onBlur 事件 最佳答案 react docume
我的表单检查不起作用。如果我将别名字段留空,它将返回已填充的名称字段。 var alias = document.getElementById("alias"); var name = documen
我有一个包含 5 个字段和一个提交按钮的表单。在其中一个字段上,我有一个 onblur 事件,但如果用户更改该文本框中的值并直接单击提交按钮,那么在这种情况下 onblur 不会被触发或不起作用。在这
我正在尝试创建一个函数,允许编辑 div,并且当不再聚焦时(例如单击元素外部),它应该执行一个函数。 当用 fiddle 测试这个时,预期的响应不会发生。相反,当单击该元素时,它既使内容可编辑,又同时
我有一个带有 React-InstantSearch: 的导航栏为我提供了自动完成功能,有一个 onChange触发显示建议框的事件。还有一个onBlur当您离开搜索框并隐藏该框时触发的事件。这个o
我有两个输入,它们是 的一部分。我试图在其中之一发生更改(dpFin)后获取输入的值。问题是,当我使用 var endDt = document.getElementById("dpFin").va
我有一个默认情况下禁用的文本框... onclick 可以工作并使其能够输入,但是当我单击单选按钮时...它不会再次禁用该文本框 有什么线索吗? 提前致谢 李 最佳答案 没有“启用”属性。您必须将
我正在使用 JavaScript 对 HTML 表单进行验证。为什么刷新页面时Validator.validateInput会执行? 我希望它在模糊元素“first”时执行。 var Validato
当使用 jQuery 将文本输入到文本框时,我尝试编辑选择输入的内容。这是我的文本框 这是我的多重选择框 Yazılımevi 这是我的 javascript 函数(我知道这很简单) func
我有一个使用 jquery form validator 的表单:我的问题是如何让验证不仅在提交时触发,而且在模糊时触发?我希望它验证模糊时的每个单独字段(而不是模糊时的整个表单,因为我不希望为尚未向
我有以下代码,也称为内联代码,如下所示。问题是警报永远不会触发。在 Firebug 中,我可以看到数据充满了我的对象,但仍然没有触发警报。有什么想法吗? function update(s_arriv
如何在 javascript onblur 中为文本框中输入的所有值添加前缀 - 符号 最佳答案 首先,您需要添加事件处理程序。一旦你这样做了,这就是你的功能: function textBoxBlu
我正在使用 onblur 事件来获取日期选择器中的日期值。这是我的控件: 这是我的功能: function UpdatePrice(_this) { console.log(_this.va
我有一个表格,其中包含许多用户可以为其赋值的文本输入字段。我的目标是,如果用户“onBlur”的any 字段,则将激活一个功能。我可以通过单独标记每个单元格来解决这个问题,但它会非常重复,我相信有更有
我正在使用 onblur 进行文本框数据检查。 OnBlur 工作正常,直到或除非我们不按 ALT + TAB 或 Windows 按钮。 如果我按下 ALT + TAB 然后模糊函数执行多次.. 例
HTML It is a div which has a dark future Not Remove 和脚本 $(function(){ $("input").blur(function(
我在 jquery 的 blur 和 onblur 事件上遇到了陌生人问题。当您对输入进行模糊处理时,首先执行 onblur 事件和 .blur 方法。但是,当您通过点击 anchor 标记来调用触发
我正在使用 jQuery 将一个输入字段的值复制到另一个模糊的输入字段。这是我的代码: $( "input[id$=token-input-search_field]" ).blur( functio
我有一个应用程序,我需要更新数字,为此,我计划如下,当我单击数字容器时,我将其转换为 jquery 的输入字段,然后在模糊时我想将其关闭为容器div内的纯文本,然后触发ajax在数据库中更新它,但第一
我是一名优秀的程序员,十分优秀!