Есть ли способ ускорить это решение для jQuery: содержит селектор без учета регистра? - PullRequest
6 голосов
/ 11 сентября 2009

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

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

Есть идеи, как можно ускорить это решение?

Ответы [ 5 ]

10 голосов
/ 11 сентября 2009

Я нашел другое решение поиска без учета регистра в Google (см. Эрик Фан ), которое немного отличается от того, которое я использовал изначально.

Оригинал:

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

EricPhan:

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

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

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

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

6 голосов
/ 11 сентября 2009

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

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

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

$("#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
    }  
}();
1 голос
/ 06 января 2011

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

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

1 голос
/ 11 сентября 2009

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

0 голосов
/ 11 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...