最近要在移動端實現一個文本框實時搜索的功能,即在文本框裏每輸入一個字,就向服務器請求一次搜索結果。暫且不考慮性能優化問題,第一時間想到的是用keyup
實現:性能優化
$('input').on('keyup',function() { AjaxRequest(); });
這在安卓上沒有問題,但在iOS上若是使用中文輸入或者輸入法的預設文本,就不會觸發keyup
事件,所以也就沒法和服務器通訊。爲解決這個問題,在網上查了些資料,HTML5有專門處理的事件oninput
,能夠響應實時輸入:服務器
$('input').on('input',function() { AjaxRequest(); });
這樣在輸入中文時就能監聽到文本框的變化了。但仍是有問題,在輸入中文時,好比「我」字,拼音是「wo」,五筆是"q",均會向服務器發送三次請求,若是打印出來,會獲得「我」、「」、「我」三個值,可我只想在「我」字輸出到文本框之後再發請求,這時候就須要一個專門的compositionstart
和compositionend
事件來處理這種狀況,這是參考資料。性能
「compositionstart
事件觸發於一段文字的輸入以前(相似於 keydown
事件,可是該事件僅在若干可見字符的輸入以前,而這些可見字符的輸入可能須要一連串的鍵盤操做、語音識別或者點擊輸入法的備選詞)。「優化
最後,完整代碼以下:spa
var lock = false; $('input').on({ input: function() { if(!lock) AjaxRequest(); //這裏再調用一次方法是爲了響應退格刪除中文 }, compositionstart: function() { lock = true; }, compositionend: function() { lock = false; AjaxRequest(); //能夠響應正常中文輸入,但不響應使用退格刪除中文 } });