Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Тест. Маленький, но развивает. (Zeroglif, оценка: 1)
Goto page Previous  1, 2
Author Message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Fri Oct 06, 2006 12:01 pm (написано за 28 секунд)
   Post subject:
Reply with quote

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
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Oct 06, 2006 7:00 pm (спустя 6 часов 58 минут; написано за 9 минут 38 секунд)
   Post subject:
Reply with quote

Этот тест позволил сделать неприятный вывод - все сводится к тому, что (как писал Zeroglif) при прохождении каждого элемента создается новый объект event. Вывод неприятен тем, что такую модель поведения очень трудно понять, ведь она на первый взгляд выглядит нерационально, и если бы такое поведение не уходило корнями в далекое, мрачное прошлое (как отметил WingedFox), то в наши дни это выглядело бы просто как "победа над разумом" в пользу разработчиков MSIE.
Хотя мне еще рановато судить о логике в программировании, но уж простите - не удержался, ведь вчера я напрасно потратил уйму времени на эту самую "модель", а мог бы потратить на какую-нибудь другую. ;)
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Oct 07, 2006 8:02 am (спустя 13 часов 2 минуты; написано за 4 минуты 12 секунд)
   Post subject:
Reply with quote

Zeroglif
Остается выяснить еще такую вещь. Вы дважды написали, что "в event Object можно писать всё", но не пояснили - есть ли в этом с вашей точки зрения какой-либо практический смысл (т.е. можно ли сделать так, чтобы в первом тесте с e.changed увидеть не undefined). Может все-же есть какой-нибудь "лоффкий" способ сохранить что-то записанное в объект event? А то я потерял покой и сон - не "отпускает" меня все это дело. Выручайте!
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Sat Oct 07, 2006 8:36 am (спустя 34 минуты; написано за 1 минуту 1 секунду)
   Post subject:
Reply with quote

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
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Oct 07, 2006 1:34 pm (спустя 4 часа 57 минут; написано за 3 минуты 10 секунд)
   Post subject:
Reply with quote

WingedFox
Не-е-ет, об этом я сам писал с самого начала обсуждения event (себя цитировать не буду). А сегодня я прошу Zeroglif "приподнять занавес", скрывающий великую тайну записи в event Object, который создается как раз не при помощи метода document.createEventObject(), а "болтается" в глобальном пространстве и именуется window.event...
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Oct 07, 2006 1:49 pm (спустя 15 минут; написано за 1 минуту 34 секунды)
   Post subject:
Reply with quote

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
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Oct 07, 2006 2:27 pm (спустя 38 минут; написано за 5 минут 15 секунд)
   Post subject:
Reply with quote

Zeroglif
Quote:
Не при прохождении каждого элемента, а при встрече с обработчиком.
Да, конечно! Это я на своем тесте "зациклился" - там к ряду три элемента имеют обработчики клика.
Ну а с e.changed == undefined в каждом новом event Object интересно получилось - я ведь думал, что нельзя добавить "свое" св-во динамичестки просто потому, что "ну нельзя и все", а оказывается потому, что создаются разные объекты (а самое интересное, что document.createEventObject будет один на всех, но что-то я уже повторяюсь - пора с этим заканчивать)...
Back to top
View user's profile Send private message Send e-mail
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Mon Oct 09, 2006 10:25 am (спустя 1 день 19 часов 57 минут; написано за 1 минуту 27 секунд)
   Post subject:
Reply with quote

Quote:
Не при прохождении каждого элемента, а при встрече с обработчиком.
Погодите, вроде мой тест показывает что 2 разных обработчика, но на одном объекте и на одном событии делят один общий объект event, хоть и делают это по очереди.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Mon Oct 09, 2006 11:12 am (спустя 46 минут; написано за 14 минут 40 секунд)
   Post subject:
Reply with quote

Есть надстройка над 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
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Mon Oct 09, 2006 12:10 pm (спустя 58 минут; написано за 3 минуты 44 секунды)
   Post subject:
Reply with quote

Андрей Сумин 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
View user's profile Send private message
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Mon Oct 09, 2006 12:53 pm (спустя 42 минуты; написано за 8 секунд)
   Post subject:
Reply with quote

Согласен.
Back to top
View user's profile Send private message
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Thu Oct 19, 2006 11:27 am (спустя 9 дней 22 часа 34 минуты; написано за 2 минуты 38 секунд)
   Post subject:
Reply with quote

В завершение не вопрос а просто пример.
Code (JavaScript): скопировать код в буфер обмена
a();
new function a(){alert (1)};
ИЕ выдаст алерт Лиса и Опера ошибку как и во всех предыдущих примерах (после new должен идти NewExpression).
Code (JavaScript): скопировать код в буфер обмена
a();
new function b(){
    function a(){alert (1)};
}
a();
Никто из браузеров не дает увидеть a на пределами объекта b.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Thu Oct 19, 2006 2:17 pm (спустя 2 часа 49 минут; написано за 4 минуты 1 секунду)
   Post subject:
