Ну если есть, покажите пожалуйста, я не смог найти.
Прирост скорости имеется если какой-то конкретный селектор неоднократно вызывается. При единичном использовании ясно что не будет прироста.
простите, наверное я задам глупый вопрос, но в чем явное преимущество такого кеширования над простым присвоением переменной многократно вызываемого селектора?
наподобие:
var tmp = $('#some .css .selector');
$(tmp).что().угодно();
[...]
$(tmp).как().угодно();
Ну если есть, покажите пожалуйста, я не смог найти.
Прирост скорости имеется если какой-то конкретный селектор неоднократно вызывается. При единичном использовании ясно что не будет прироста.
Может стоит еще чуть-чуть усовершенствовать, чтобы работал $.cache.clear(selector). Иначе из-за одного некешируемого селектора(блока на странице) будет вычищаться содержимое всего кеша и надобность присутствия такого плагина уже сомнительна.
Почему прироста может не быть? Из-за работы с внутренней реализации [] браузером? Т.е. поиск по селектору может сработать быстрее поиска элемента по ключу?
Именно в моем случае было недостаточно сохранить как локальную переменную. В посте по ссылке можно почитать почему. Там это решалось с помощью замыканий.
По крайней мере в FF3, IE6+, Chrome оба метода (замыкания и $.cache.get) дали на глаз заметное преимущество.
Если такое кэширование не работает прозрачно для пользователя (в смысле что нужно принудительно вызывать $.cache.get(...), а не просто $(...)), то почему просто не сохранять результат работы селектора в переменную?
var elems = $('div.some-class');
elems.each(...); // do something
elems.each(...); // do something else
А приведенным выше примером эта проблема не решается? И у меня есть большие подозрения, что в приведенной ссылке узким местом является не поиск элементов по СSS-запросу (у вас внутри $('#'+rootId) должны быть сотни элементов, чтобы вызвать проблемы с производительностью). Если покажете рабочий пример, можем дружно посмотреть и найти проблемное место с помощью профайлера.
Передаваемых rootId несколько разных. Приходится для каждого кэшировать работу $(...) что и было сделано с помощью замыканий. После этого проблемы со скоростью исчезли.
Проблему можно было решить изменением верстки и оптимизацией самих выборок по селекторам.
Хотелось найти именно решение без изменения окружающей архитектуры.
Рабочий пример показать к сожалению не могу, проект пока в разработке и закрыт. Аналог — скандинавский аукцион gagen.ru. Узкое место — функция обновления лотов настранице — пересчет времени, вывод лидеров, новых цен.
Если надо сделать как на gagen.ru, то я бы сделал так: после загрузки документа один пробежался по нужным контейнерам с id продукта, и у каждого закэшировал указатели на нужные элементы (цена, время и т.д.) с помощью $(...).data(). А при обновлении данных обращался к ним через $(rootId).data('price').doSomething(). И не надо городить огород из тяжелых замыканий или плагинов, организующих псевдо-кэширование.
если бы кода было бы побольше, то не думаю что return selectorCache[selector] || (selectorCache[selector] = $(selector));
был бы красивым и удобным. Потом же сам будешь искать, а где же оно присваивается :)
Предложенная архитектура кривовата: если мы вверху вдруг закомментируем/уберем первоначальное обращение (или изменим порядок), то все перестанет работать.
Вариант ничем не лучше обычного сохранения в локальной переменной
var $mysel = $('selector… ');
$mysel.show();
$mysel…
Ну да. Вот был у нас и //Before и //After. Разнесенные в коде. Потом бац и //Before вдруг по каким-либо причинам перестал получать управление. Что тогда? //After тоже перестанет работать?
Да, именно это по сути и делается в предложенном плагине. Предлагается более удобный способ использования. Не нужно заботиться о предварительной инициализации и т.п.
Я думаю надо выбрать другой подход к увеличению произоводтельности на клиентской стороне,
Почему? Потому что если так пойти, то в конце получим классный кэшер но с много коде те файл с большим размером
пс мне так кажется
Кэширование селекторов для jQuery. Плагин