Сижу ковыряюсь в чужом коде... вопрос: это нормально, что на элемент DIV повесили onkeydown? Как ни странно в ИЕ это даже работает, ох уж это ИЕ: работает даже то, что не может никогда работать...
угу, вижу... W3c поднял... может... терь хотелось бы поянти логически... Хотя тогда почему же в FF не работает... Код (Text): oeList.onkeydown = Function('alert(1)');
Объясните пожайлуста, почему это не работает в FF и работает в ИЕ Код (Text): <html> <head> <meta http-equiv="Content-Language" content="en" /> <meta name="GENERATOR" content="Zend Studio" /> <meta http-equiv="Content-Type" content="text/html; charset=cp1251" /> <title>div onkeydown</title> </head> <body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966" alink="#FFCC99"> <div onkeydown="alert(1)" onclick="alert('click')" style='background-color: #FFEEDD; border: 1px solid red; width: 250px; height: 250px'> </div> </body> </html>
Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2 avm, зачем удалил свое сообщение?
topas, потому что я ошибочно принял его за другое событие... и одумался. onkeyup/onkeydown (это когда кнопка клавиатуры нажата/отжата) срабатывает в FF только для элемента обладающего фокусом... DIV не может обладать фокусом - он не из активных элементов...
topas, тут не в наличии события у элемента дело, а в условии его срабатывания... Какое нафик нажатие кнопки может быть у визуального элемента? Код (Text): <html> <head> <script type="text/javascript"> // Cross-browser addEventListener()/attachEvent() replacement. // Thanks to: dklab.ru function addEvent(elt, name, handler, dependant, atEnd) { name = name.replace(/^(on)?/, 'on'); var prev = elt[name]; var tmp = '__tmp'; if (dependant) elt['dep'] = dependant; elt[name] = function(e) { if (!e) e = window.event; var result; if (!atEnd) { elt[tmp] = handler; result = elt[tmp](e); elt[tmp] = null; // delete() does not work in IE 5.0 (???!!!) if (result === false) return result; } if (prev) { elt[tmp] = prev; result = elt[tmp](e); elt[tmp] = null; } if (atEnd && result !== false) { elt[tmp] = handler; result = elt[tmp](e); elt[tmp] = null; } return result; } return handler; } var fn = function(e) { alert(1); } function start() { var obj = document.getElementById("a1"); addEvent(obj,'onkeydown',fn); } </script> <title>div onkeydown</title> </head> <body onload="start()"> <div id="a1" style='background-color:#FED; border:1px solid red; width:250px; height:250px'> </div> </body>
Подумай над этим примером: Код (Text): <div onkeydown="alert("div")"> <input type="text" onkeydown="alert("input")" /> </div>
Нет, я уже подумал, прежде чем писать. Про модель распространения события в документе слышал? Про то что событие имеет место не только для целевого элемента, но и для всех его предков по отцовской линии вплоть до прадедушки document?
vasa_c, прочитайте внимательно что требовалось и что говорилось... человека интересовало клавиатурное событие к div'у а не к стороннему элементу. ваш пример имел бы смысл в данном случае только в таком виде: Код (Text): <div onkeydown="alert('div')"> <input type="text" onkeydown="alert('input')" style='display:none' /> </div> что сделало бы его бессмысленным. p.s. аккуратнее с интонациями...
ясно. возникло резкое желание поспорить именно с моими высказываниями, которые были ответом на вопрос "почему мышевое событие сработало у div'а, а клавиатурное - нет". вы - молодец! :lol:
Мне не хотелось спорить, мне захотелось рассказать или напомнить вам об одном нюансе. Извините, если вас задел мой тон.
vasa_c, да ладно, замяли спасибо что напомнили, я этим постоянно пользуюсь... если бы вопрос изначально встал "как любыми средствами добиться получения div'ом клавиатурного события", то все повернулось бы совсем по другому...
Я вот о чем задумался, чисто теоритически - Однако, если это скроллирующий DIV? Получается, на нем может стоять фокус? И он получит клавиатурные события? Или нет? Интересно даже не работоспособность этого, а логика - верно, или нет?
Неа, не получает div фокуса даже при наличии у него вторичных признаков активного элемента... Код (Text): <form style="float:right;width:300px">Focus received by "A" or "DIV":<br /><input name="s" style="width:100%" /></form> <a href="#" onclick="return false" onfocus="forms[0].s.value+='A,';">test</a> <div style="width:100px;height:100px;border:1px solid #000;overflow:auto;" onfocus="forms[0].s.value+='DIV,';" > 1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /> </div> P.S. Надо же, из темы получилось интересное обсуждение.
вся петрушка в том, что если по диву кликнуть мышью, а затем нажать кнопку на клавиатуре, то он обрабатывает событие onkeydown... но это только в ИЕ а проблема действительно в том, чтобы "любыми средствами" получить событие, причем интересует кроссбраузерный вариант... я уже молчу о том, что Опера не хочет отдавать свои горячие кнопки кому попало (
topas, тогда можно ставить в пределах div'а ссылку (можно даже пустую) или img и насильно ставить на нее фокус. Тогда по кнопке будет генериться наследованное событие.
avm спасибо, попробую... Приведенный мной пример (см. выше) в ФФ "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1) Gecko/20061010 Firefox/2.0" также не работает
topas, насколько я понимаю, это все может понадобиться для проверки того факта что клавиатурное событие сработало для какого-то элемента в пределах определенной области... Так? Вот в той области у вас что находится? может задачу не "в лоб" стоит решать...