【发布时间】:2012-11-13 11:30:55
【问题描述】:
背景
我为 HTML select 元素开发了一个基于 jQuery 的 shuttle widget,因为我找不到一个经过最低限度编码并提供了一个正则表达式过滤器来补偿 diacritics。
问题
当向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 在小提琴中定义。上面的代码针对每个按键运行。还有一个相关的sn-p:
// 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 个单词的列表执行正则表达式过滤?
谢谢!
【问题讨论】:
-
永远不要向
<select>元素添加数千个条目。高于 7 的所有内容都不是用户友好的,高于 20 的所有内容都需要有理由的陈述来说明理由。 -
这是少数人使用的维护画面。否则,他们必须直接在数据库中手动对项目进行分类。我不是在寻找不同的用户体验解决方案:一切正常,尽管速度很慢。
-
我的猜测是瓶颈不是正则表达式。你能把瓶颈缩小一点吗?
-
请问:您在哪里找到了那个花哨的
dediacritics函数,它在某个地方维护过吗? -
@Bergi: stackoverflow.com/a/5912746/59087 ;-)
标签: javascript jquery regex optimization diacritics