Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Обработчик события: как делает jquery? (https://javascript.ru/forum/jquery/3406-obrabotchik-sobytiya-kak-delaet-jquery.html)

hogart 20.04.2009 12:10

Цитата:

Сообщение от idler (Сообщение 17131)
Я не знаю как сейчас, но правильней было бы поставить перенавешивание обработчиков на все события при событии изменения dom-дерева - думаю так и сделали

Я не согласен, что это правильно.
В-первых, это бы адски тормозило при любом изменении дерева средствами jQuery — алгоритм не тривиальный, обход дерева — ресурсоемкая задача.
Во-вторых, изменения сделанные нативными DOM-методами (или через другие фреймворки) не отслеживались бы (да, я знаю про DOMchanged или как его там, но в IE это не поддерживается).
В-третьих, уже довольно давно существуют техники, которые позволяют осуществить все то же самое быстрее, проще и изящнее.

idler 20.04.2009 14:00

Возможно вы правы. Я сразу оговорился, что не в курсе... надо будет посмотреть.
Но думаю в случае обрабатывания каждого события и делегация обработчика тоже.... при каждом mousemove ...
В общем надо посмотреть как реализовано для самообразования...

Артем Шалхаков 20.04.2009 14:24

> В-первых, это бы адски тормозило при любом изменении дерева средствами jQuery — алгоритм не тривиальный

Reglib не тормозит. Во всяком случае, на каком-то классе изменений.

ЗЫ не надо спекулировать этими "быстро-медленно", современные компы таковы, что практически все догадки обламываются :)

hogart 20.04.2009 14:59

Артем Шалхаков, не надо спекулировать «современными компами»:) У пользователя может быть не очень новый комп. А приложение может быть довольно ресурсоемким.
Reglib, судя по всему, делает LoadAndTraversal только для невсплывающих событий типа submit'а — там без этого не обойтись, да.

Kolyaj 20.04.2009 16:32

Shasoft,
на баше как раз к вашему случаю цитата
Цитата:

<девушка>: А у меня тут антивир ругается... Он еще спрашивает - что вы хотите делать??? Он глупенький!!! Такое спрашивать у девушки!!! Чего я сейчас хочу делать?!! Я бы позагорала, пожалуй.....

Shasoft 20.04.2009 16:41

Народ так активно обсуждает тему, как будто только и ждал, пока я тему открою. :)
Я тут почитал, что народ пишет и пришел к выводу, что самое простое, это повесить обработчик на div, внитри которого и будет находится дерево каталога. А в обработчике уже проверять, на чем конкретно нажал пользователь.

Riim 20.04.2009 18:23

Цитата:

Сообщение от Shasoft
это повесить обработчик на div, внитри которого и будет находится дерево каталога

Только вот в target/srcElement будет сам этот div, а не элемент дерева. Придется поплясать с бубном, что бы определить, кого там щелкнули.

Или без бубна как то можно?

hogart 20.04.2009 18:43

Цитата:

Сообщение от Riim (Сообщение 17169)
Только вот в target/srcElement будет сам этот div, а не элемент дерева. Придется поплясать с бубном, что бы определить, кого там щелкнули.

Кажется, нет, как раз в target/srcElement — элемент, на котором произошло событие. А в this будет 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»

Riim 20.04.2009 21:34

Цитата:

Сообщение от hogart
Кажется, нет, как раз в target/srcElement — элемент, на котором произошло событие

Ага, туплю помаленьку. Что это со мной. Сам не понимаю.

Цитата:

Сообщение от hogart
как раз в target/srcElement — элемент, на котором произошло событие

Но это все равно будет не тот элемент. По крайней мере, если он (нужный элемент) содержит в себе другие элементы. Нужно будет перебирать parentNode-ы и выделять нужные элементы по какому-то признаку. Если дошли до body значит клик вне того, что там кто-то выше задумал сделать.

Riim 20.04.2009 21:36

Цитата:

Сообщение от hogart
А в this будет div, на который навешен обработчик

Цитата:

Сообщение от Riim
Нужно будет перебирать parentNode-ы и выделять нужные элементы по какому-то признаку

Опять туплю. Если долго не спать то такое случается. :)


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