Author |
Message |
Zeroglif
Участник форума
Joined: 02 Jan 2006
Posts: 293
Карма: 61 поощрить/наказать
|
Posted: Fri Oct 06, 2006 12:01 pm (написано за 28 секунд)
Post subject:
|
|
Quote: |
Оказывается в ИЕ можно на один обект, на одно и тоже событие 2 раза повесить один и тот же обработчик (buttonclick1 например), а в опере и лисе нельзя нужно создавать 2 разных. | Всё правильно, IE идёт своим путём. Фича же собственного изобретения, на DOM Events можно оглядываться выборочно. Остальные пытаются соответствовать. Quote: |
If multiple identical EventListeners are registered on the same EventTarget with the same parameters the duplicate instances are discarded. They do not cause the EventListener to be called twice and since they are discarded they do not need to be removed with the removeEventListener method. www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Registration-interfaces | Идентичные функции считаются за одну. Это не относится к анонимным, идентичность которых определяет интерпретатор (может слить в одну, а может и не слить). По этому поводу даже багзиллу https://bugzilla.mozilla.org/show_bug.cgi?id=303744 дёрнули. Если речь зашла о различиях, то я бы дописал ещё порядок выдачи событий. IE отдаст их или по LIFO или random (документировано), Gecko/Opera по идее по FIFO. Quote: |
If you attach multiple functions to the same event on the same object, the functions are called in random order, immediately after the object's event handler is called. msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/methods/attachevent.asp |
|
|
Back to top |
|
 |
AKS
Участник форума
Joined: 28 Dec 2005
Posts: 1174
Карма: 102 поощрить/наказать
|
Posted: Fri Oct 06, 2006 7:00 pm (спустя 6 часов 58 минут; написано за 9 минут 38 секунд)
Post subject:
|
|
Этот тест позволил сделать неприятный вывод - все сводится к тому, что (как писал Zeroglif) при прохождении каждого элемента создается новый объект event. Вывод неприятен тем, что такую модель поведения очень трудно понять, ведь она на первый взгляд выглядит нерационально, и если бы такое поведение не уходило корнями в далекое, мрачное прошлое (как отметил WingedFox), то в наши дни это выглядело бы просто как "победа над разумом" в пользу разработчиков MSIE. Хотя мне еще рановато судить о логике в программировании, но уж простите - не удержался, ведь вчера я напрасно потратил уйму времени на эту самую "модель", а мог бы потратить на какую-нибудь другую. ;)
|
|
Back to top |
|
 |
AKS
Участник форума
Joined: 28 Dec 2005
Posts: 1174
Карма: 102 поощрить/наказать
|
Posted: Sat Oct 07, 2006 8:02 am (спустя 13 часов 2 минуты; написано за 4 минуты 12 секунд)
Post subject:
|
|
Zeroglif
Остается выяснить еще такую вещь. Вы дважды написали, что "в event Object можно писать всё", но не пояснили - есть ли в этом с вашей точки зрения какой-либо практический смысл (т.е. можно ли сделать так, чтобы в первом тесте с e.changed увидеть не undefined). Может все-же есть какой-нибудь "лоффкий" способ сохранить что-то записанное в объект event? А то я потерял покой и сон - не "отпускает" меня все это дело. Выручайте!
|
|
Back to top |
|
 |
WingedFox
Профессионал

Joined: 29 Apr 2003
Posts: 4064
Карма: 269 поощрить/наказать
Location: Питер
|
Posted: Sat Oct 07, 2006 8:36 am (спустя 34 минуты; написано за 1 минуту 1 секунду)
Post subject:
|
|
AKS
Раз уж так неймётся 8*) WindowsSDK wrote: |
A behavior can override an element's default behavior by exposing an event of the same name as one that is already defined for the element. For example, a behavior that exposes an onclick event can override the element's default onclick event. | windowssdk.msdn.microsoft.com/en-us/library/z381xea1.aspx#Mtps_DropDownFilterText
Ну и www.w3.org/TR/NOTE-HTMLComponents
|
|
Back to top |
|
 |
