Есть ли способ ускорить это решение для нечувствительного к регистру 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
Чтобы добавить к тому, что сказал Джейсон, вы можете попробовать этот плагин для этого.