簡體   English   中英

是否可以優化Javascript客戶端搜索?

[英]Is it possible to optimize Javascript client-side search?

這是我用來排序無序的元素列表的jQuery / Javascript代碼,並根據用戶的查詢刪除它們:

// event binding for the search filter
$('.search-box').keyup(function(){
    var query = $(this).val().toLowerCase(),
        length = query.length;

    $('.friends-list li').each(function(){
        if(query.length > 1 && $(this).find('span').text().toLowerCase().substring(0, length) != query){
            $(this).hide();
        } else {
            $(this).show();
        }
    });
});

不幸的是,當我獲得大量的li元素時,這會大大減慢並且有時會掛起在系統上。 有沒有辦法優化這個,或者先進行所有搜索,然后一次性刪除所有li元素,這樣系統就不會掛起?

當我進行服務器端搜索時,我可以只有一個加載微調器和一個成功回調,但這似乎不適用於客戶端。

幾個提示

不要在每個keyup事件上觸發搜索。 相反,有一個等待下一個密鑰的短計時器(~200ms)並開始搜索是否沒有:

 keyup:
      clearTimeout(searchTimer)
      searchTimer = setTimeout(doSearch, 200)

如果query.length <=1您的循環可以被優化掉,不需要在每次迭代時檢查它。

each(li)...find(span)開銷太大。 嘗試直接迭代直通:

$('.friends-list li span').each(function() {
    var p = $(this);
    if(p.text().toLowerCase().indexOf(query) !== 0) {
        p.parent().hide();
    } else {
        p.show();
    }
});

還要注意上面代碼中的一些小優化。

我還建議使用for循環,因為它明顯更快

推遲DOM更新是加速此類代碼的有效方法。 最后完成所有操作,而不是在.each()循環中完成。

我建議延遲按鍵,這樣你就不會進行搜索,直到用戶停止輸入一段時間 - 比如半秒鍾,盡管你可以嘗試一下並調整它來嘗試。 另外,我對您的搜索進行了一些小的更改,例如,如果您知道搜索字符串太短,您只想顯示所有內容,因此在這種情況下不需要在循環中測試每個項目。

(function() {
   var timerID = null;

   function doSearch(query) {
     var length = query.length;

     if (length <= 1) {
        $('.friends-list li').show();
     } else {
        $('.friends-list li').each(function(){
           var $this = $(this);
           if($this.find('span').text().toLowerCase()
                                       .substring(0, length) != query)
              $this.hide();
           else
              $this.show();
        });
     }
   } 

   $('.search-box').keyup(function(){
      var searchString = this.value.toLowerCase();

      if (timerID)
         clearTimeout(timerID);

      timerID = setTimeout(function() {
         timerID = null;
         doSearch(searchString);
      }, 500);
   });
)();

我知道這是舊的,但考慮更好的選擇器,緩存元素和事件冒泡(這里不適用) - 搜索優化jQuery,你會得到一堆很棒的技巧。

目前,您可以在每個擊鍵時觸發完整搜索。 您可能希望等待一小段時間。 說0秒,然后檢查是否按下了另一個鍵。 小延遲對於用戶體驗應該是可以的,甚至幾乎不可察覺,但如果有人在輸入一個單詞(快速連續按鍵),這可以節省許多迭代,增加了經驗的速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM