focusout 在 focus() 之后立即发生
focusout happening immediately after focus()
我正在创建 'typeform like' 表单,一次滚动一个输入元素。
name -> email -> phone -> address -> note
(codepen here)
使用下面的代码,我遇到的情况是在输入 phone
的值并按回车键后,address
被跳过。流量直达note
.
原因是 focusout
事件在 input#address.input-box
上的 target.find(".input-box").focus()
之后立即被触发。
我不明白是什么导致 focusout
被解雇。
谁能解释一下? (以及如何阻止它发生)。
目的是让 phone
元素在用户在移动设备上输入内容后滚动。例如,在 iOS 上,phone 条目没有回车键,只有 'Done'.
我使用 focusout
因为它是在按下 'Done' 时触发的事件。但它被广泛使用,无法正常使用。
有没有更好的方法来实现预期的行为?
HTML:
<!-- ... -->
<div class="flex-container">
<form novalidate="">
<div class="input-block flex-item" id="input-block-name" style="display: inherit;">
<div class="label">name</div><input class="input-box" type="text" id="name">
</div>
<div class="input-block flex-item" id="input-block-email" style="display: none;">
<div class="label">email</div><input class="input-box" type="email" id="email">
</div>
<div class="input-block flex-item" id="input-block-phone" style="display: none;">
<div class="label">mobile</div><input class="input-box" type="tel" id="phone">
</div>
<div class="input-block flex-item" id="input-block-address" style="display: none;">
<div class="label">address</div><input class="input-box" type="text" id="address">
</div>
<div class="input-block flex-item" id="input-block-note" style="display: none;">
<div class="label">note</div><input class="input-box" type="text" id="note">
</div>
<!-- ... -->
</form>
<!-- ... -->
JS:
$(".input-box").first().focus();
$(".input-block")
.not($(document.activeElement.parentElement))
.css({ display: "none" });
$(window).on(
"keyup wheel focusout",
_.debounce((event) => {
var current = $(":visible").closest(".input-block");
// next
if (
event.key === "Enter" ||
event.originalEvent.deltaY > 0 ||
(event.type == "focusout" && event.target == $("#phone")[0])
) {
var target = $(":visible").closest(".input-block").next();
target.css({ display: "inherit" });
target.find(".input-box").focus();
current.css({ display: "none" });
}
// prev
if (event.originalEvent.deltaY < 0) {
var target = $(":visible").closest(".input-block").prev();
target.css({ display: "inherit" });
target.find(".input-box").focus();
current.css({ display: "none" });
}
}, 30)
);
编辑:在第一次回复后完善了问题。
OP 编辑:'solved' 问题是使用 blur
事件(见评论)。
我认为您的问题出在这一行(在 if 条件下):
(event.type == "focusout" && event.target == $("#phone")[0])
每次滚动都会有一个来自上一个输入的 'focusout' 类型。当您从 phone 滚动到地址时,phone 输入框的类型为 'focusout' 并且上面引用的代码条件为真,因此条件的结果发生两次。
完全删除上面引用的行应该可以解决您的问题。
我正在创建 'typeform like' 表单,一次滚动一个输入元素。
name -> email -> phone -> address -> note
(codepen here)
使用下面的代码,我遇到的情况是在输入 phone
的值并按回车键后,address
被跳过。流量直达note
.
原因是 focusout
事件在 input#address.input-box
上的 target.find(".input-box").focus()
之后立即被触发。
我不明白是什么导致 focusout
被解雇。
谁能解释一下? (以及如何阻止它发生)。
目的是让 phone
元素在用户在移动设备上输入内容后滚动。例如,在 iOS 上,phone 条目没有回车键,只有 'Done'.
我使用 focusout
因为它是在按下 'Done' 时触发的事件。但它被广泛使用,无法正常使用。
有没有更好的方法来实现预期的行为?
HTML:
<!-- ... -->
<div class="flex-container">
<form novalidate="">
<div class="input-block flex-item" id="input-block-name" style="display: inherit;">
<div class="label">name</div><input class="input-box" type="text" id="name">
</div>
<div class="input-block flex-item" id="input-block-email" style="display: none;">
<div class="label">email</div><input class="input-box" type="email" id="email">
</div>
<div class="input-block flex-item" id="input-block-phone" style="display: none;">
<div class="label">mobile</div><input class="input-box" type="tel" id="phone">
</div>
<div class="input-block flex-item" id="input-block-address" style="display: none;">
<div class="label">address</div><input class="input-box" type="text" id="address">
</div>
<div class="input-block flex-item" id="input-block-note" style="display: none;">
<div class="label">note</div><input class="input-box" type="text" id="note">
</div>
<!-- ... -->
</form>
<!-- ... -->
JS:
$(".input-box").first().focus();
$(".input-block")
.not($(document.activeElement.parentElement))
.css({ display: "none" });
$(window).on(
"keyup wheel focusout",
_.debounce((event) => {
var current = $(":visible").closest(".input-block");
// next
if (
event.key === "Enter" ||
event.originalEvent.deltaY > 0 ||
(event.type == "focusout" && event.target == $("#phone")[0])
) {
var target = $(":visible").closest(".input-block").next();
target.css({ display: "inherit" });
target.find(".input-box").focus();
current.css({ display: "none" });
}
// prev
if (event.originalEvent.deltaY < 0) {
var target = $(":visible").closest(".input-block").prev();
target.css({ display: "inherit" });
target.find(".input-box").focus();
current.css({ display: "none" });
}
}, 30)
);
编辑:在第一次回复后完善了问题。
OP 编辑:'solved' 问题是使用 blur
事件(见评论)。
我认为您的问题出在这一行(在 if 条件下):
(event.type == "focusout" && event.target == $("#phone")[0])
每次滚动都会有一个来自上一个输入的 'focusout' 类型。当您从 phone 滚动到地址时,phone 输入框的类型为 'focusout' 并且上面引用的代码条件为真,因此条件的结果发生两次。
完全删除上面引用的行应该可以解决您的问题。