背景
我为 HTML元素开发了一个基于 jQuery 的穿梭小部件select
,因为我找不到一个经过最少编码并提供了一个正则表达式过滤器来补偿变音符号的小部件。
问题
当向 中添加几千个条目时select
,正则表达式过滤器会变慢。你可以看到如下问题:
- 浏览到:http: //jsfiddle.net/U8Xre/2/
- 单击结果面板中的输入字段。
- 键入任何正则表达式(例如,
^a.*ai
)。
代码
我相信罪魁祸首潜伏在这里:
var options = $src.empty().scrollTop( 0 ).data( "options" );
var search = $.trim( $input.val() );
var regex = new RegExp( search, 'gi' );
var len = options.length;
var $html = $(document.createElement( 'option' ));
for( var i = 0; i < len; i++ ) {
var o = options[ i ];
if( o.text.dediacritics().match( regex ) !== null ) {
$src.append( $html.clone().text( o.text ).val( o.value ) );
}
}
$src.css( 'width', $input.width() + 4 );
$src
来源在哪里,$('#select')
并String.prototype.dediacritics
在小提琴中定义。上面的代码针对每个按键运行。还有一个相关的片段:
// Create a copy of the source options to use when matching the regex.
var $options = [];
$src.find( "option" ).each( function() {
$options.push( { value: $(this).val(), text: $(this).text() } );
});
$src.data( "options", $options );
这会复制源列表中的选项,但只运行一次。(这会导致在穿梭选项时出现重复错误,但是将上述代码添加到input
事件处理程序中会更加减慢过滤器。)
问题
如何使代码几乎实时地对多达 5,000 个单词的列表执行正则表达式过滤?
谢谢!