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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальный объект события 
:(
    Опции темы
Иль
Дата 21.4.2005, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sardar @ 21.10.2004, 22:30)
function runtest(ev) {
  span_tag.onmyevent(ev? ev: window.event);

Я не пойму что такое ev и что хранится в этой переменной или объекте.


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


I ♥ <script>
****


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

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



Это аргумент! У меня он обычно называется evt; У Сара - ev... называй как хочешь smile
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 21.4.2005, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Цитата
Явное создание объекта типа function здесь видимо необходимо, да? Чтоб висело постоянно?

Просто создаём функцию, идеентично function(event) {...

Цитата
Я не пойму что такое ev и что хранится в этой переменной или объекте.

IE отличается от всего мира тем что обьект событие храниться в window.event(тем самым отемняя предпологаемую многопоточность), все другие отдают сей обьект первым аргументом, у меня это ev smile


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


Опытный
**


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

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



Цитата(Sardar @ 21.4.2005, 20:33)
Просто создаём функцию, идеентично function(event) {...

Понятно, значит вид задания функции непринципен

Вроде понял. И понял вот так.
В Геках у нас всегда висит глобальный объект в котором хранятся свойства событий и называется он event, а в ИЕ мы его получаем как подобъект window
Но тогда непонятно следующее:
Код

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>";
}

Как Гекоподобные сообразят, что на место ev надо подставить event? Что, получается, что единствинный параметр который может передаваться в обработчик событий это event и поэтому браузеры семейства Геко автоматически подставляют в tag.onclick=function(ev) объект event на место ev.
Если это так то все понятно, если нет, то как иначе может быть smile


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


I ♥ <script>
****


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

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



Цитата
Как Гекоподобные сообразят, что на место ev надо подставить event?

Под IE он написан 8))

Цитата
Ребят, поставте кавычку перед вторым +</b>"

Спасибо за замечание. Исправил.

Еще раз:
Обработчики событий по стандарту W3C DOM получают ссылку на объект события через параметр (аргумент), в то время как в IE DOM этот объект event является свойством объекта window.
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 22.4.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Цитата
Понятно, значит вид задания функции непринципен

Для Оперы 6 принципиален, т.к. она(в виду своей отстойности в плане скриптов) не подерживает конструкцию new Function.

Цитата
В Геках у нас всегда висит глобальный объект в котором хранятся свойства событий и называется он event, а в ИЕ мы его получаем как подобъект window

Нет, в Мозилле обьект событие передаётся только обработчику события, ни в каком глобальном контесксте обьект не существует(если ты его только не запишешь).
Повторю ИЕ хранит текущий обьект события в window.event, т.е. одновременно два события зажечся не могут.
В Мозилле и других W3C подобных обьект событие передаётся первым параметром функции обработчика события. Пофигу как сей параметр зовётся.

Если же ты делаешь inline событие то происходит такой фокус:

  • Под ИЕ создаётся анонимная функция без параметров, вызываемая при событии. Но window.event также существует как просто event в глобальном контексте, тем самым мы можем обращатся к обьекту как event:
    Код
    <span onclick="alert(event.offsetX)">Test</span>


  • В W3C подобном браузере создаётся функция с прототипом: function onclick(event);. Другими словами в контексте функции(а не в глобальном) существует параметр функции с именем event, в который браузер вкладывает обьект событие. Получается что можно опять писать:
    Код
    <span onclick="alert(event.layerX)">Test</a>

Как видим разницы "как будто нет", но на самом деле происходят совсем разные процессы. Также передаваемый обьект событие имеет совершенно разный интерфейс в ИЕ и W3C подобном браузере.

Цитата
Что, получается, что единствинный параметр который может передаваться в обработчик событий это event и поэтому браузеры семейства Геко автоматически подставляют в tag.onclick=function(ev) объект event на место ev.

И еще раз повторю, браузер передаёт обьект событие первым параметром функции и пофигу как сей параметр зовётся. Да, ты можешь определить сколь угодно параметров, но браузер передаст только один(а какую инфу еще передавать? ). Ты можешь сам потом вызвать обработчика события в ручную как myobject.onclick(<сохранённый заранее event>, <твои параметры>); - и передать сколь угодно параметров.

Надеюсь что теперь всё ясно. Главное не думать что в JS есть куча магии как в VB, нет здесь всё просто и логично и правила языка для всех(даже для встроенных фич) едины.


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


Опытный
**


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

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



