Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Имитация нажатия на клавишу (https://javascript.ru/forum/misc/29789-imitaciya-nazhatiya-na-klavishu.html)

9xakep 11.07.2012 13:15

Имитация нажатия на клавишу
 
В общем нужно сэмулирвоать нажатие клавиши, начал искать, нашел такой код на jq:
<script src='http://code.jquery.com/jquery-1.7.2.js'></script>
<body onkeyup='a(event)'>
<script>
 var e = jQuery.Event("keyup", { keyCode: 64 });

 // trigger an artificial keydown event with keyCode 64
 jQuery("body").trigger( e );
function a(event) {
alert(event.keyCode)
}
</script>

Как видите работает. Посмотрел в jq не нашел ф-ии Event, может кто знает как она устроена? Или хотя бы на словах объясните.

nerv_ 11.07.2012 13:17

пишет в объект события нужный keyCode? )

9xakep 11.07.2012 13:18

nerv_,
спасибо !areyoukiddingme!
Я имею ввиду внутренности. Я просто принципиально не хочу юзать jq. Хочу на чистом писать. Вот так :)

nerv_ 11.07.2012 13:26

Цитата:

Сообщение от 9xakep
Я просто принципиально не хочу юзать jq. Хочу на чистом писать.

если ты не хочешь юзать, это еще не значит, что не нужно читать доки )
http://api.jquery.com/category/events/event-object/
В конце концов, залезь в код и посмотри. Он же открыт.

9xakep 11.07.2012 13:32

nerv_,
Цитата:

Сообщение от 9xakep
Посмотрел в jq не нашел ф-ии Event

Спасибо, ща посомтрю

nerv_ 11.07.2012 13:40

9xakep, открываешь http://code.jquery.com/jquery-1.7.2.js и вставляешь эту строку
jQuery.Event =
в поиск. Поиск с учетом регистра.

9xakep 11.07.2012 13:43

nerv_,
А я искал: Event с учетом регистра) Спасибо, надеюсь пойму как устроено)

vadim5june 11.07.2012 14:57

Цитата:

Сообщение от 9xakep (Сообщение 188036)
Как видите работает. Посмотрел в jq не нашел ф-ии Event, может кто знает как она устроена? Или хотя бы на словах объясните.

Я всегда считал что симмитировть нажатие клавиши нельзя и сейчас так думаю
Они наверно просто выполнили функцию

Dim@ 11.07.2012 15:41

9xakep,
я поискал =);
jQuery.Event = function( src, props ) {
	// Allow instantiation without the 'new' keyword
	if ( !(this instanceof jQuery.Event) ) {
		return new jQuery.Event( src, props );
	}

	// Event object
	if ( src && src.type ) {
		this.originalEvent = src;
		this.type = src.type;

		// Events bubbling up the document may have been marked as prevented
		// by a handler lower down the tree; reflect the correct value.
		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;

	// Event type
	} else {
		this.type = src;
	}

	// Put explicitly provided properties onto the event object
	if ( props ) {
		jQuery.extend( this, props );
	}

	// Create a timestamp if incoming event doesn't have one
	this.timeStamp = src && src.timeStamp || jQuery.now();

	// Mark it as fixed
	this[ jQuery.expando ] = true;
};

function returnFalse() {
	return false;
}
function returnTrue() {
	return true;
}

bes 11.07.2012 17:55

Я тоже не совсем понял, о какой имитации нажатия на клавишу идёт речь.
Обычно нажатие приводит к появлению символа или выполнению каких-либо действий, которые с этим нажатием связали: что нужно имитировать появление символа (здесь можно обойтись и без нажатия) или выполнение обработчика нажатия на эту клавишу (здесь можно вызывать код обработчика).

Пример (не совсем по теме:) )
<input id="inp" type="button" value="click">

<script>
window.onload = function () {
  var inp = document.getElementById('inp');

  inp.onclick = function () {
    inp.value = String.fromCharCode(72, 69, 76, 76); 
    setTimeout(function () {inp.value += String.fromCharCode(79)}, 2000)
  }
}
</script>

9xakep 11.07.2012 18:57

bes,
O_o...ась?
Мне нужно было именно нажатие на клавишу, просто было написано по-дурацки, и принажатии на клавишу вызывалась ф-ия и происходила рекусрия. Что бы ее не произошло, нужно было сразу же сэмулировать нажатие на клавишу (не будешь же юзеру каждый раз говорить, сейчас нажми на любую кнопку) Но я уже переделал, и обошолся без этого :)
Dim@, отлично, а теперь найди: jQuery.expando,jQuery.extend, и trigger ;)
Цитата:

