Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Все о событиях, учимся работать с событиями 
:(
    Опции темы
Aliance
  Дата 21.10.2004, 18:36 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Доброго всем времени суток!
Часто вижу, что события описывают (регистрируют) не верно с точки зрения совсестимости двух документных объектных моделей: IE и W3C.
Тут я опишу, как же это делать правельно.

Для начала напишу что есть две группы событий: можно сказать основные и дополнительные. Первые поддерживаются обеими моделями, вторые написаны исключительно под IE. Давайте рассмотрим первую группу (более часто используемые):

Цитата
onblur
onchange
onclick
onfocus
onload
onmouseover
onselect
onsubmit
onunload

Данные события работают под:

  • IE/Win 3+
  • IE/Mac 3.01+ (искл. onselect - 3+)
  • NN 2+


Цитата
onaboart
onerror
onmouseout
onreset

Данные события работают под:

  • IE/Win 4+ (искл. onmouseout - 3+)
  • IE/Mac 3.01+ (искл. onerror и onreset - 4+)
  • NN 3+


Цитата
ondbclick
onkeydown
onkeypress
onkeyup
onmousemove
onmousedown
onmouseup
onmove
onresize

Данные события работают под:
  • IE/Win 4+ (искл. onmove - 3+)
  • IE/Mac 4+ (искл. ondbclick - 3.01+)
  • NN 4+
Итак, теперь, если Ваш сайт расчитан на аудиторию, пользующуюся браузерами более устаревшими, чем приведены в минимальных требованиях - то событиями пользоваться нельзя!

Этап второй или регистрирование события непосредственно к JS-скрипте:

Код
function registerEvent(evt) {
   evt = (evt) ? evt : ((window.event) ? event : null )
   if (evt) {
      // выполняем последующие действия с событиями
      // ЕСЛИ ОНО СУЩЕСТВУЕТ
   }
}


Это позволяет выполнять дальнейшие действие, если событие ЕСТЬ в обоих разно-модельных браузерах.

evt = (evt) ? evt : ((window.event) ? event : null )
Здесь объявляется глобальная переменная (я обозначяю ее обычно как evt), далее проверяется она, равна ли она DOM`овскому значению evt, если нет, то выполняеться следующий этап проверки:
(window.event) ? event : null
Если значение равно window.event - то это IE`вский event, все очень просто.

Трудность и заключается в том, что в W3C evt (переменная) это evt, а в IE evt (переменная) - это event.

Так же и с остальными свойствами.

Вот они (IE - W3C):

cancelBubble - stopPropagation
(хотя это пожалуй является исключением, т.к. IE`вский способ поддерживаеться браузерами, основанными на Mozilla)
fromElement - relatedTarget
returnValue - preventDefault()
scrElement - target
toElement - relatedTarget
x, y - layerX, layerY

Таким образом, чтобы, скажем, узнать откуда пришел элемент, нужно писать так (используя совместимый синтаксис):
Код
function registerEvent(evt) {
   evt = (evt) ? evt : ((window.event) ? event : null )
   if (evt) {
      var target = (evt.target) ? evt.target : ((evt.scrElement) ? evt.srcElement : null )
      if (target && target.tagName && target.tagName.toLowerCase() == "a") {
         // обработываем, если ЕСТЬ событие, и элемент, с которого
         // это событие пришло - <a ...>...</a>
      }
   }
}


Это сообщение отредактировал(а) Aliance - 23.4.2005, 13:43
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 21.10.2004, 22:30 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Елки, все никак времени "родить" статью нет smile
Соберем в топике хорошие идеи, а затем сделаем ман по событиям smile

Коротко расскажу о типах регистрирования событий: inline(сразу в тег), традиционная модель(нетскейповская времен динозавров), навороченная модель(DOM, IE DOM).

Inline обработчики событий это код вставляемый непосредственно в тег:
Код
<span onclick="alert(event.type); /* выдаст нам click */">Test</span>

Браузер берет содержимое свойства onclick и создает по нему функцию, которую регистрирует как обработчика этого события. Это можно представить кодом:
Код
<span id="test" onclick="alert(arguments[0].type)" onmyevent="this.style.background='#a98df5'" onmouseover="runtest()">Test</span>
<script language="Javascript" type="text/javascript">
<!--
var span_tag=document.getElementById("test");
var myev=span_tag.getAttribute("onmyevent"); //достаем "тело функции"
span_tag.onmyevent=new Function("event", myev); //создаем функцию
//на самом деле созданная этим способом функция будет работать медленней(микросекунды?) чем созданная и поностью скомпилированная браузером.
function runtest(ev) {
  span_tag.onmyevent(ev? ev: window.event);
}
//-->
</script>

Созданная браузером функция имеет один аргумент: event - обьект содержащий инфу о событии, некоторые из его свойств описал Aliance выше. Для ИЕ это не совсем верно, т.к. обьект event приходит к нам из контекста window, а не аргументом, так что arguments.length вернет нам 0.
Ссылка this указывает на тег, т.е. функция-обработчик это метод(или принадлежит, оба утверждения верные) обьекта-тега.


Традиционная модель подразумевает вызов браузером определенных методов обьекта, при каждом событии:
Код
var tag=document.getElementById("test");
tag.onclick=function(ev) {
  //В IE event приходит из контекста window
  var tgt=window.event? window.event.srcElement: ev.target;
  this.style.backroundColor=this.getAttribute("click_color");
  this.innerHTML="<b>"+tgt.nodeName+"</b>";
}

Это то же самое что мы сделали выше сами - вызвали метод onmyevent. Заметим что мы получаем те же аргументы что и в inline обработчике, this указывет на тег(ведь это его метод).

В обоих способах мы имеем ссылку this, через которую мы работаем с тегом, которому принадлежит обработчик события. Поля srcElement/target, как положенно, содержат ссылки на обьект над которым совершилось событие:
Код
<div onclick="alert((event.srcElement? event.srcElement: event.target).nodeName);">Обработка <span>событий</span></div>

Кликнув по "событий" мы получим alert окошко с именем тега span. T.e. браузер при совершившимся событии создает обьект event, в который устанавливает обьект над которым совершилось событие и затем последовательно вызывает обработчиков событий для всех предков обьекта. Это называется bubbling. Восхождение от предков к обьекту над которым совершилось событие назывется capturing.
Древний нетексейп4 поддерживал только capturing, ИЕ поддерживает только bubbling, а Mozilla(Gecko), согласно модели предложенной в DOM2 оба поведения: сначала событие бежит от document к обьекту над которым свершилось событие(capturing mode), а затем спускается назад к document. Это мы рассмотрим ниже, когда придем к "навороченным" моделям событий, и далее в этом топике, тема довольно обьемная.


Навороченная(advanced) модель собтыий делится на две ветви: модель DOM2 и модель от MS, у последней у смысл гораздо шире чем просто модель событий. Мы здесь не будем рассматривать behaviors, фича(очень хорошая), но подерживается только ИЕ.

Методы addEventListener/removeEventListener позволяют установить/удалить обработчиков событий - на одно событие может быть сколь угодно много обработчиков, в отличии от традиционной модели. Узнать установленно ли собтыие пока нельзя smile, но можно его удалить, даже если обработчик не задан, то никаких исключений/ошибок не будет.

Следующий код работает только в Мозилле и Опере. Устанавливаем события:
Код
<div id="test">Test <span id="test2">Test2 <span id="test3">Test3</span></span></span>
<script language="Javascript" type="text/javascript">
<!--
var tag=document.getElementById("test");
var tag2=document.getElementById("test2");
var tag3=document.getElementById("test3");
tag.addEventListener("click", test_func, false); //режим bubbling
tag2.addEventListener("click", test_func, true); //режим capturing
tag3.addEventListener("click", test_func, false); //режим bubbling
function test_func(ev) {
 alert(this.nodeName+"-"+this.getAttribute("id") + ", "+ev.target.nodeName+"-"+ev.target.getAttribute("id"));
}
//-->
</script>

Теперь кликнем на "Test3", выполенение:
span-test2, span-test3
span-test3, span-test3
div-test, span-test3


То есть событие начало работу в режиме capturing, обошло всех обработчиков зарегистрированных для этого режима(span-test2), затем дошло до обьекта над которым совершилось событие(span-test3), и вернулось обратно в режиме bubbling (div-test).
Ссылка this указывает как и раньше на обьект, к которому принадлежит событие.
Для того что бы удалить событие, согласно принципам DOM'овцев нужно предоставить самого обработчика события:
Код

//если у обьекта tag зарегистрирован под событием click обработчик test_func, 
//зарегистрированный в режиме bubbling, то он удалится,
//иначе ничего не произойдёт.
tag.addEventListener("click", test_func, false);



Модель ИЕ: attachEvent/detachEvent. Принцип тот же самый, только нет третьего параметра, т.к. ИЕ всегда работает в bubbling режиме. Но есть пара недочётов:
Код
<div id="test">Test</span>
<script language="Javascript" type="text/javascript">
<!--
var tag=document.getElementById("test");
tag.attachEvent("onclick", test_func); //все имена событий начинаются на on
function test_func(ev) { //ссылка this указывает на обьект window
 alert(this.document.title+", "+this.status + ", event target: "+ev.srcElement.nodeName+"-"+ev.srcElement.getAttribute("id"));
 this.status="Елки, это обьект window!!!";
}
//-->
</script>

Замечаем что нам передается обьект сбытия первым аргументом, да такой что window.event==ev выдаст нам false, т.е. это не ссылка на window.event. Все имена событий начинаются на префикс on. Но самый большой недостаток, это ссылка this - она указывает на обьект window, а не на тег, к которому принадлежит событие, проще говоря теперь нам эта ссылка как козе баян.
Xотя если кто копнёт глубже, то узнает о существовании обьекта element в bechaviors, который указывает на тег.

Давайте пификсим "оплошность" ИЕ и сделаем его хоть частично совместимым с DOM2. Для этого нам нужно имплементировать метод addEventListener для каждого обьекта тега. И тут мы наткнёмся на самое большое надругательство над JavaScript - у тегов нет свойства prototype smile. Вот как, после такого это все JavaScript'ом назвать...
Поэтому мы будем проверять каждый обьект, на существование addEventListener, если метода нет, то добавим его.
И так имплементируем пока 3 функции:
Код
//существует ли нужное API
function ensureAddEventListener(obj) {
 if(!obj.addEventListener) obj.addEventListener=myEventListener;
}
//наша имплементация addEventListener
function myEventListener(name, func, dummyDirection) {
  if(!this.elisteners) this.elisteners={}; //регистр событий
  if(!this.elisteners[name]) this.elisteners[name]=[];
  //стандартное поведение, если обработч. уже есть, то ничего не делаем
  for(var i=0; i<this.elisteners[name].length; i++) if(this.elisteners[name][i]==func) return;
  this.elisteners[name].push(func);
  this["on"+name]=myEventHandler;
}
//обработчик вызывающий последовательно все зарег. обарботчики.
function myEventHandler() {
  if(this.elisteners[window.event.type])
   for(var i=0; i<this.elisteners[window.event.type].length; i++) this.elisteners[window.event.type][i].call(this, window.event);
}

Фиксим только ИЕ5.5 - ИЕ6.0, убожество под именем ИЕ5.0 не поддерживает метода call для функций, push для массивов и многое другое.

В результате имеем стандартное(DOM2) поведение для ИЕ, правда работающее только в bubbling режиме. А самое главное, что теперь имеем ссылку this, ради которой все и начиналось. Пример использования:
Код
var div=document.getElementById("test");
ensureAddEventListener(div);
div.addEventListener("click",function() {this.style.backgroundColor="#a98df5";}, false);
div.addEventListener("click",function() {alert("OK");}, false);

Код будет работать везде правильно.

Удаление обработчика имплементируйте сами smile

Это сообщение отредактировал(а) Aliance - 22.4.2005, 11:23


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Sardar
Дата 22.10.2004, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Что же обозначают три аргумента этого метода:

Первый аргумент - строка - имя события, имена событий всегда идут без префикса on, что логично
Второй аргумент - функция - функция обработчик, вызываемая для обработки события
Третитй аргумент - boolean - направление в котором мы хотим зарегистрировать обработчика: capturing - true, bubbling - false. Что это за направления читайте выше. Скоро раскрою эту тему дальше в этом топике.

Это сообщение отредактировал(а) Aliance - 23.4.2005, 13:45


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Aliance
Дата 4.11.2004, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Цитата
Скоро раскрою эту тему дальше в этом топике.

Помогаю:

Многие часто пытаються предотвратить просмотр страницы путем блокирования нажатия на правую кнопку мыши. До конца это Вам все равно не удасться сделать smile Невозможно предотвратить возможность, скажем, пользователю сохранить картинку (если она не сгенерирована сервером). Но все же, т.к. ВОпрос ЧАстозадаваемый, то я открою занавесу над этой процедурой:

Код

// Работает в IE5/Win и NN6
function blockEvents(evt) {
    evt = (evt) ? evt : event;
    var blockit = false;
    var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
    if (elem && elem.tagName && elem.tagName.toLowerCase() == "img") {
        if (evt.cancelBubble) {
            evt.cancelBubble = true;
        }
        alert("Нельзя.");
        return false;
    }
}
document.oncontextmenu = blockEvents;

// Ее вариант, пересмотренный с учетом специикаций IE
function blockEvents() {
    var blockit = false;
    var elem = event.srcElement;
    if (elem && elem.tagName && elem.tagName.toLowerCase() == "img") {
        event.cancelBubble = true;
        event.returnValue = false;
        alert("Нельзя.");
    }
}

// А это чисто W3C DOM`вский синтаксис
function blockEvents(evt) {
    var blockit = false;
    var elem = (evt.target);
    if (elem && elem.tagName && elem.tagName.toLowerCase() == "img") {
        evt.preventDefault();
        evt.stopPropagation();
        alert("Нельзя.");
    }
}

==============================================================

Значения свойства button в модели событий:
(IE 4+ === NN 6+)
Нет кнопки: 0 === null
Левая: 1 === 0
Средняя: 4 === 1
Правая: 2 === 2
Л+П: 3 === -
Л+С: 5 === -
П+С: 6 === -
Л+С+П: 7 === -

==============================================================

Чаще всего, имхо, события используються при работе с элементами формы и ссылками.

В дальнейший сообщениях я расскажу как предотвратить повторный щелчок на кнопке; как избежать повторной отправки данных; как исключить отправку данных формы при нажатии на клавишу Enter; и многое другое 8))

