Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.03.2009, 19:12
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 18.04.2008
Сообщений: 152

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

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

По каждому клику jQuery будет заново перерывать весь DOM в поисках .another-div, или где-то закэширует, а потом будет искать в кэше?
Ответить с цитированием
  #2 (permalink)  
Старый 12.03.2009, 19:20
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,245

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

не уверен, что получится, но попробуйте сами закешировать результаты, схранив результат получения коллекции в какую-нибудь переменную.по идее должно получится.
Ответить с цитированием
  #3 (permalink)  
Старый 12.03.2009, 19:27
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 18.04.2008
Сообщений: 152

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

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

Честно говоря, пишу на jQuery недавно, и код пока что выходит неизящный. Вот и подумалось — может, я что не так делаю
Ответить с цитированием
  #4 (permalink)  
Старый 12.03.2009, 19:35
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,245

я так подозреваю вы понимаете под изяществом более красивые конструкции, занимающие меньше символов и прочее?
я бы не стал за этим сильно гнатся.
но в плане красоты можете попробовать как-то так(не верен,что сработает,но попробовать стоит)
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")
})
Ответить с цитированием
  #5 (permalink)  
Старый 12.03.2009, 19:40
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 18.04.2008
Сообщений: 152

Так и делаю.
А зачем $(cache_some_div), ведь cache_some_div уже jQuery-обьект?
Ответить с цитированием
  #6 (permalink)  
Старый 12.03.2009, 19:49
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,245

ну, дык для красоты-же))))
насколько я помню если передатьв $() объект jQuery, то оно его и вернет.
короче говоря тавтология.
Ответить с цитированием
  #7 (permalink)  
Старый 12.03.2009, 20:32
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

А я думал не существует пользователей jQuery, задающихся этим вопросом
Ответить с цитированием
  #8 (permalink)  
Старый 12.03.2009, 21:33
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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

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

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

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

Последний раз редактировалось Dmitry A. Soshnikov, 13.03.2009 в 12:19.
Ответить с цитированием
  #9 (permalink)  
Старый 13.03.2009, 12:46
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 18.04.2008
Сообщений: 152

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

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

Dmitry A. Soshnikov, спасибо.
Честно говоря, когда задавал этот вопрос, ужасно не хотелось копаться еще и в чужом коде — думал, может, кто-то знает уже.
Так что спасибо за изыскания
Ответить с цитированием
  #10 (permalink)  
Старый 13.03.2009, 12:56
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,245

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск