Фон
Я разработал на основе jQuery виджет shuttle для элементов HTML 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
еще больше замедлит работу фильтра.)
Вопрос
Как сделать так, чтобы код выполнял фильтрацию регулярных выражений в списках до 5000 слов практически в режиме реального времени?
Благодарю вас!
<select>
. Все, что выше 7, не удобно для пользователя, а все, что выше 20, требует аргументированного обоснования. - person Bergi   schedule 26.11.2012dediacritics
, она где-то поддерживается? - person Bergi   schedule 14.12.2012