Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Эмуляция нажатия клавиш в body на jq (https://javascript.ru/forum/jquery/37619-ehmulyaciya-nazhatiya-klavish-v-body-na-jq.html)

antre 27.04.2013 01:50

Эмуляция нажатия клавиш в body на jq
 
Есть в документации на jq такая тема: http://api.jquery.com/category/events/event-object/
Исходя из которой следующая минидемка должна работать (нужно сэмулировать нажатие клавиши "таб", что бы установить фокус ввода на ссылку а, затем сэмулировать нажатие ентера)
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript">             
            function press(){
                var e = jQuery.Event("keydown", { keyCode: 9 });    //tab
                jQuery("body").trigger(e);
                var e = jQuery.Event("keydown", { keyCode: 13 });    //enter
                jQuery("body").trigger(e);
            }
        </script>
    </head>
    <body> 
        <a href="http://google.com">google</a>
        <form>
            <input type=button value="Нажать" onClick="press()">
        </form>
    </body>
</html>

Проверил в браузерах ff, chrome, под линухой и виндой, и ИЕ - ни где фокус ввода не устанавливается:( версия jq последняя, пробовал нажимать таб по несколько раз. Если юзать некроссбраузерный msdn-овский метод чисто для IE - всё ок, но не устраивает, нужен вебкит.
Где я налажал в коде? Или это бага? Или браузеры резко повысили безопасность и часть jq уже не работает?
Спасибо.

ЗЫ: фокусом ввода я называю такую рамочку из точек, указывающую какой элемент сейчас выбран

danik.js 27.04.2013 05:14

1) Программно вызванные события не влекут за собой действия по умолчанию. Это значит что если вызвать клик по ссылке - перехода не будет. И если вызвать событие keypress, то символ не напечатается. И это не бага, это - стандарт.
2) Сомневаюсь что jquery вызывает dispatchEvent. Впрочем можно затестить:

<script src="//code.jquery.com/jquery-latest.js"></script>
<script>
    document.addEventListener('keydown', function() {
        alert('Element.addEventListener');
    });
    
    $(document).keydown(function(){
        alert('jQuery.keydown');
    });
    
    var e = jQuery.Event("keydown", { keyCode: 9 });
    $(document).trigger(e);
</script>


Как видим, метод trigger всего лишь вызывает обработчики, навешанные через jQuery - то есть это уж тем более не повлечет каких-либо действий браузера :))

antre 27.04.2013 10:23

спасибо) буду знать

lol-kek 10.03.2017 04:53

это конечно не Tab►Enter, но можно использовать подобным образом
работает в Хроме и Мозилле

<body>
<a href="http://habrahabr.ru/post/114244/" id="element_id">banana</a>
</body>

<script>
var element = document.getElementById('element_id');

if(document.createEvent)
 {
  var o = document.createEvent('MouseEvents');
  o.initEvent('click', true, false );
  element.dispatchEvent(o);
} 
else if( document.createEventObject )
 {
   o.fireEvent('click');
}
</script>


Часовой пояс GMT +3, время: 18:58.