iOS中文輸入法屢次觸發的問題及解決方案

  最近要在移動端實現一個文本框實時搜索的功能,即在文本框裏每輸入一個字,就向服務器請求一次搜索結果。暫且不考慮性能優化問題,第一時間想到的是用keyup實現:性能優化

$('input').on('keyup',function() {
    AjaxRequest();
});

這在安卓上沒有問題,但在iOS上若是使用中文輸入或者輸入法的預設文本,就不會觸發keyup事件,所以也就沒法和服務器通訊。爲解決這個問題,在網上查了些資料,HTML5有專門處理的事件oninput,能夠響應實時輸入:服務器

$('input').on('input',function() {
    AjaxRequest();
});

這樣在輸入中文時就能監聽到文本框的變化了。但仍是有問題,在輸入中文時,好比「我」字,拼音是「wo」,五筆是"q",均會向服務器發送三次請求,若是打印出來,會獲得「我」、「」、「我」三個值,可我只想在「我」字輸出到文本框之後再發請求,這時候就須要一個專門的compositionstartcompositionend事件來處理這種狀況,這是參考資料性能

compositionstart 事件觸發於一段文字的輸入以前(相似於 keydown 事件,可是該事件僅在若干可見字符的輸入以前,而這些可見字符的輸入可能須要一連串的鍵盤操做、語音識別或者點擊輸入法的備選詞)。「優化

最後,完整代碼以下:spa

var lock = false;
$('input').on({
    input: function() {
        if(!lock) AjaxRequest(); //這裏再調用一次方法是爲了響應退格刪除中文
    },
    compositionstart: function() {
        lock = true;
    },
    compositionend: function() {
        lock = false;     
        AjaxRequest(); //能夠響應正常中文輸入,但不響應使用退格刪除中文
    }
});
相關文章
相關標籤/搜索