Javascript: динамически задаю обработчик события и получаю болт
{
var dropDown = document.getElementById( dropDownId );
if ( dropDown )
{
dropDown.style.display = "block";
}
}
function init(){
document.getElementById( "vasya" ).onmouseover = show( id + "List" );
}
Почему-то событие срабатывает сразу, и при том срабатывает постоянно при движении мыши в пределах body или контейнера, окружающего весь документ :eek: Получается, что в мозилле все менюшки раскрываются сразу же после вызова функции init(), а в IE - только первая
Пожалуйста, приведите пример правильного задания обработчика события.
{
show( id + "List" );
}
или так:
function document.getElementById( "vasya" ).onmouseover()
{
show( id + "List" );
}
Но не уверен, что такой код будет работать в Firefox`e
Разница большая.
Ты просто вызывал функцию show и пытался присобачить свойству onmouseover результат ее вызова. Что, впрочем, она честно и пыталась сделать.
Я присвоил свойству onmouseover новый объект функции, которая внутри себя вызывает твой нестандартный show. Нестандартный - потому что, согласно принципам DOM от W3C, обработчик события должен иметь единственный параметр - объект event, или вообще не иметь параметра.
Такой метод хорош и применяется довольно часто. Кроме того, он универсален для всех броузеров, поддерживающих модель событий.
Присваиваю элементам обработчики событий в виде анонимных функций.
{
//blah-blah-blah
};
И не могу понять в каком контексте работает обработчик события? В контексте элемента, в котором это событие произошло? Тогда почему я не могу заранее созданное свойство window.temp прочитать из него? Эта переменная внутри почему-то просто равна null.
В общем, проблема в том, чтобы передать внутрь обработчика id элемента, а как - убей не пойму...
<script><!--
document.getElementById('test123').onclick = function()
{
alert(this.id);
};
--></script>
<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>
ЗЫ. Хотя странно, что в Opera работает.
Ты просил пример как передать в обработчик id элемента. Он не подходит?
Контекст еще какой-то выдумал.
<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>
Вот для примера, с http://developer.mozilla.org/en/docs/DOM:window.setTimeout, примечания к методу setTimeout() объекта window.
Для незнающих английский прилагаю мой вольный перевод:
Все-таки не я выдумал контекст :p
В JS такого понятия как контекст исполнения нет. Один назвал контекстом это, другой - то. Так что контекст ты выдумал.
Я таки потрудился проверить в FF и у меня все работает, а если лень включить мозги, то никакие статьи с mozilla.org не помогут.