AKS
Участник форума
Joined: 28 Dec 2005
Posts: 1174
Карма: 102 поощрить/наказать
|
Posted: Sat Oct 07, 2006 1:34 pm (спустя 4 часа 57 минут; написано за 3 минуты 10 секунд)
Post subject:
|
|
WingedFox
Не-е-ет, об этом я сам писал с самого начала обсуждения event (себя цитировать не буду). А сегодня я прошу Zeroglif "приподнять занавес", скрывающий великую тайну записи в event Object, который создается как раз не при помощи метода document.createEventObject(), а "болтается" в глобальном пространстве и именуется window.event...
|
|
Back to top |
|
 |
Zeroglif
Участник форума
Joined: 02 Jan 2006
Posts: 293
Карма: 61 поощрить/наказать
|
Posted: Sat Oct 07, 2006 1:49 pm (спустя 15 минут; написано за 1 минуту 34 секунды)
Post subject:
|
|
Quote: |
при прохождении каждого элемента создается новый объект event. Вывод неприятен тем, что такую модель поведения очень трудно понять, ведь она на первый взгляд выглядит нерационально | Не при прохождении каждого элемента, а при встрече с обработчиком. Каждый последующий обработчик этого же события плодит другой объект со свойствами, переданными ему от самого события. Видимо это объясняется тем, что глобальное свойство window.event может жить только в пределах одного обработчика, потом ему нужно быстренько сдохнуть, чтобы возродиться снова на следующем витке (обработчике). Цитата из msdn: Quote: |
Every time an event is fired, a special property on the window object is created. This special property contains the event object. The event object contains context information about the event that just fired, including mouse location, keyboard status, and, most importantly, the source element of the event... | Касательно иррациональности - может и так, но надо учитывать то, что bubbling вводился, чтобы минимизировать код и распространить, условно говоря, 1 регистрацию на 183 дочерних элемента разом, а не чтобы забацать 183 регистрации на 1 событие. Quote: |
Вы дважды написали, что "в event Object можно писать всё", но не пояснили - есть ли в этом с вашей точки зрения какой-либо практический смысл (т.е. можно ли сделать так, чтобы в первом тесте с e.changed увидеть не undefined). Может все-же есть какой-нибудь "лоффкий" способ сохранить что-то записанное в объект event? | Смысла мало, любую инфу о событии можно сохранить в другом месте. "Лоффкий" способ сохранить в поле самого события я описал пару постов выше. Не знаю, правда, насколько он "лоффкий".
|
|
Back to top |
|
 |
AKS
Участник форума
Joined: 28 Dec 2005
Posts: 1174
Карма: 102 поощрить/наказать
|
Posted: Sat Oct 07, 2006 2:27 pm (спустя 38 минут; написано за 5 минут 15 секунд)
Post subject:
|
|
Zeroglif Quote: |
Не при прохождении каждого элемента, а при встрече с обработчиком. | Да, конечно! Это я на своем тесте "зациклился" - там к ряду три элемента имеют обработчики клика. Ну а с e.changed == undefined в каждом новом event Object интересно получилось - я ведь думал, что нельзя добавить "свое" св-во динамичестки просто потому, что "ну нельзя и все", а оказывается потому, что создаются разные объекты (а самое интересное, что document.createEventObject будет один на всех, но что-то я уже повторяюсь - пора с этим заканчивать)...
|
|
Back to top |
|
 |
Андрей Сумин
Участник форума

Joined: 23 Nov 2005
Posts: 60
Карма: 5 поощрить/наказать
Location: Москва
|
Posted: Mon Oct 09, 2006 10:25 am (спустя 1 день 19 часов 57 минут; написано за 1 минуту 27 секунд)
Post subject:
|
|
Quote: |
Не при прохождении каждого элемента, а при встрече с обработчиком. | Погодите, вроде мой тест показывает что 2 разных обработчика, но на одном объекте и на одном событии делят один общий объект event, хоть и делают это по очереди.
|
|
Back to top |
|
 |
WingedFox
Профессионал

