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

StackOverflow https://stackoverflow.com/questions/1407434

Вопрос

Я нашел это решение для 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 () .

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top