Подробнее...

Это сообщение отредактировал(а) Aliance - 6.4.2005, 21:07
PM MAIL WWW ICQ Skype   Вверх
Aliance
Дата 23.4.2005, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Вот неплохая вещица, возможна поможет понимать (!) что есть такое событие:
http://www.quirksmode.org/js/eventexample.html
PM MAIL WWW ICQ Skype   Вверх
Иль
Дата 9.7.2005, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Sardar, получается это
Цитата(Sardar @ 21.10.2004, 22:30)
dummyDirection

у тебя в качестве декоротивной заглушки, так сказать, чтоб соответствовать стандартам DOM2 smile .

Скажи, я не улавил такую тонкость, разве нельзя переделав твой скрипт capturing организовать, ну для не меняемой особо ветви DOM?


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 10.7.2005, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Цитата
у тебя в качестве декоротивной заглушки, так сказать, чтоб соответствовать стандартам DOM2

Угу, на то и имеет префикс dummy smile

Цитата
Скажи, я не улавил такую тонкость, разве нельзя переделав твой скрипт capturing организовать, ну для не меняемой особо ветви DOM?

Не реально, ведь код использует механизм "традиционных" событий, а они работают только в bubbling режиме(проход пузырька от того на ком кликнули до корня документа). По сути код ведёт список "делегатов", которые вызывает как только возникнет событие, похоже как в C#.