Joined: 29 Apr 2003
Posts: 4064
Карма: 269 поощрить/наказать
Location: Питер
|
Posted: Mon Oct 09, 2006 11:12 am (спустя 46 минут; написано за 14 минут 40 секунд)
Post subject:
|
|
Есть надстройка над MSHTML, называющаяся JExplorer (jniwrapper.com/jniwrapper_downloads/docs/JExplorer-PGuide.html)
Цитаты из документации: Quote: |
Each DOM element wrapper in JExplorer's Document Object Model implements the org.w3c.dom.events. EventTarget interface. Therefore, you can add a listener to an element: <...skip...> The event handler gets the current value of the select element and prints it. The org.w3c.dom.Element does not extend the org.w3c.dom.events.EventTarget interface, so you need to cast the select element to the EventTarget type. JExplorer provides the HTMLElement.fireEvent() method that fires a specified event on a selected DOM element, like shown below: |
Quote: |
Each DOM element wrapper provided by JExplorer implements the EventTarget and HTMLElement interfaces. Therefore, you can add event listeners for a DOM element wrapper. Also, you can add event listeners using HTMLElement variables, because the HTMLElement interface extends the EventTarget interface. Call the HTMLElement.fireEvent() method to fire events on specific DOM elements. | Т.о., всё различие в подходах заключается в том, что в IE сам элемент является событием, а в W3C DOM - событие само по себе и разделяется всеми элементами. Из этого следует вывод: В IE HTMLElement наследует EventTarget, соотв. внутри движка (обработчик события) может быть код вроде такого: Code (any language): | скопировать код в буфер обмена | <строим список целевых элементов> список полей = инициализируем известные событию поля <для каждого элемента, пока сброшен cancelBubble> { вызываем текущий элемент -> метод создания события (список полей) список полей = текущий элемент -> сохранить известные изменённые поля } | По понятным причинам, посмотреть насколько верно сие предположение - не представляется возможным 8*) В W3C DOM HTMLElement не наследует EventTarget, т.ч. там код д.б. примерно такой: Code (any language): | скопировать код в буфер обмена | <строим список целевых элементов> инициализируем событие <для каждого элемента, пока не вызван метод stopPropagation> { вызываем событие (текущий элемент) // он помещается в .target } | Это предположение можно проверить, но мне лениво лезть в сырцы Мозиллы.
|
|
Back to top |
|
 |
Zeroglif
Участник форума
Joined: 02 Jan 2006
Posts: 293
Карма: 61 поощрить/наказать
|
Posted: Mon Oct 09, 2006 12:10 pm (спустя 58 минут; написано за 3 минуты 44 секунды)
Post subject:
|
|
Андрей Сумин wrote: |
Quote: |
Не при прохождении каждого элемента, а при встрече с обработчиком. | Погодите, вроде мой тест показывает что 2 разных обработчика, но на одном объекте и на одном событии делят один общий объект event, хоть и делают это по очереди. | Это тот случай, когда нельзя пренебречь точной терминологией. В вашем втором тесте не 2 обработчика, а один, после вызова которого вызываются 2 разных функции. Соответственно и один единственный event Object. Quote: |
When sEvent fires on the object, the object's sEvent handler is called before fpNotify , the specified function. If you attach multiple functions to the same event on the same object, the functions are called in random order, immediately after the object's event handler is called. msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/methods/attachevent.asp |
|
|
Back to top |
|
 |
Андрей Сумин
Участник форума

Joined: 23 Nov 2005
Posts: 60
Карма: 5 поощрить/наказать
Location: Москва
|
Posted: Mon Oct 09, 2006 12:53 pm (спустя 42 минуты; написано за 8 секунд)
Post subject:
|
|
Согласен.
|
|
Back to top |
|
 |
Андрей Сумин
Участник форума

Joined: 23 Nov 2005
Posts: 60
Карма: 5 поощрить/наказать
Location: Москва
|
Posted: Thu Oct 19, 2006 11:27 am (спустя 9 дней 22 часа 34 минуты; написано за 2 минуты 38 секунд)
Post subject:
|
|
В завершение не вопрос а просто пример.ИЕ выдаст алерт Лиса и Опера ошибку как и во всех предыдущих примерах (после new должен идти NewExpression).Никто из браузеров не дает увидеть a на пределами объекта b.
|
|
Back to top |
|
 |
AKS
Участник форума
Joined: 28 Dec 2005
Posts: 1174
Карма: 102 поощрить/наказать
|
Posted: Thu Oct 19, 2006 2:17 pm (спустя 2 часа 49 минут; написано за 4 минуты 1 секунду)
Post subject:
|
|
Андрей Сумин wrote: |
Никто из браузеров не дает увидеть a на пределами объекта b. | Ну-у-у, это уже "перебор" ;). С какой стати inner function будет видна? Это тоже самое, что и поиск локальных переменных какой-либо функции в глобальной области видимости...
|
|
Back to top |
|
 |
