我有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);
});
});
感谢大家的回答。
答案 0 :(得分:5)
有些观点:
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" ]();
});
});
});
答案 1 :(得分:1)
如果您可以避免ajax请求,请执行此操作。您可能需要使用它们,但如果您遇到客户端问题,浏览器只能处理这么多数据。
如果您需要处理ajax请求或大量数据,请设置keydown事件以启动100-300毫秒的超时,该超时会在每个后续的keydown上重置并重新启动,后者又会调用您的搜索功能。这样,只有当用户空闲200毫秒时才会运行搜索(不多,但足以减少很多搜索呼叫次数)。