2015-01-16 27 views
0

我想要显示一个静态html元素,如果用户开始键入,该元素将更改为输入字段,并且已预先填充键入的文本。在基础知识,我能得到这个与这样的代码工作(假设可见的类切换可见性):在执行ajax时粘贴到输入时缺少按键事件

$(document).keypress(function(event){ 
    if ($('input').hasClass('visible')) { 
     return; 
    } 

    $('input').addClass('visible'); 
    $('input').val(String.fromCharCode(event.which)); 
    $('input').focus(); 
    $('input')[0].setSelectionRange(1, 1); 
}); 

然而,在现实世界中的代码(见http://jsfiddle.net/gq3m7145/的测试用例),预充只装满后才一个ajax调用已经执行(它在成功回调中完成)。然后,快速输入几个字符,只设置第一个字符并丢弃其余字符。可能,由于ajax调用位于两者之间,第二个字符不会被输入到输入。

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

有没有更好的方法?例如收集接收到的输入,直到ajax完成,我准备好在实际输入字段中接收按键了?

+0

究竟你的“组织我的代码”是什么意思? – Pointy

+0

我做了一些独立的功能:1)显示输入(需要发生的事情比显示更多),2)预先填充输入,以及3)关注输入结束。 – Lode

+1

那么如果这是有问题的代码,那么在这里发布它是个好主意。 – Pointy

回答

0

我认为这个问题正在不断地受到关键的压力。我已经重组了你的代码,并且如果你解开了键盘按键,它的表现会很好。

(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); 
}})() 

这里是工作提琴http://jsfiddle.net/qfzaLmyw/1/