За последние 24 часа нас посетили 22363 программиста и 1052 робота. Сейчас ищут 612 программистов ...

DIV onkeydown=...

Тема в разделе "JavaScript и AJAX", создана пользователем topas, 31 окт 2006.

Статус темы:
Закрыта.
  1. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Сижу ковыряюсь в чужом коде... вопрос: это нормально, что на элемент DIV повесили onkeydown?
    Как ни странно в ИЕ это даже работает, ох уж это ИЕ: работает даже то, что не может никогда работать...
     
  2. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    topas, да бросьте вы... работает не только в IE.
     
  3. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    угу, вижу... W3c поднял... может... терь хотелось бы поянти логически... :)
    Хотя тогда почему же в FF не работает...
    Код (Text):
    1. oeList.onkeydown = Function('alert(1)');
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Объясните пожайлуста, почему это не работает в FF и работает в ИЕ
    Код (Text):
    1. <html>
    2. <head>
    3. <meta http-equiv="Content-Language" content="en" />
    4. <meta name="GENERATOR" content="Zend Studio" />
    5. <meta http-equiv="Content-Type" content="text/html; charset=cp1251" />
    6. <title>div onkeydown</title>
    7. </head>
    8. <body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966" alink="#FFCC99">
    9. <div onkeydown="alert(1)" onclick="alert('click')" style='background-color: #FFEEDD; border: 1px solid red; width: 250px; height: 250px'>
    10. </div>
    11. </body>
    12. </html>
     
  5. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2
    avm, зачем удалил свое сообщение? ;)
     
  6. Mavir

    Mavir Guest

    В FF работает
     
  7. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    topas, потому что я ошибочно принял его за другое событие... и одумался.

    onkeyup/onkeydown (это когда кнопка клавиатуры нажата/отжата) срабатывает в FF только для элемента обладающего фокусом... DIV не может обладать фокусом - он не из активных элементов...
     
  8. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
     
  9. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    topas, тут не в наличии события у элемента дело, а в условии его срабатывания... Какое нафик нажатие кнопки может быть у визуального элемента?


    Код (Text):
    1. <html>
    2. <head>
    3. <script type="text/javascript">
    4. // Cross-browser addEventListener()/attachEvent() replacement.
    5. // Thanks to: dklab.ru
    6. function addEvent(elt, name, handler, dependant, atEnd) {
    7.   name = name.replace(/^(on)?/, 'on');
    8.   var prev = elt[name];
    9.   var tmp = '__tmp';
    10.   if (dependant) elt['dep'] = dependant;
    11.   elt[name] = function(e) {
    12.     if (!e) e = window.event;
    13.     var result;
    14.     if (!atEnd) {
    15.       elt[tmp] = handler; result = elt[tmp](e); elt[tmp] = null; // delete() does not work in IE 5.0 (???!!!)
    16.       if (result === false) return result;
    17.     }
    18.     if (prev) {
    19.       elt[tmp] = prev; result = elt[tmp](e); elt[tmp] = null;
    20.     }
    21.     if (atEnd && result !== false) {
    22.       elt[tmp] = handler; result = elt[tmp](e); elt[tmp] = null;
    23.     }
    24.     return result;
    25.   }
    26.   return handler;
    27. }
    28.  
    29. var fn = function(e) {
    30.     alert(1);
    31. }
    32.  
    33. function start() {
    34.     var obj = document.getElementById("a1");
    35.     addEvent(obj,'onkeydown',fn);
    36. }
    37. </script>
    38. <title>div onkeydown</title>
    39. </head>
    40.  
    41. <body onload="start()">
    42. <div id="a1" style='background-color:#FED; border:1px solid red; width:250px; height:250px'>
    43. &nbsp;
    44. </div>
    45. </body>
     
  10. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Подумай над этим примером:
    Код (Text):
    1. <div onkeydown="alert(&quot;div&quot;)">
    2.  <input type="text" onkeydown="alert(&quot;input&quot;)" />
    3. </div>
     
  11. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    vasa_c, и? не хочешь сам над ним подумать?
     
  12. Anonymous

    Anonymous Guest

    баблинг события? Кстати, вариант...
     
  13. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Нет, я уже подумал, прежде чем писать.
    Про модель распространения события в документе слышал?
    Про то что событие имеет место не только для целевого элемента, но и для всех его предков по отцовской линии вплоть до прадедушки document?
     
  14. Anonymous

    Anonymous Guest

    vasa_c, если никто из предков не обработает его с cancelBubble=true.
     
  15. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    vasa_c, прочитайте внимательно что требовалось и что говорилось...

    человека интересовало клавиатурное событие к div'у а не к стороннему элементу.

    ваш пример имел бы смысл в данном случае только в таком виде:
    Код (Text):
    1. <div onkeydown="alert('div')">
    2.  <input type="text" onkeydown="alert('input')" style='display:none' />
    3. </div>
    что сделало бы его бессмысленным.

    p.s. аккуратнее с интонациями...
     
  16. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    avm я не знаю чего требовалось, я комментирую ваши высказывания, как то:
     
  17. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    ясно. возникло резкое желание поспорить именно с моими высказываниями, которые были ответом на вопрос "почему мышевое событие сработало у div'а, а клавиатурное - нет". вы - молодец! :lol:
     
  18. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Мне не хотелось спорить, мне захотелось рассказать или напомнить вам об одном нюансе. Извините, если вас задел мой тон.
     
  19. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    vasa_c, да ладно, замяли :)
    спасибо что напомнили, я этим постоянно пользуюсь...
    если бы вопрос изначально встал "как любыми средствами добиться получения div'ом клавиатурного события", то все повернулось бы совсем по другому... ;)
     
  20. Anonymous

    Anonymous Guest

    Я вот о чем задумался, чисто теоритически -
    Однако, если это скроллирующий DIV? Получается, на нем может стоять фокус? И он получит клавиатурные события? Или нет? Интересно даже не работоспособность этого, а логика - верно, или нет?
     
  21. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    Неа, не получает div фокуса даже при наличии у него вторичных признаков активного элемента...
    Код (Text):
    1. <form style="float:right;width:300px">Focus received by "A" or "DIV":<br /><input name="s" style="width:100%" /></form>
    2. <a href="#" onclick="return false" onfocus="forms[0].s.value+='A,';">test</a>
    3.  
    4. <div style="width:100px;height:100px;border:1px solid #000;overflow:auto;" onfocus="forms[0].s.value+='DIV,';" >
    5.   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 />
    6. </div>
    P.S. Надо же, из темы получилось интересное обсуждение.
     
  22. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    вся петрушка в том, что если по диву кликнуть мышью, а затем нажать кнопку на клавиатуре, то он обрабатывает событие onkeydown... но это только в ИЕ :(

    а проблема действительно в том, чтобы "любыми средствами" получить событие, причем интересует кроссбраузерный вариант... я уже молчу о том, что Опера не хочет отдавать свои горячие кнопки кому попало :((
     
  23. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    topas, тогда можно ставить в пределах div'а ссылку (можно даже пустую) или img и насильно ставить на нее фокус. Тогда по кнопке будет генериться наследованное событие.
     
  24. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    avm
    спасибо, попробую...
    Приведенный мной пример (см. выше) в ФФ "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1) Gecko/20061010 Firefox/2.0" также не работает :(
     
  25. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    topas, насколько я понимаю, это все может понадобиться для проверки того факта что клавиатурное событие сработало для какого-то элемента в пределах определенной области... Так?
    Вот в той области у вас что находится? может задачу не "в лоб" стоит решать...
     
Статус темы:
Закрыта.