Сообщение от vadim5june
Я всегда считал что симмитировть нажатие клавиши нельзя и сейчас так думаю
Они наверно просто выполнили функцию

Что значит выполнили ф-ию?

vadim5june 11.07.2012 19:12

Цитата:

Сообщение от 9xakep (Сообщение 188126)
Что значит выполнили ф-ию?

то есть выполнили функцию из обработчика
Что такое иммитация нажатия на клавишу?
По моему это так должно действовать-если у нас курсор на элементе input
и у input focus то при иммитации нажатия клавиши там должна буква появится-точно так как будто юзер нажал-но в Вашем примере не появится только обработчик сработает

Раед 11.07.2012 19:40

Цитата:

Сообщение от 9xakep
а теперь найди: jQuery.expando,jQuery.extend, и trigger

Блокнот->Поиск
Не?

9xakep 11.07.2012 20:05

Раед,
ctrl+F *trololo* в любом браузере.
Просто в jQuery.expand, есть еще 100500 ф-ий, итд. Так что легче переделать код.

Раед 11.07.2012 20:51

Цитата:

Сообщение от 9xakep
есть еще 100500 ф-ий...

... с непонятным назначением - поэтому я и не люблю копаться в чужом коде

MDNsearch: createEvent, dispatchEvent

9xakep 11.07.2012 21:46

Раед,
уже подсказали. Только вот не догоняю: createElement("Event") - тут какой событие писать для: keyup??
<body onkeyup='a(event)'><div id='a'></div>
<script>
var evt = document.createEvent("Event")
evt.initEvent("keyup", true, true)
evt.keyCode = 13 // Enter, можно так писать?
document.dispatchEvent(evt)
function a(e) {
alert(e.keyCode)
}
</script>

Но как видишь не работает...
=====================
И попутный вопрос, event в firefox выдает undefined. Как ее там использовать, я уже за день как-то запутался, то работает, то пару строк уберу не работают.. :blink:
=================

event снова работает в firefox!!!!

Dim@ 11.07.2012 21:55

<body><div id='a'></div>
<script>
var evt = document.createEvent("Event")
evt.initEvent("keyup", true, true)
evt.keyCode = 13 // Enter, можно так писать? Да
function a(e) {
alert(e.keyCode)
}
document.onkeyup = a;//функция пр нажатии клавиши
document.dispatchEvent(evt)//срабатывание
</script>

:D :D :D работает

Dim@ 11.07.2012 21:57

9xakep,
не ставь больше на боди :lol:

9xakep 11.07.2012 22:00

Dim@,
Спасибо О_о...

Dim@ 11.07.2012 22:00

9xakep,
щас создаю свой фреймворк хочу сделать что-то наподобии Jquery.Event (как ты хочу писать на чистом и не приемлю библиотеки, но считаю что работать со своим фреймворком можно, плюс мне интересно его писать)

Dim@ 11.07.2012 22:01

9xakep,
ага, незачто (плюс мне плюс :lol: :lol: - шутка)
===========================
:D :D :D :D :D это моё 228 сообщение:dance: :dance:

Drimogemon 12.07.2012 00:55

Цитата:

Сообщение от Dim@
это моё 228 сообщение

кстати, вот совпадение, 228 статья для нариков, забавно совпало, правда?)

Dim@ 12.07.2012 11:03

Drimogemon,
ты это к чему?
просто в рунете 228 известно как статья педобира

Раед 12.07.2012 14:14

Вот ещё нашёл http://habrahabr.ru/post/114244/

9xakep 12.07.2012 15:37

Раед,
Спасибо, добавил в закладки) :)

Maxsior 28.01.2015 14:50

Вот код эмуляции, он заточенный под FF, надо лишь добавить немного кроссбраузерноститебе. :)
function fire(){
    var press=new KeyboardEvent("keypress",{
        key:"a",
        bubbles:true,
        cancelable:true,
        isTrusted:true,
        keyCode:0,
        charCode:97,
        wich:97,
        view:window,
    })
    document.body.dispatchEvent(press)
}
document.body.addEventListener("keypress",function(event){
        alert("Вы нажали "+event.key);
},false);
fire();


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