keyup實現在輸入狀態不發送搜索請求,停止輸入后發送


個人需求:通過keyup事件配合后台elasticsearch(彈性搜索),用戶在輸入狀態不發送請求,等停止輸入后發送請求。

這是個思考筆記,因為項目臨時需要彈性搜索功能,所以臨時想了這么個法子,方法比較大眾還望大神多多指點。

我的原文地址:http://www.cnblogs.com/mingxinice/p/keyupSearch.html

我用的原生方法,通過時間戳+定時器+一個全局變量實現。代碼量很少比較易懂。

CSS:(記錄一下比較喜歡的input樣式)

 1 input{
 2     width:300px;
 3     height: 32px;
 4     color: #5c5c5c;
 5     font-size: 14px;
 6     box-sizing: border-box;
 7     border: 1px solid #ddd;
 8     border-radius: 3px;
 9     padding-left: 10px;
10 }
11 input:focus{
12     border: 1px solid #007cdc;
13     outline: none;
14     -webkit-box-shadow: 0px 0px 6px #007cdc;
15     -moz-box-shadow: 0px 0px 6px #007cdc;
16     box-shadow: 0px 0px 6px #007cdc;  
17     -webkit-transition: border linear .2s,box-shadow linear .2s;
18     -moz-transition: border linear .2s,box-shadow linear .2s;
19     -o-transition: border linear .2s,box-shadow linear .2s;
20     transition: border linear .2s,box-shadow linear .2s;
21 }

HTML:

1 <input id='keyDom' type="text"/>

JavaScript:

 1 var keyDom = document.getElementById('keyDom');
 2 //全局的一個變量,可被每次觸發的事件函數重新修改賦值
 3 var lastTimeStamp = 0;
 4 keyDom.addEventListener('keyup',function(event){
 5     //標記當前事件函數的時間戳
 6     lastTimeStamp = event.timeStamp;
 7     //800ms后比較二者是否還相同(因為只要還有事件觸發,lastTimeStamp就會被改寫,不再是當前事件函數的時間戳)
 8     setTimeout(function(){
 9         if(lastTimeStamp == event.timeStamp){
10             alert('發送請求');
11         };
12     },800);
13 },false);        

注釋:

1.用戶輸入動作觸發keyup事件,並調用事件函數。事件函數被調用后會生成對應的event.timeStamp,這個值在事件函數體內一直不會變。

2.將這個值復賦給全局中定義的lastTimeStamp。這個lastTimeStamp是一個全局的變量,這樣這個值在每次事件觸發時都會被改變。

3.如果在1000ms內,lastTimeStamp這個值被其他事件函數重新賦值修改,(同函數因觸發事件被調用多次)則lastTimeStamp != event.timeStamp;說明還在輸入。不走ajax請求。

4.若1000ms內不再觸發事件,不再調用事件函數。

5.lastTimeStamp被本次事件函數賦值一次后,沒有再被改寫。則說明,此時不再輸入或有間歇。lastTimeStamp==event.timeStamp。發送ajax請求。

功力不深,望老司機多留些方法~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM