Обработчик события: как делает jquery?
Может кто знает внутренности работы jquery.
Если вешается обработчик события, к примеру click, на все элементы по каком-то условию. То как это реализаует jquery. Вешает обработчик на каждый найденный по условию элемент. Или вешает глобальный обработчик click, в котором ловит всё и уже потом вызывает нужные обработчики? |
Для каждого элемента навешивается обработчик события.
// Bind the global event handler to the element if (elem.addEventListener) elem.addEventListener(type, handle, false); else if (elem.attachEvent) elem.attachEvent("on" + type, handle); } Только я не понимаю зачем вам это знать? разница будет лишь в скорости работы помоему.. |
Именно скорость меня и интересует.
Собираюсь на одной странице сделать Google map и Yandex Map + каталог на jquery. Поэтому важно делать так, чтобы тормозило меньше. |
Цитата:
|
В google map мой город более детально показан. Но а yandex map - типа "поддержи своего производителя". Так что можно будет выбирать, на какой карте смотреть и при желании смотреть сразу на обоих.
Да и задача интересная - скрестить два api |
Любимая привычка программистов сваливать выбор чего-либо на пользователя. Он только путаться от ваших карт будет.
Яндекс, кстати, сегодня выкатил из беты вторую версию карт. Там тоже ваш город плохо показан? |
Если сделать всё "по-умному", то пользователь путаться не будет.
Зато сайт не будет зависеть от одного API, что хорошо. Да и я буду знаком с обоими API, что тоже неплохо. К тому же можно будет выбирать наиболее актуальную на текущий момент карту. Для моего города масштаб не изменился. |
Ну две карты имхо плохо. Почему не пять? :)
По теме: Неужели вы смели подумать, что разработчики jQuery не заботятся о производительности? Это же OpenSource! Кто-то обязательно заметил бы ляпы, и попросил бы их исправить, или включился в комманду и исправил сам. |
Как только освою ещё какой-нибудь API, так сразу подключу.
Всякое может быть, может о производительности никто и подумал. |
Цитата:
|
Я реально думаю, что если там находятся косяки - их достаточно быстро исправляют.
|
Цитата:
|
я могу заметить ляпы одного из мало-известных php-фреймворков. И я им пользуюсь. Просто беру и коммичу исправление бага.
Есть простенький анализатор серверных логов, простенький , но мне понравился. visitors. Офсайт давно брошен - автор видимо там не появляется. Вся гостевая завалена вопросами о поддержке IE7. Поняв все вышеупомянутое я залез в код на Си, добавил пару строк и отправил майнтайнеру пакета в debian. Через пару недель пакет с моим патчем и поддержкой IE7 уже лежал в testing репозитории. Я сделал хорошо себе и кому-то еще. Утопия? Для этой утопии OpenSource и существует. И склонен предполагать, что со всеми OpenSource проектами ситуация такая же. Я обещаю, если замечу "ляп" в jQuery - обязательно отпишу разработчикам, приложив исправляющий патч. |
Цитата:
|
Так же о многом говорит то, что сейчас такой проверки нет.
Опечатки бывают у всех. И вопрос... если вы заметили такой ляп - почему не отписали багрепорт? |
Цитата:
|
Цитата:
Event Delegation это называется. |
Цитата:
|
Сейчас в jQuery неправильно определяется поддержка прозрачности ($.support.opacity), не такие уж старые версии оперы оказываются в пролете.
|
Цитата:
Неправильно определяется? Знаете как правильно определить? Пишите багрепорт, прикладывайте патч! ( большое спасибо за вклад в развитие) Цитата:
|
Цитата:
В-первых, это бы адски тормозило при любом изменении дерева средствами jQuery — алгоритм не тривиальный, обход дерева — ресурсоемкая задача. Во-вторых, изменения сделанные нативными DOM-методами (или через другие фреймворки) не отслеживались бы (да, я знаю про DOMchanged или как его там, но в IE это не поддерживается). В-третьих, уже довольно давно существуют техники, которые позволяют осуществить все то же самое быстрее, проще и изящнее. |
Возможно вы правы. Я сразу оговорился, что не в курсе... надо будет посмотреть.
Но думаю в случае обрабатывания каждого события и делегация обработчика тоже.... при каждом mousemove ... В общем надо посмотреть как реализовано для самообразования... |
> В-первых, это бы адски тормозило при любом изменении дерева средствами jQuery — алгоритм не тривиальный
Reglib не тормозит. Во всяком случае, на каком-то классе изменений. ЗЫ не надо спекулировать этими "быстро-медленно", современные компы таковы, что практически все догадки обламываются :) |
Артем Шалхаков, не надо спекулировать «современными компами»:) У пользователя может быть не очень новый комп. А приложение может быть довольно ресурсоемким.
Reglib, судя по всему, делает LoadAndTraversal только для невсплывающих событий типа submit'а — там без этого не обойтись, да. |
Shasoft,
на баше как раз к вашему случаю цитата Цитата:
|
Народ так активно обсуждает тему, как будто только и ждал, пока я тему открою. :)
Я тут почитал, что народ пишет и пришел к выводу, что самое простое, это повесить обработчик на div, внитри которого и будет находится дерево каталога. А в обработчике уже проверять, на чем конкретно нажал пользователь. |
Цитата:
Или без бубна как то можно? |
Цитата:
См. http://www.quirksmode.org/dom/w3c_events.html#t04: «The target property refers to the HTML element the event actually took place on, even when the event handler has been registered not on the HTML element but on one of its ancestors» |
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
ну прикольную дискуссию развели...
Даже интересно попробовать становится, правда чтоб не изобретать коней двухколесных нужно сначала на OpenSource посмотреть, понять что не нравится, потом попробовать по своему и посмтореть - лучше ли получится... А то что не нужно спекулировать производительносьтю компов - это правда! |
да, я не дописал:
"выясни, что тормозит и оптимизируй", если думаешь, что пользователь это оценит (заметит) |
Цитата:
О ресурсоемком приложении тоже неясно. Кто-то пишет рейтрейсеры в JS? ^_^ Готовое приложение и профилировщик в студию. У меня самого не очень мощный комп, заодно и проверю. :) ЗЫ дваждую x-yuri |
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 03:29. |