[英]How can i improve performance of search script?
我有很多項目和一些輸入的UL清單。 我的腳本監聽輸入的鍵,並顯示或隱藏與輸入字符串匹配的字段。
這是我的代碼:
$(function(){
$('#srvSearchField').keyup(function(){
var value = $(this).val();
$('.srvClientBlock').each(function(){
var currentFieldValue = $(this).children('.srvClientName').html();
var exp = new RegExp(value);
if (currentFieldValue.match(exp)) {
$(this).show();
} else {
$(this).hide();
}
});
});
});
如何改善效能? 或者我應該在服務器上發送請求以找到匹配的值?
UPD:我決定使用Ajax來過濾客戶端。
var url = "<?php echo $searchClientUrl;?>";
$(function(){
$('#srvSearchField').keyup(function(){
var request = $(this).val();
var callback = function(response) {
$('.srvClientBlock').hide();
var data = JSON.parse(response);
for (var i = 0; i < data.length; i++) {
$('#srvClient-' + data[i]).show();
}
};
$.post(url, {"request" : request}, callback);
});
});
謝謝大家的回答。
一些要點:
test
方法代替match
。 當然,僅當列表內容沒有動態更改(或至少每次都需要重新構建緩存)時,才應用緩存。
在某些情況下,將每次搜索的請求發送到服務器才有意義:
但是它們需要足夠的帶寬來處理許多請求,並且延遲相對較小。 不過,您可以通過特殊的優化來解決這些問題。
// simple improvements, no caching:
$(function(){
$('#srvSearchField').keyup(function(){
var exp = new RegExp( $(this).val() );
$('.srvClientBlock').each(function(){
var $this = $(this);
var currentFieldValue = $this.children('.srvClientName').text();
$this[ exp.test(currentFieldValue) ? "show" : "hide" ]();
});
});
});
如果可以避免ajax請求,請這樣做。 您可能需要使用它們,但是如果遇到客戶端問題,瀏覽器只能處理那么多數據。
如果您需要處理ajax請求或大量數據,請將keydown事件設置為開始100-300 ms的超時,此超時將在每次后續的keydown中重置並重新啟動,從而調用搜索功能。 這樣,您的搜索將僅在用戶空閑200毫秒(不多,但足以大大減少搜索次數)時運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.