Reply with quote

Андрей Сумин wrote:
Никто из браузеров не дает увидеть a на пределами объекта b.
Ну-у-у, это уже "перебор" ;). С какой стати inner function будет видна? Это тоже самое, что и поиск локальных переменных какой-либо функции в глобальной области видимости...
Back to top
View user's profile Send private message Send e-mail
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Thu Oct 19, 2006 3:36 pm (спустя 1 час 19 минут; написано за 2 минуты)
   Post subject:
Reply with quote

Да безусловно ... мне кажется я встречал на форуме пост где говорили что в каком-то браузере a может попасть в window, возможно перепутал с каким-то друшим форумом.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Nov 10, 2006 6:17 pm (спустя 22 дня 2 часа 40 минут; написано за 3 минуты 39 секунд)
   Post subject:
Reply with quote

Не нашел объяснения (хотя, если честно, искал недолго - что-то сил не осталось к концу недели) следующей "вещице". В 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
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Nov 11, 2006 10:21 pm (спустя 1 день 4 часа 4 минуты; написано за 29 секунд)
   Post subject:
Reply with quote

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
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Nov 11, 2006 10:40 pm (спустя 18 минут; написано за 3 минуты 26 секунд)
   Post subject:
Reply with quote

Zeroglif
Вот оно, объяснение, точно! Но почему Mozilla у себя на MDC не пишет? Так ведь голову можно сломать! А то я уже начал думать что это как-то связано с экстра-параметрами для тайм-аута, однако Opera их поддерживает, но по-умолчанию ничего не получает... Спасибо, я сам не откопал бы наверно!
Back to top
View user's profile Send private message Send e-mail
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Mon Nov 13, 2006 11:40 am (спустя 1 день 13 часов 18 секунд; написано за 2 минуты)
   Post subject:
Reply with quote

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
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Nov 13, 2006 6:20 pm (спустя 6 часов 39 минут; написано за 10 минут 29 секунд)
   Post subject:
Reply with quote

Андрей Сумин
Пока "адресат" вашего вопроса отсутствует я по-быстренькому выскажусь по этому поводу.
Quote:
Давно хотел разобраться сколько многотреден ли js или нет?
Судя по всему Вы под "многотреден" подразумевали многопоточность. Поток выполнения видимо один - это следует из вашего примера. Не знаю, что имел ввиду автор, на которого Вы ссылаетесь, когда писал, что "по истечении тайм-аута код будет запущен бок-о-бок с выполняемым кодом".
Может быть, конечно, код где-то там "внутри" и запускается, может быть даже и выполняется, но результат выполнения кода с тайм-аутом "встанет в очередь" за тем результатом, который нам готовит текущий исполняемый код. И результат тайм-аута нам не "видать" до тех пор, пока не увидим результат текущий.
Так что, думаю, можно считать, что все в JavaScript происходит в порядке строгой очереди (одной очереди, одного потока, одной "ниточки").
Back to top
View user's profile Send private message Send e-mail
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Mon Nov 13, 2006 6:36 pm (спустя 15 минут; написано за 1 минуту 25 секунд)
   Post subject:
Reply with quote

Я тоже думаю что он однотреден в пользу этого факта говорит и то, что если функция вызывается по таймауту, она вызовется не сразу по истечению заданного времени, а через некоторое время не раньше заданного.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Tue Nov 14, 2006 8:59 pm (спустя 1 день 2 часа 23 минуты; написано за 1 минуту 41 секунду)
   Post subject:
Reply with quote

Quote:
многотреден ли js или нет?
Нет.
Quote:
the timeout will start a new thread
Видимо он имел в виду то, что каждый таймаут независим, насколько я помню, раньше последний поглощал предыдущие.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Nov 14, 2006 10:12 pm (спустя 1 час 12 минут; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

Quote:
насколько я помню, раньше последний поглощал предыдущие
Эх, как раньше было интересно! Жаль я этих всех "чудес" не видел...
Простите пожалуйста за "лирическое отступление"!
Back to top
View user's profile Send private message Send e-mail
Dark-Demon
Участник форума
Banned


Joined: 04 Feb 2007
Posts: 45
Карма: -3
   поощрить/наказать

Location: spb

PostPosted: Mon Feb 05, 2007 5:28 am (спустя 2 месяца 20 дней 7 часов 16 минут; написано за 42 секунды)
   Post subject:
Reply with quote

Quote:
Да безусловно ... мне кажется я встречал на форуме пост где говорили что в каком-то браузере a может попасть в window, возможно перепутал с каким-то друшим форумом.
если мы объявляем переменную а как глобальную (не используя var), то да, в window - прямая дорога.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page Previous  1, 2
Page 2 of 2    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML