这是一些用于搜索框的 jQuery,我希望它实际上是一种反模式,并且我确信有一个更好的解决方案,我很乐意指出:
我将在注释中描述它,然后只给出代码,因为注释可能比代码更清晰和简单:
- // 在按键上设置函数调用。
- // 函数调用在主事件发生之前有一个延迟。
- // 当 keypress 函数被调用时,清除所有先前排队的事件并以标准延迟率创建一个新事件。
- // 使用全局来存储 setTimeout 指针。
- // clearTimeout 任何预先存在的指针。
- // 开始一个新的延迟。
编码:
// set up a filter function call on keypress.
$('#supplier-select-filter').keypress(function (){
// Currently, resets a delay on an eventual filtering action every keypress.
filterSuppliers(.3, this);
});
// Delayed filter that kills all previous filter request.
function filterSuppliers(delay, inputbox){
if(undefined != typeof(document.global_filter_trigger)){
clearTimeout(document.global_filter_trigger);
// clearTimeout any pre-existing pointers.
}
// Use a global to store the setTimeout pointer.
document.global_filter_trigger = setTimeout(function (){
var mask = $(inputbox).val();
$('#user_id').load("supplier.php?action=ajax_getsuppliers_html&mask="+escape(mask));
}, 1000*delay);
// Finally, after delay is reached, display the filter results.
}
问题:
在一个搜索词可能平均由 10 个字符组成的输入框中,即在半秒内调用了 10 次 setTimeout,这似乎是处理器的负担,并且在我的测试中会导致一些明显的性能问题,所以希望有一个更清洁的选择?
.load() 比接收 JSON 然后从 json 生成 html 更简单,但也许有更好的工具?
.keypress() 似乎并不总是触发退格删除和其他必需品,所以也许在这个输入框上使用 keypress() 不是理想的?