Есть ли способ ускорить это решение для нечувствительного к регистру jQuery: содержит селектор?

Я нашел это решение для селектора jQuery :contains без учета регистра в StackOverflow. Он отлично работает, однако он стоит за счет производительности. Кто-нибудь еще найдет это решение немного медленным?

Я использую селектор :contains для поиска таблицы. Пользователь вводит строку поиска в текстовое поле. Для каждого нажатия клавиши он ищет таблицу для этой строки, показывая только строки, содержащие эту строку, с помощью селектора :contains. Прежде чем внедрять решение без учета регистра, этот поиск был быстрым и быстрым. Теперь с этим решением он блокируется в течение короткого момента после каждого нажатия клавиши.

Любые идеи о том, как можно ускорить это решение?

Ответ 1

Я нашел другое решение нечувствительного к регистру поиска в Google (см. Eric Phan), который немного отличается от того, который я изначально использовал.

Оригинал:

return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;

EricPhan:

return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;

Сравнивая эти два, вы можете увидеть, что решение Eric Phan напрямую использует атрибуты DOM и использует toLowerCase() вместо toUpperCase(). Последнее не имеет особого значения, но первое - это то, что действительно улучшило производительность поиска без учета регистра. Просто изменить исходное решение для использования (a.textContent || a.innerText || "") вместо jQuery(a).text() сделало все различие!

Теперь мне немного любопытно, поэтому вот следующий вопрос: Какая сделка с jQuery.text()? Почему это так медленно? У меня есть свои предположения, но я хотел бы услышать, что говорят эксперты.

Наконец, спасибо всем, кто ответил. Я понимаю вашу помощь. =)

Ответ 2

Вы можете попытаться проверить селектор только один раз, после того, как пользователь прекратил печатать в течение определенного времени, а не для каждого нажатия клавиши.

Например, простая реализация:

Использование:

$("#textboxId").keyup(function () {
  typewatch(function () {
    // executed only 500 ms after the user stopped typing.
  }, 500);

Реализация:

var typewatch = function(){
    var timer = 0;  // store the timer id
    return function(callback, ms){
        clearTimeout (timer);  // if the function is called before the timeout
        timer = setTimeout(callback, ms); // clear the timer and start it over
    }  
}();

Ответ 3

вы можете попробовать не проверять после каждого нажатия клавиши, но, возможно, секунду после нажатия последнего нажатия клавиши. таким образом, вы не постоянно проверяете, когда пользователь печатает, а скорее проверяете, когда пользователь закончил или приостановил ввод.

Ответ 4

вот следующий вопрос: что сделка с jQuery.text()? Почему это так медленно?

Я подозреваю, что он медленный из-за $(a) (преобразование элемента DOM в объект jQuery), а не .text().

Ответ 5

Чтобы добавить к тому, что сказал Джейсон, вы можете попробовать этот плагин для этого.