我做了OTP的设计。因此,我有6个输入,每次用户输入一个数字,它将自动进入下一个输入。我已经做了下面的代码,但.select()并不适用于移动电话。有人能帮我吗?
Codepen: https://codepen.io/aceraven777/pen/wvmbadQ
<div class="otp-group">
<div class="otp-digit otp-digit-1">
<input type="text" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-2">
<input type="text" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-3">
<input type="text" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-4">
<input type="text" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-5">
<input type="text" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-6">
<input type="text" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
</div>JS
$('.otp-digit').each(function() {
var $otp_digit = $(this);
var $input = $otp_digit.find('input');
$input.attr('maxlength', 1);
$input.attr('pattern', '\\d*');
$input.on('keyup', function(e) {
var $input = $(this);
var $otp_digit = $input.closest('.otp-digit');
var $prev_otp_digit = $otp_digit.prev();
var $next_otp_digit = $otp_digit.next();
// Backspace or left arrow key
if (e.keyCode === 8 || e.keyCode === 37) {
if ($prev_otp_digit.length && $prev_otp_digit.hasClass('otp-digit')) {
$prev_otp_digit.find('input').select().focus();
}
}
// Right arrow and numbers
else if (e.keyCode === 39 || (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105)) {
if ($next_otp_digit.length && $next_otp_digit.hasClass('otp-digit')) {
$next_otp_digit.find('input').select().focus();
}
}
// Backspace
if (e.keyCode === 8) {
$input.val('');
}
else if ((e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105)) {
var characterCode = ((96 <= e.keyCode && e.keyCode <= 105)? e.keyCode - 48 : e.keyCode);
$input.val(String.fromCharCode(characterCode));
} else {
return false;
}
});
$input.on('keypress', function(e) {
var keyCode = e.keyCode || e.which;
// Allow only typing numbers
if (keyCode >= 48 && keyCode <= 57) {
return true;
}
return false;
});
$input.on("change",function(e) {
var $this = $(this);
var input_value = $this.val().replace(/[^0-9]/gi, '');
$this.val(input_value);
var $form = $this.closest('.gigya-otp-login-form');
var $inputs = $form.find('.otp-digit input');
var otp_code = '';
$inputs.each(function() {
otp_code += $(this).val();
});
});
$input.on("cut copy paste",function(e) {
e.preventDefault();
});
});如果jQuery .select()或将其分割成多个输入是不可能的,也许有人可以给我另一个解决方案。
发布于 2022-08-28 08:35:51
我分叉了您的代码这里并做了一些更改。以下是这些变化:
JS没有变化。
<div class="otp-group">
<div class="otp-digit otp-digit-1">
<input type="number" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-2">
<input type="number" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-3">
<input type="number" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-4">
<input type="number" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-5">
<input type="number" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
<div class="otp-digit otp-digit-6">
<input type="number" class="input-text" autocomplete="on" aria-label="-" placeholder="-" aria-required="false" maxlength="1" pattern="\d*">
</div>
</div>额外CSS
/* Add CSS to hide number arrows */
/* Chrome, Safari, Edge, Opera */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
/* Firefox */
input[type=number] {
-moz-appearance: textfield;
}通过进行这些更改,我的移动设备开始显示数字键盘,而不是完整的键盘,这是OTP输入的一个更好的UX,您的代码已经注意到只允许数字输入,所以这是一种双赢。
我不喜欢箭头键,所以我用CSS将它们隐藏起来。我不确定这个CSS是否适用于iOS设备,因为您可能知道safari不支持CSS中的很多东西。
还有沃拉!它开始在我的手机上工作。
https://stackoverflow.com/questions/73484310
复制相似问题