2015-01-16 25 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/