Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当用户快速键入时,焦点跳过_Javascript_Html - Fatal编程技术网

Javascript 当用户快速键入时,焦点跳过

Javascript 当用户快速键入时,焦点跳过,javascript,html,Javascript,Html,我一直在网页上输入日期。我将日期作为三个输入字段。计划是在第一个字段中键入两个字符后,焦点自动转到下一个字段,并选择该字段中的所有文本。在该字段中键入两位数字后,下一个字段将自动聚焦。我使用onkeyup上的javascript函数实现了这一点。HTML为(日期为日-月-年格式): 这一切都可以在正常的打字速度下正常工作。如果字段中已经填充了一些数据,并且用户在第一个字段中快速键入2个不同的字符,则光标将跳转到第三个字段,而不是在第二个字段中:-( 当要指定焦点的字段为空或只有1个字符时,不会发

我一直在网页上输入日期。我将日期作为三个输入字段。计划是在第一个字段中键入两个字符后,焦点自动转到下一个字段,并选择该字段中的所有文本。在该字段中键入两位数字后,下一个字段将自动聚焦。我使用onkeyup上的javascript函数实现了这一点。HTML为(日期为日-月-年格式):

这一切都可以在正常的打字速度下正常工作。如果字段中已经填充了一些数据,并且用户在第一个字段中快速键入2个不同的字符,则光标将跳转到第三个字段,而不是在第二个字段中:-(

当要指定焦点的字段为空或只有1个字符时,不会发生这种情况,只有当字段中已经有maxlength字符时才会发生这种情况

我很确定这是因为当用户按下第二个键时,第一个键还没有发生按键事件。我这样说是因为如果您在第一个字段中尽快键入两个相同的字符,问题就不会发生(如果是同一个物理键,则无法在上一个按键发生之前进行按键操作)

你知道是什么导致了这个问题或者如何避免它吗

告诉用户打字慢一点

我尝试了onkeypress()而不是onkeyup(),但它还有其他问题(主要是CurrentField.value不会更新以反映刚刚按下的键,因此长度不会给出任何相关信息)

谢谢您的帮助。

试试这个

新链接

/
/
$('.date').keyup(函数(e){
if($(this.val().length==2&&$(this.hasClass('dirty')){
$(this.removeClass('dirty');
$(this).next().removeClass('dirty').select();
}
}).keydown(功能(e){
$(this.addClass('dirty');
})

如果我在关注下一个字段之前重置该字段的值,则对我们有效

var next=document.getElementById(idofNext字段);
next.value='';
next.focus();


另一种方法是使用keydown事件和setTimeout来定义值和移动焦点:

HTML:


/
/

JS:

window.checkifieldisfull=函数(e,CurrentField,MaxChars,IDOfNextField){
setTimeout(函数(){
如果(e.keyCode!=9&&CurrentField.value.length>=MaxChars){
var next=document.getElementById(IDOfNextField.id);
next.focus();
}
}, 0);
}


是,清除字段会停止跳过(正如我在文章中所说的,只有在字段中填充了值时才会发生)但是我需要向用户显示该值,这样他们就可以在该字段的值不被更改的情况下对其进行制表。对不起,我没有提到。我会尝试另一种方式。谢谢您的回答,但JSFIDLE上的示例显示了问题行为。在jsfiddle示例中,如果您在字段ie 10 11和2013中键入一些值,请单击在第一个字段中,然后快速键入两个数字(例如1和2,因为键盘上的数字相邻,因此很容易快速键入)您将看到光标已跳到第三个字段而不是第二个字段。如果您单击第一个字段,然后键入1,请暂停一秒钟,然后键入2,光标将转到第二个字段(如预期的那样)。感谢您的帮助。在您的JSFIDLE示例中,您使用的是keypress。keypress有问题-例如,在字段中键入2个数字-光标不会移动到下一个字段。直到您按下第3个字符,光标才会移动。此外,当字段中充满字符时,即使选择了内容,您也会单击字段,并且看起来s就像您可以在中键入一个新值一样,只要键入1个字符,光标就被带到下一个字段。onkeypress事件在字段值更改之前触发,因此长度==2测试返回一种假阳性。这在JSFIDLE中似乎非常有效。我将尽快在我的页面上尝试。谢谢Rodion我在我的页面上尝试了它我的问题解决了,用户很高兴!再次感谢。
    <input id="dobDay" style="width:30px" maxlength="2"
        onkeyup="CheckIfFieldIsFull(event, this, 2, dobMonth)"
        onfocus="this.select();" onmouseup="return false;"
        >
    /
    <input id="dobMonth" style="width:30px;" maxlength="2"
        onkeyup="CheckIfFieldIsFull(event, this, 2, dobYear)"
        onfocus="this.select();" onmouseup="return false;"
        >
    /
    <input id="dobYear" style="width:50px" maxlength="4" 
        onkeyup="CheckIfFieldIsFull(event, this, 4, IdOfNextField)"
        onfocus="this.select();" onmouseup="return false;"
        >
function CheckIfFieldIsFull(e, CurrentField, MaxChars, IDOfNextField) {
  if (e.keyCode != 9 && 
      CurrentField.value.length >= MaxChars)
  {
    document.getElementById(IDOfNextField.id).focus();
  }
}
<input class="date" id="dobDay" style="width:30px" maxlength="2">/
<input class="date" id="dobMonth" style="width:30px;" maxlength="2">/
<input class="date" id="dobYear" style="width:50px" maxlength="4">

$('.date').keyup(function (e) {
if($(this).val().length == 2 && $(this).hasClass('dirty')){
    $(this).removeClass('dirty');
    $(this).next().removeClass('dirty').select();
}
}).keydown(function(e){
    $(this).addClass('dirty');
})