Хорошо. Вникаю...
Про интерфейс тоже понятно, это видимо имеется ввиду: у кого target, а у кого и scrElement будет?
А остальноу буду доучивать по вашей статье.
Крайне нуждаюсь в умении вызывать событие из скрипта (активировать). Я прочитал только 1/3 статьи, надеюсь дальше эта активация есть.

Это сообщение отредактировал(а) Иль - 22.4.2005, 16:43


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


Опытный
**


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

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



Про активацию события из скрипта не нашел. Что посоветуете и есть ли это в интерфейсе window.event (знаю только W3C)?



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


Опытный
**


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

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



Извините, все работает. Запутался в if ... else

Если кто не знает, то чтоб не разбираться с DOM можно воспользоваться топором smile, т.е. вызвать метода объекта
Код

zzz.onclick();



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


Бегун
****


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

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



Цитата
Про интерфейс тоже понятно, это видимо имеется ввиду: у кого target, а у кого и scrElement будет?

Да там не только это, собстна только в последних разработках(когда W3C взялось за повозку) баузеры начали быть совместимыми. В ИЕ до сих пор нет человеческой модели событий W3C, приходится извращаться.

Как понять "активировать событие"? Можно вызвать обработчик события у обьекта в ручную, можно вызвать один из стандартных методов, например click() для кнопки, можно заюзать у document'а (createEvent)Mozilla - (createEventObject/fireEvent)IE для создания любого события...

Мозилла страдает отсутствием точной доки(нужно поискать), а для ИЕ как всегда на MSDN:
http://msdn.microsoft.com/workshop/author/...eventobject.asp
http://msdn.microsoft.com/workshop/author/...s/fireevent.asp
Добавлено @ 17:34
Упс, ты уже ответил сам себе smile


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


Опытный
**


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

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



Sardar
Цитата(Sardar @ 22.4.2005, 17:33)
можно вызвать один из стандартных методов, например click() для кнопки

Без on чтоли? Недопонял, как это?
А какие есть варианты. Можно без примеров, на словах поподробнее, ведь
Цитата
zzz.onclick();

не один же способ


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


I ♥ <script>
****


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

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



Цитата
Без on чтоли? Недопонял, как это?

Есть обработчик события, есть ссылка на событие, есть вызов события - и все это разные вещи!
Префикс on нужен только в простейшем inline объявлении или обращении к св-во объекта window. Есои событие имеется ввиду как метод - префикс не нужен уже 8))
PM MAIL WWW ICQ Skype   Вверх
Иль
Дата 23.4.2005, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А! Понял, тоесть можно писать
Цитата
zzz.click();

Если нет, то где используется без on


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


I ♥ <script>
****


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

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



Нет. Это не есть одно и тоже.
Когда при написании сценария необходимо обратиться к событию, тогда-то и используется имя события с префиксом on. Например, при подтверждении формы кнопка получает событие click, но для его установки нужно используется имя onclick.

ЗЫ: сам говорил что тема для тебя не понятная в данной статье - теперь она становится еще более непонятной - разделяю на две. СУВ.
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 23.4.2005, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Поясню на примере:
Код
<button id="test">Test</button><hr />
<span onclick="runtest('API')" style="border: 1ps solid black">Run test(API)</span><br />
<span onclick="runtest('just_func')" style="border: 1ps solid black">Run test(just_func)</span>

<script type="text/javascript">
<!--
var t=document.getElementById("test");
t.onclick=function(event, myparam1, myparam2) { //опредляем обработчика(традиционные события)
  event=event || window.event;
  alert("Событие onclick, параметры: "+event+", "+myparam1+", "+myparam2);
}

function runtest(type) {
  switch(type) {
    case "API": document.getElementById("test").click(); break; //вызываем один из методов кнопки
    case "just_func": document.getElementById("test").onclick({toString:function(){return "I am not an event Object!"}}, "param 1", "param 2"); break; //вызываем наш обработчик в ручную
    default: throw "Illigal argument exception: "+type; 
  }
}
//-->
</script>


Как видим метод click у кнопки есть один из его стандартных методов. Если ты определишь событие onmyevent, это не значит что появится метод myevent зажигающий это событие, повтрою еще раз: в JS нет(нет!, нет!!, нет!!!) магии smile Любая магия приводит к не ясному пониманию происходящих процессов, что не есть гуд. В JS этой проблемы нет.

Что клик по кнопке, что метод click генерят одинаковое событие на кнопке. Мы также можем вызвать обработчика события в ручную, но только для традисионных обработчиков. Добавив обработчика через addEventListener мы получить прямую ссылку на него уже не можем.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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