我有一些表单元素 (4),当我填充或选择当前元素时,它必须关注下一个元素,但我正在使用一些 jquery 插件 jquery pikaday和 jquery flexdatalist 我的第一个输入有数据列表, 第二个和第三个元素有日期选择器和 第四个元素有选择列表,我的问题是如何在它们填充或选择时自动聚焦下一个元素?
$(document).ready(function() {
$('.flexdatalist').flexdatalist({
minLength: 0,
searchContain:true,
});
$(document).on('focus', '.checkin, .checkout', function() {
return new Pikaday({
numberOfMonths: 2,
field: this,
format: "DD.MM.YYYY",
minDate: new Date(),
firstDay: 1,
maxDate: new Date(2020, 12, 31),
onSelect: function() {
e = this.getDate();
}
});
});
});
body {
padding: 30px;
}
input,
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
}
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/css/pikaday.min.css" />
<link rel="stylesheet" href="http://cdn.anitur.com.tr/example/flexdatalist/flexdatalist.css" />
</head>
<body>
<div class="container">
<div class="row">
<div class="col-lg-3 col-md-3 col-sm-3">
<input type="text" name="" class='flexdatalist' data-min-length='1' list='languages' name='language' />
<datalist id="languages">
<option value="PHP">PHP</option>
<option value="JavaScript">JavaScript</option>
<option value="Cobol">Cobol</option>
<option value="C#">C#</option>
<option value="C++">C++</option>
<option value="Java">Java</option>
<option value="Pascal">Pascal</option>
<option value="FORTRAN">FORTRAN</option>
<option value="Lisp">Lisp</option>
<option value="Swift">Swift</option>
<option value="ActionScript">ActionScript</option>
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<input type="text" class="checkin" />
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<input type="text" class="checkout" />
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<select name="select" id="select">
<option value="0">Choose</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
</select>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/pikaday.min.js"></script>
<script src="http://cdn.anitur.com.tr/example/flexdatalist/flexdatalist.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>
喜欢三毛
最佳答案
我稍微重新格式化了您的代码,因为关键的 JS 脚本位于底部。这仅适用于焦点上的pikadate
框,我没有详细介绍flexdatalist
。无论如何,您遇到的问题是,在日期选择器的每个焦点上您都分配了新的焦点,因此您会得到 Maximum call stack size exceeded.
('StackOverflow' :) 这不是讽刺吗).因此,在这个关于文档就绪的示例中,每个插件都分别分配给了正确的框。此外,对于主要问题,在分配插件时,将附加函数作为函数传递,该函数将说明如何在关闭此框后选择下一个框。这是通过在分配插件时使用 onClose
属性来实现的。此外,如果您不在此处传递参数,则不会产生问题,因为它已被处理。
您现在可以对 flexdatalist
使用类似的方法,只需在插件文档中找到正确的属性(例如 onClose
用于 pikadate
).
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/css/pikaday.min.css" />
<link rel="stylesheet" href="http://cdn.anitur.com.tr/example/flexdatalist/flexdatalist.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/pikaday.min.js"></script>
<script src="http://cdn.anitur.com.tr/example/flexdatalist/flexdatalist.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('.flexdatalist').flexdatalist({
minLength: 0,
searchContain:true,
select: function () {
$('#checkin').focus();
}
});
var assignPicker = function (id, whenClosed) {
if (typeof whenClosed !== 'function') {
whenClosed = null;
}
return new Pikaday({
numberOfMonths: 2,
field: document.getElementById(id),
format: "DD.MM.YYYY",
minDate: new Date(),
firstDay: 1,
maxDate: new Date(2020, 12, 31),
onSelect: function() {
e = this.getDate();
},
onClose: whenClosed
});
}
assignPicker('checkin', function() {
$('#checkout').focus();
});
assignPicker('checkout', function() {
$('#select').focus();
});
});
</script>
<style>
body {
padding: 30px;
}
input,
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-lg-3 col-md-3 col-sm-3">
<input type="text" name="" class='flexdatalist' data-min-length='1' list='languages' name='language' />
<datalist id="languages">
<option value="PHP">PHP</option>
<option value="JavaScript">JavaScript</option>
<option value="Cobol">Cobol</option>
<option value="C#">C#</option>
<option value="C++">C++</option>
<option value="Java">Java</option>
<option value="Pascal">Pascal</option>
<option value="FORTRAN">FORTRAN</option>
<option value="Lisp">Lisp</option>
<option value="Swift">Swift</option>
<option value="ActionScript">ActionScript</option>
</datalist>
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<input type="text" class="checkin" id="checkin" />
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<input type="text" class="checkout" id="checkout" />
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<select name="select" id="select">
<option value="0">Choose</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
</select>
</div>
</div>
</div>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>
编辑:这是对 flexdatalist
框的一点更新。他们在官方有一些事件documentation ,但不确定它们中的任何一个是否适合这种情况。
例如,您可以像这样使用 change:flexdatalist
:
$('.flexdatalist').flexdatalist({
minLength: 0,
searchContain:true,
}).on('change:flexdatalist', function() {
$('#checkin').focus();
});
但这里的问题,与可能适合您的任何其他事件一样,是插件关闭的传播仅在这些事件之后完成。然后你会在所有插件上获得一个链式关闭命令,因为它们在一系列事件中一个接一个地关闭。这就是这里发生的事情,如果您尝试将焦点功能放在 onSelect
处理程序中,也会发生在 pikadate
插件上。
为了解决这个问题,我宁愿推荐使用另一个插件,它有一个 on-close 处理程序,它只在插件完成所有操作后才传播(至少像 pikadate
那样)。另一种选择是扩展插件,这可能需要更多工作。
关于javascript - 使用日期选择器关注下一个表单元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41801218/