Capturing mode используеться крайне редко, я ещё никогда не использовал. Впрочем это скорее из-за того что ИЕ ни в какую capturing поддерживать не хочет.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 10.7.2005, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



А разве нельзя по событию на элементе в его обработчике пробежаться по ветви к document, собрать информацию кто имеет такое же событие, например onclick, запомнить порядок нод, да и запулить от корня к ноде на которой сработало событие все эти обработчики. Или fireEvent не запустит заданные традиционно события, а работает только с прикрепленными attachEvent. Покрайней мере можно запустить обработчики.
Sardar, мне правда это не надо совсем, просто ужасно интересно.

Отдельное спасибо, конечно, за тонкости навороченной модели в ИЕ. Как говорится, меньше придется испытать на своей шкуре smile, да и времени сэкономится.



--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Aliance
Дата 10.7.2005, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Иль,
в событийной модели IE, в отличие от модели DOM Level 2, нет понятия перехвата события (capturing). Однако, в модели IE - так же, как в модели DOM, события всплывают по иерархии включения их в документ. В обоих моделях всплывание события относится только к необработаным событиям или событиям воода (это, собственно, уже другой вопрос), но не к "высокоуровневым" событиям. Основное различие между всплыванием в IE и в DOM состоит в способе остановки всплывания. В IE нет метода stopPropagation(). Чтобы предотвратить всплывание события или остановить всплывание далее по иерархии, обработчик в IE должен установить свойство cancelBubble равным true. Оно применяется только к текущему событию.
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 11.7.2005, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Aliance почти, модель одна, просто DOM'овские события чуть мощней. Обычно при возникновении события, от его источника оно бежит к предкам вызывая своих обработчиков на лету. Любой получив событие может его остановить. Это bubbling mode.

