Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Javascript: динамически задаю обработчик события и получаю болт

2.2K
19 февраля 2008 года
e1vin
153 / / 04.06.2006
Код:

Код:
function show( dropDownId )
{
    var dropDown = document.getElementById( dropDownId );

    if ( dropDown )
    {
        dropDown.style.display = "block";
    }
}


function init(){
document.getElementById( "vasya" ).onmouseover = show( id + "List" );
}


Почему-то событие срабатывает сразу, и при том срабатывает постоянно при движении мыши в пределах body или контейнера, окружающего весь документ :eek: Получается, что в мозилле все менюшки раскрываются сразу же после вызова функции init(), а в IE - только первая

Пожалуйста, приведите пример правильного задания обработчика события.
24K
19 февраля 2008 года
ostgals
53 / / 27.08.2007
 
Код:
[...].onmouseover = function () { show( id + "List" ) };
2.2K
19 февраля 2008 года
e1vin
153 / / 04.06.2006
А в чем разница? В приведенном тобой случае, насколько я понимаю, всего лишь анонимная функция создается... По идее проблемы это не решит. Но буду дома - проверю, все равно спасибо :)
2.1K
19 февраля 2008 года
smoki
115 / / 05.11.2006
А попробуй так:

 
Код:
function getElementById( "vasya" ).onmouseover()
{
  show( id + "List" );
}
или так:
function document.getElementById( "vasya" ).onmouseover()
{
  show( id + "List" );
}

Но не уверен, что такой код будет работать в Firefox`e
24K
19 февраля 2008 года
ostgals
53 / / 27.08.2007
Цитата: e1vin
А в чем разница?



Разница большая.

Ты просто вызывал функцию show и пытался присобачить свойству onmouseover результат ее вызова. Что, впрочем, она честно и пыталась сделать.

Я присвоил свойству onmouseover новый объект функции, которая внутри себя вызывает твой нестандартный show. Нестандартный - потому что, согласно принципам DOM от W3C, обработчик события должен иметь единственный параметр - объект event, или вообще не иметь параметра.

Такой метод хорош и применяется довольно часто. Кроме того, он универсален для всех броузеров, поддерживающих модель событий.

2.1K
19 февраля 2008 года
smoki
115 / / 05.11.2006
В принципе я согласен с выше сказанным
2.2K
26 февраля 2008 года
e1vin
153 / / 04.06.2006
Спасибо, все уже давно прояснилось :) Теперь вопрос такой.

Присваиваю элементам обработчики событий в виде анонимных функций.
 
Код:
element.onclick = function()
{
  //blah-blah-blah
};


И не могу понять в каком контексте работает обработчик события? В контексте элемента, в котором это событие произошло? Тогда почему я не могу заранее созданное свойство window.temp прочитать из него? Эта переменная внутри почему-то просто равна null.

В общем, проблема в том, чтобы передать внутрь обработчика id элемента, а как - убей не пойму...
353
26 февраля 2008 года
Nixus
840 / / 04.01.2007
 
Код:
<div id='test123'>Нажми меня!</div>

<script><!--
document.getElementById('test123').onclick = function()
{
    alert(this.id);
};
--></script>
2.2K
26 февраля 2008 года
e1vin
153 / / 04.06.2006
Спасибо, но ты не понял вопрос. Мне нужно id другого элемента передать в функцию обработчика события :)
353
26 февраля 2008 года
Nixus
840 / / 04.01.2007
Код:
<div id='display1'>Тут написано одно.</div>
<div id='display2'>А тут уже другое.</div>
<div id='click1'>Нажми меня!</div>
<div id='click2'>И меня!</div>

<script><!--
function installOnclick(obj, id)
{
    obj.onclick = function()
    {
        alert(document.getElementById(id).innerText);
    };
}

installOnclick(document.getElementById('click1'), 'display2');
installOnclick(document.getElementById('click2'), 'display1');
--></script>
2.2K
26 февраля 2008 года
e1vin
153 / / 04.06.2006
Спасибо. А теперь возьми и проверь свой пример в Firefox. Будет "undefined'. И имхо очень даже правильно. Потому что функция-то вызывается не в момент объявления. А где она объявлена, в каком контексте - значения не имеет. Вызывается она в контексте окна, как обработчик события, если я правильно понимаю DOM.

ЗЫ. Хотя странно, что в Opera работает.
353
27 февраля 2008 года
Nixus
840 / / 04.01.2007
Цитата: e1vin
Спасибо. А теперь возьми и проверь свой пример в Firefox.


Ты просил пример как передать в обработчик id элемента. Он не подходит?
Контекст еще какой-то выдумал.

Код:
<div id='display1'>Тут написано одно.</div>
<div id='display2'>А тут уже другое.</div>
<div id='click1'>Нажми меня!</div>
<div id='click2'>И меня!</div>

<script><!--
function installOnclick(obj, id)
{
    obj.onclick = function()
    {
        alert('id='+id+'; innerHTML='+document.getElementById(id).innerHTML);
    };
}

installOnclick(document.getElementById('click1'), 'display2');
installOnclick(document.getElementById('click2'), 'display1');
--></script>
2.2K
27 февраля 2008 года
e1vin
153 / / 04.06.2006
Ха, "выдумал" :) Все-таки не потрудился проверить в FF? Не работает. И не будет, как я понимаю, твой пример работать.

Вот для примера, с http://developer.mozilla.org/en/docs/DOM:window.setTimeout, примечания к методу setTimeout() объекта window.

Цитата:
Code executed by setTimeout() is run in a separate execution context to the function from which it was called. As a consequence, the this keyword for the called function will be set to the window (or global) object, it will not be the same as the this value for the function that called setTimeout.



Для незнающих английский прилагаю мой вольный перевод:

Цитата:
Код, выполняемый функцией setTimeout() выполняется в отдельном контексте исполнения по отношению к функции, из которой он (код функции setTimeout()) вызывается. В результате this будет ссылаться на объект window (на глобальный объект), и, соответственно, будет отличаться от значения this внутри функции из которой setTimeout() вызывается.



Все-таки не я выдумал контекст :p

353
28 февраля 2008 года
Nixus
840 / / 04.01.2007
Цитата: e1vin
Все-таки не я выдумал контекст :p


В JS такого понятия как контекст исполнения нет. Один назвал контекстом это, другой - то. Так что контекст ты выдумал.

Цитата: e1vin
Все-таки не потрудился проверить в FF? Не работает. И не будет, как я понимаю, твой пример работать.


Я таки потрудился проверить в FF и у меня все работает, а если лень включить мозги, то никакие статьи с mozilla.org не помогут.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог