Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   кэширование селекторов (https://javascript.ru/forum/jquery/3039-kehshirovanie-selektorov.html)

hogart 12.03.2009 19:12

кэширование селекторов
 
Господа, а кто знает — кэширует ли новый движок jQuery полученные результаты?

Например,
$('.some-div').bind('click', function(evt){
  $('.another-div').text("OMG U CLIKT TEH BUTTON!!11")
})

По каждому клику jQuery будет заново перерывать весь DOM в поисках .another-div, или где-то закэширует, а потом будет искать в кэше?

Gvozd 12.03.2009 19:20

рискую предположить, что не кеширует,ибо DOM может быть перерисован не зависимо от jQuery, и кеш будет неактуальным

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

hogart 12.03.2009 19:27

Цитата:

Сообщение от Gvozd (Сообщение 14104)
ибо DOM может быть перерисован не зависимо от jQuery, и кеш будет неактуальным

вот да, например.

Цитата:

Сообщение от Gvozd (Сообщение 14104)
закешировать результаты, схранив результат получения коллекции в какую-нибудь переменную.по идее должно получится.

А я так и делаю. Но подумалось — а вдруг зря.

Честно говоря, пишу на jQuery недавно, и код пока что выходит неизящный. Вот и подумалось — может, я что не так делаю:)

Gvozd 12.03.2009 19:35

я так подозреваю вы понимаете под изяществом более красивые конструкции, занимающие меньше символов и прочее?
я бы не стал за этим сильно гнатся.
но в плане красоты можете попробовать как-то так(не верен,что сработает,но попробовать стоит)
var cache_some_div=$('.some-div')
var cache_another_div=$('.another-div')

$(cache_some_div).bind('click', function(evt){
  $(cache_another_div).text("OMG U CLIKT TEH BUTTON!!11")
})

hogart 12.03.2009 19:40

Так и делаю.
А зачем $(cache_some_div), ведь cache_some_div уже jQuery-обьект?:)

Gvozd 12.03.2009 19:49

ну, дык для красоты-же))))
насколько я помню если передатьв $() объект jQuery, то оно его и вернет.
короче говоря тавтология.

Kolyaj 12.03.2009 20:32

А я думал не существует пользователей jQuery, задающихся этим вопросом :)

Dmitry A. Soshnikov 12.03.2009 21:33

hogart, код же открыт ;) (я бегло посмотрел версию 1.3.2). Посмотрите jQuery.fn.init (строка 36): объект именно этого конструктора создаётся каждый раз по вызову функции $ (т.е. в любом случае, $ - возвращает всегда новый объект jQuery, поэтому даже $('some') != $('some')).

Касаемо же кеширования DOM-объектов - я не увидел (но, повторю - просмотрел код бегло). Например, в строке 61 видно, что .getElementById вызывается каждый раз (для $('#someId')).

В строке 41 видно, что, если передан DOM-объект, он возвращается сразу (вернее, возвращается новый объект jQuery, в который обёрнут DOM-объект).

Все остальные селекторы обрабатываются функцией .find; причём, забавно (см. строку 78) - заново запускается эта же функция - $, и снова создаётся новый объект, и затем уже вызывается её метод .find =)

hogart 13.03.2009 12:46

Gvozd, какая ж тут красота…

Kolyaj, а почему нет?:)

Dmitry A. Soshnikov, спасибо.
Честно говоря, когда задавал этот вопрос, ужасно не хотелось копаться еще и в чужом коде — думал, может, кто-то знает уже.
Так что спасибо за изыскания:)

Gvozd 13.03.2009 12:56

Цитата:

Сообщение от hogart
Gvozd, какая ж тут красота…

ну, значит глупость сделал)))
Цитата:

Сообщение от hogart
Kolyaj, а почему нет?

попробую выразить свое мнение(не факт, что оно совпадает с мнением Kolyaj)
Принято считать,что большинство людей пишущих с использованием фреймворков понятия не имеют что творится в самом фреймворке, и как можно реализовать ту же задачу без фреймворка.как некое логическое следствие мало кто из них задумывается над оптимизацией кода, до того момента "как приспичит".как правило код, полученный у этому моменту проще выкмнуть чем исправить, так как в нем могут использоватся поистине ужасные конструкции, которые изначльно надо было писть нормально, а не потом.
PS исключение из этого правила есть.вы на верном пути.научитесь не боятся копания в чужом коде(если он качественный, там много интересного может быть)


Часовой пояс GMT +3, время: 14:41.