С 600+ элементов это собирается быть мертвым медленно. Вы должны предложить Sizzle (механизм выбора jQuery) некоторые возможности для оптимизации.
Во-первых, учитывать тот факт, что JQuery можно использовать изначально поддерживаемый querySelectorAll
метод (в современных браузерах), если ваш селектор соответствует требованиям CSS3 spec (или, по крайней мере, в той степени, что в настоящее время поддерживается в браузерах).
В вашем случае это означает, что только один простой селектор до :not
вместо 3 (1 простой, 2 комплекс).
form :not([name^=ww])
Это было бы довольно быстро ... хотя вы не добры к браузерам, которые не поддерживают querySelectorAll
.
Посмотрите на свой селектор и подумайте о том, насколько сильно Sizzle имеет отношение к каждому элементу. Сначала ему нужно получить ВСЕ элементы на странице (вы не pre-qualifying:not
селектор с тегом/классом/id). Затем на каждом элементе он делает следующее:
(предположим, что он выходит, если результат проверки является ложным)
- Убедитесь, что родитель имеет предка с
nodeName.toLowerCase()
из form
.
- Проверьте, что у него нет атрибута
name
, начиная с ww
(базовая операция indexOf
).
- Убедитесь, что у него нет предка с атрибутом
id
, оканчивающимся на IDF
. (дорогостоящая операция)
- Убедитесь, что у него нет предка с атрибутом
class
, содержащим tools
.
Последние две операции выполняются медленно.
Это может быть лучше, чтобы вручную построить filter
функцию, например, так:
var jq = $([1]);
$('form :input').filter(function(){
// Re-order conditions so that
// most likely to fail is at the top!
jq[0] = this; // faster than constructing a new jQ obj
return (
!jq.closest('[id$=IDF]')[0]
// this can be improved. Maybe pre-qualify
// attribute selector with a tag name
&& !jq.closest('.tools')[0]
&& this.name.indexOf('ww') !== 0
);
});
Примечание: эта функция не тестировалась. Надеюсь, вы получите идею ...
* почему, о, почему * у вас было бы 600 элементов ввода в форме в html!?!? –
Ваша проблема не в селекторе. переделайте свою страницу так, чтобы она использовала меньше полей ввода. переработайте свою логику так, чтобы она не требовала сериализации сотен элементов в скрипте. –
с меньшим количеством полей ввода не является вариантом. Я не могу вдаваться в подробности, но это по дизайну –