Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.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 在其间执行ajax时粘贴到输入时缺少按键事件_Javascript_Performance_Keypress - Fatal编程技术网

Javascript 在其间执行ajax时粘贴到输入时缺少按键事件

Javascript 在其间执行ajax时粘贴到输入时缺少按键事件,javascript,performance,keypress,Javascript,Performance,Keypress,我想显示一个静态html元素,如果用户开始键入,该元素将更改为输入字段并预先填充键入的文本。基本上,我可以将其用于此类代码(假设visible类切换可见性): 然而,在实际代码中(请参阅测试用例),只有在执行ajax调用(在成功回调中完成)之前,才会填充前缀。然后,在每个字符之后快速键入几个字符,只设置第一个字符,而丢弃其余字符。也许,由于ajax调用介于两者之间,第二个字符永远不会被带到输入中 快速而肮脏的解决方案是不在这一部分组织我的代码:只需在接收输入时直接填充输入 有更好的办法吗?例如,

我想显示一个静态html元素,如果用户开始键入,该元素将更改为输入字段并预先填充键入的文本。基本上,我可以将其用于此类代码(假设visible类切换可见性):

然而,在实际代码中(请参阅测试用例),只有在执行ajax调用(在成功回调中完成)之前,才会填充前缀。然后,在每个字符之后快速键入几个字符,只设置第一个字符,而丢弃其余字符。也许,由于ajax调用介于两者之间,第二个字符永远不会被带到输入中

快速而肮脏的解决方案是不在这一部分组织我的代码:只需在接收输入时直接填充输入


有更好的办法吗?例如,收集接收到的输入,直到ajax完成,并且我已经准备好接收实际输入字段中的按键?

我认为问题一直与按键有关。我已经重新构造了您的代码,如果您解开按键,它的性能会很好

(function(){
    $(document).keypress(Keypress);

    function Keypress(event){
    ShowTextbox();
    PrefillInput();
    FocusOnEnd();
    $(document).off('keypress',Keypress)
}

function ShowTextbox(){
    $('input').addClass('visible');
}

function PrefillInput(){
    $('input').val(String.fromCharCode(event.which));
    $('input').focus();
}

function FocusOnEnd(){
    $('input')[0].setSelectionRange(1, 1);
}})()

这是一把工作小提琴

你所说的“组织我的代码”到底是什么意思?我为1)显示输入(因为需要做的比显示更多),2)预填充输入,3)关注输入的结尾。如果这是有问题的代码,把它贴在这里是个好主意。代码中没有bug。如果我打字慢一点,一切正常。但是我可以试着做一个工作的测试用例吗?感谢push@Pointy,我已经创建了一个测试用例来显示问题。
(function(){
    $(document).keypress(Keypress);

    function Keypress(event){
    ShowTextbox();
    PrefillInput();
    FocusOnEnd();
    $(document).off('keypress',Keypress)
}

function ShowTextbox(){
    $('input').addClass('visible');
}

function PrefillInput(){
    $('input').val(String.fromCharCode(event.which));
    $('input').focus();
}

function FocusOnEnd(){
    $('input')[0].setSelectionRange(1, 1);
}})()