Андрей Сумин
Участник форума

Joined: 23 Nov 2005
Posts: 60
Карма: 5 поощрить/наказать
Location: Москва
|
Posted: Thu Oct 19, 2006 3:36 pm (спустя 1 час 19 минут; написано за 2 минуты)
Post subject:
|
|
Да безусловно ... мне кажется я встречал на форуме пост где говорили что в каком-то браузере a может попасть в window, возможно перепутал с каким-то друшим форумом.
|
|
Back to top |
|
 |
AKS
Участник форума
Joined: 28 Dec 2005
Posts: 1174
Карма: 102 поощрить/наказать
|
Posted: Fri Nov 10, 2006 6:17 pm (спустя 22 дня 2 часа 40 минут; написано за 3 минуты 39 секунд)
Post subject:
|
|
Не нашел объяснения (хотя, если честно, искал недолго - что-то сил не осталось к концу недели) следующей "вещице". В FF функция, вызванная по тайм-ауту, по-умолчанию получает аргумент-number. Подскажите кто-нибудь пожалуйста, что это, а то у меня сил искать нет, а любопытно... Code (JavaScript): | скопировать код в буфер обмена | onload = test;
function test(e) { alert([e, typeof e]); test.i = test.i || 1; if(test.i++ < 3) setTimeout(test, 1000); } |
|
|
Back to top |
|
 |
Zeroglif
Участник форума
Joined: 02 Jan 2006
Posts: 293
Карма: 61 поощрить/наказать
|
Posted: Sat Nov 11, 2006 10:21 pm (спустя 1 день 4 часа 4 минуты; написано за 29 секунд)
Post subject:
|
|
Quote: |
Be careful with browsers that use the Mozilla Gecko engine (such as Firefox and Netscape 6+) as they will always pass an extra parameter to the function - the number of miliseconds error. | www.howtocreate.co.uk/tutorials/javascript/timers
Это?
|
|
Back to top |
|
 |
AKS
Участник форума
Joined: 28 Dec 2005
Posts: 1174
Карма: 102 поощрить/наказать
|
Posted: Sat Nov 11, 2006 10:40 pm (спустя 18 минут; написано за 3 минуты 26 секунд)
Post subject:
|
|
Zeroglif
Вот оно, объяснение, точно! Но почему Mozilla у себя на MDC не пишет? Так ведь голову можно сломать! А то я уже начал думать что это как-то связано с экстра-параметрами для тайм-аута, однако Opera их поддерживает, но по-умолчанию ничего не получает... Спасибо, я сам не откопал бы наверно!
|
|
Back to top |
|
 |
Андрей Сумин
Участник форума

