Есть ли какой-нибудь способ ускорить это решение для нечувствительного к регистру jQuery:contains селектора?
-
05-07-2019 - |
Вопрос
Я нашел это решение для jQuery без учета регистра :contains
селектор в StackOverflow.Это отлично работает, однако это происходит за счет снижения производительности.Кто-нибудь еще считает это решение немного медленным?
Я использую :contains
селектор для поиска по таблице.Пользователь вводит строку поиска в текстовое поле.При каждом нажатии клавиши он выполняет поиск этой строки в таблице, показывая только строки, содержащие эту строку, с помощью :contains
селектор.До внедрения решения без учета регистра этот поиск был быстрым.Теперь, благодаря этому решению, он блокируется на короткое время после каждого нажатия клавиши.
Есть какие-нибудь идеи о том, как можно ускорить это решение?
Решение
Я нашел другое решение поиска без учета регистра в Google (см. Эрик Фан), который немного отличается от того, который я использовал изначально.
Оригинал:
return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
Эрикфан:
return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
Сравнивая эти два варианта, вы можете видеть, что решение Эрика Фана напрямую обращается к атрибутам DOM и использует toLowerCase()
вместо того, чтобы toUpperCase()
.Последнее на самом деле не имеет значения, но первое - это то, что действительно улучшило производительность поиска без учета регистра.Просто меняю исходное решение на использование (a.textContent || a.innerText || "")
вместо того, чтобы jQuery(a).text()
это все изменило!
Теперь мне немного любопытно, так что вот следующий вопрос:В чем тут дело jQuery.text()
?Почему это происходит так медленно?У меня есть свои предположения, но я бы с удовольствием послушал, что скажут эксперты.
Наконец, спасибо всем, кто откликнулся.Я ценю вашу помощь.=)
Другие советы
Вы могли бы попробовать проверить селектор только один раз, после того, как пользователь перестанет печатать на определенный промежуток времени, а не при каждом нажатии клавиши.
Например, простая реализация:
Использование:
$("#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
}
}();
Вы можете попробовать не проверять после каждого нажатия клавиши, но, возможно, через секунду после последнего нажатия клавиши. таким образом, вы не будете постоянно проверять, пока пользователь печатает, а скорее проверяете, когда пользователь закончил или приостановил набор.
вот следующий вопрос: что сделка с jQuery.text ()? Почему это так медленно?
Я подозреваю, что это медленно из-за $ (a)
(преобразование элемента DOM в объект jQuery), а не из .text ()
.
Чтобы добавить то, что сказал Джейсон, вы можете попробовать использовать этот плагин для этого.