Capturing mode это подьём обьекта события от предка до виновника события, то есть то же самое, только направление меняеться.

В Gecko любое событие проходит две фазы, capturing, т.е. оно начинаеться от document и бежит к виновнику события, затем bubbling, оно спускаеться назад.


Иль, конечно можно получив событие под ИЕ, остановить его, а затем собрать все обработчики событий до предка, вызвать их в capturing и в bubbling mode, НО ты ведь понимаешь как это будет глючно и медленно smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Aliance
Дата 11.7.2005, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Цитата(Sardar @ 11.7.2005, 02:43)
модель одна, просто DOM'овские события чуть мощней.

Позволь не согласится. Даже DOM`овская модель бывает не одна - Event DOM Level 0 и Event DOM Level 2.

В Событийной модели Level 0 браузер передает событие тем элементам документа, в которых они происходят. Если объект имеет соотв. обработчик события - этот обработчик запускается. И больше ничего не происходит. В DOM Level 2 все гораздо сложнее :-) Там когда событие происходит в узле документа (кстати, его еще называют целевым узлом события), вызывается обработчик(и) события целевого узла, но, кроме того, каждый из узлов-предков имеет 1-2 возможности обработать это событие.
Распространение события осуществляется в 3 этапа:
  • Этап перехвата. Сперва событие распространяется от объекта Document вниз по дереву документа к целевому узлу. Если у кого-либо из предков целевого узла (но не у него самого) есть обработчик(и) события, они запускаются на данном этапе распространения.
  • Этап распространения. Происходит в самом целевом узле: запускаются любые обработчики события, зарегистрированные непосредственно в данном целевом узле. (этот этап аналогичен обработке событий в модели Level 0)
  • Этап всплывания. На этом этапе событие распространяется (“всплывает”) обратно вверх по иерархии документа от элемент к объекту Document. Если на этапа перехвата по дереву документа распространяются все события, то то на этапе всплывания учавствуют не все: например тот же submit - не имеет смысла просто его распространять за рамками элемента <form> :-) А такие универсальные события, как mousedown и т.д., могут быть интересны для любого элемента smile

PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 11.7.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



DOM 0 существует условно, его нет, нет такой спецификации (поправте если не прав). DOM 0 это наследие прошлых лет, обьекты window и прочие, "традиционная модель" событий и т.д.

"Традиционная модель" поддерживала только одного обработчика на одно событие и режим только bubbling, т.е. "этап перехвата" не существовал. Затем парни из W3C поняли что это не совсем удобно и решили сделать механизм регистрации и зажигания событий, для которых существовала бы ещё одна фаза capturing.

Ты прав когда говоришь что модели событий разные, да они разные. Но идея всплывания события была давно, W3C DOM'овские события работают по такому же принципу, только добавилась ещё одна фаза smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 5.8.2005, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Цитата(Aliance @ 21.10.2004, 18:36)
layerX, layerY

Что-то я не нашел такого в DOM, это что?


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 5.8.2005, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Это координаты от верхнего левого угла бокса элемента. Да, это не входит в DOM(парни из W3C похоже вообще об этом не подумали smile ). Пришло как наследие из нетскейпа по моему.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 15.1.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Цитата(Sardar @ 21.10.2004, 22:30 Найти цитируемый пост)

function myEventHandler() {
  if(this.elisteners[window.event.type])
  for(var i=0; i<this.elisteners[window.event.type].length; i++) this.elisteners[window.event.type][i].call(this, window.event);
}

Sardar, интересно, почему используеш call?
Пример без call
Цитата(Sardar @ 21.10.2004, 22:30 Найти цитируемый пост)

function myEventHandler() {
  if(this.elisteners[window.event.type])
  for(var i=0; i<this.elisteners[window.event.type].length; i++) {this.vari=this.elisteners[window.event.type][i];this.vari(window.event);}



--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1738 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.