Joined: 23 Nov 2005
Posts: 60
Карма: 5 поощрить/наказать
Location: Москва
|
Posted: Mon Nov 13, 2006 11:40 am (спустя 1 день 13 часов 18 секунд; написано за 2 минуты)
Post subject:
|
|
Zeroglif
Давно хотел разобраться сколько многотреден ли js или нет? На странице, которую Вы указали есть следующее: Quote: |
After the specified delay, the timeout will start a new thread | Однако во всех браузерах этот код выполняет функции всегда последовательно Code (JavaScript): | скопировать код в буфер обмена | var div = document.getElementById('monitor'); var monitor = ''; function print1(){ for (var i = 0; i < 100000; i++){ monitor += 'one ' } } function print2(){ for (var i = 0; i < 100000; i++){ monitor += 'two ' } } function print3(){ div.innerHTML = monitor; } window.setTimeout(print1, 0); window.setTimeout(print2, 0); window.setTimeout(print3, 5000); |
|
|
Back to top |
|
 |
AKS
Участник форума
Joined: 28 Dec 2005
Posts: 1174
Карма: 102 поощрить/наказать
|
Posted: Mon Nov 13, 2006 6:20 pm (спустя 6 часов 39 минут; написано за 10 минут 29 секунд)
Post subject:
|
|
Андрей Сумин
Пока "адресат" вашего вопроса отсутствует я по-быстренькому выскажусь по этому поводу. Quote: |
Давно хотел разобраться сколько многотреден ли js или нет? | Судя по всему Вы под "многотреден" подразумевали многопоточность. Поток выполнения видимо один - это следует из вашего примера. Не знаю, что имел ввиду автор, на которого Вы ссылаетесь, когда писал, что "по истечении тайм-аута код будет запущен бок-о-бок с выполняемым кодом". Может быть, конечно, код где-то там "внутри" и запускается, может быть даже и выполняется, но результат выполнения кода с тайм-аутом "встанет в очередь" за тем результатом, который нам готовит текущий исполняемый код. И результат тайм-аута нам не "видать" до тех пор, пока не увидим результат текущий. Так что, думаю, можно считать, что все в JavaScript происходит в порядке строгой очереди (одной очереди, одного потока, одной "ниточки").
|
|
Back to top |
|
 |
Андрей Сумин
Участник форума

Joined: 23 Nov 2005
Posts: 60
Карма: 5 поощрить/наказать
Location: Москва
|
Posted: Mon Nov 13, 2006 6:36 pm (спустя 15 минут; написано за 1 минуту 25 секунд)
Post subject:
|
|
Я тоже думаю что он однотреден в пользу этого факта говорит и то, что если функция вызывается по таймауту, она вызовется не сразу по истечению заданного времени, а через некоторое время не раньше заданного.
|
|
Back to top |
|
 |
Zeroglif
Участник форума
Joined: 02 Jan 2006
Posts: 293
Карма: 61 поощрить/наказать
|
Posted: Tue Nov 14, 2006 8:59 pm (спустя 1 день 2 часа 23 минуты; написано за 1 минуту 41 секунду)
Post subject:
|
|
Quote: |
многотреден ли js или нет? | Нет. Quote: |
the timeout will start a new thread | Видимо он имел в виду то, что каждый таймаут независим, насколько я помню, раньше последний поглощал предыдущие.
|
|
Back to top |
|
 |
AKS
Участник форума
Joined: 28 Dec 2005
Posts: 1174
Карма: 102 поощрить/наказать
|
Posted: Tue Nov 14, 2006 10:12 pm (спустя 1 час 12 минут; написано за 1 минуту 15 секунд)
Post subject:
|
|
Quote: |
насколько я помню, раньше последний поглощал предыдущие | Эх, как раньше было интересно! Жаль я этих всех "чудес" не видел... Простите пожалуйста за "лирическое отступление"!
|
|
Back to top |
|
 |
Dark-Demon
Участник форума
Banned
Joined: 04 Feb 2007
Posts: 45
Карма: -3 поощрить/наказать
Location: spb
|
Posted: Mon Feb 05, 2007 5:28 am (спустя 2 месяца 20 дней 7 часов 16 минут; написано за 42 секунды)
Post subject:
|
|
Quote: |
Да безусловно ... мне кажется я встречал на форуме пост где говорили что в каком-то браузере a может попасть в window, возможно перепутал с каким-то друшим форумом. | если мы объявляем переменную а как глобальную (не используя var), то да, в window - прямая дорога.
|
|
Back to top |
|
 |
|