Имитация нажатия клавиш с помощью jQuery

79

Как с помощью jQuery смоделировать (запустить?) Нажатие клавиши при нажатии ссылки? Например, когда пользователь щелкает следующую ссылку:

<a id="clickforspace" href="#">Click Here</a>

Затем, щелкнув ссылку, они будут как будто нажали «пробел» на своей клавиатуре.

Что-то вроде этого, я предполагаю:

$("#clickforspace").click(function(e) { 
    e.preventDefault(); 
    //... Some type of code here to initiate "spacebar" //
                                      });

Есть идеи, как этого добиться?

Додинас
источник
2
Это может ответить на ваш вопрос.
Фемида,
Мне любопытно - при попытке заменить clickпробелом вы действительно хотели, чтобы браузер прокручивал страницу вниз? Нажатие клавиши пробела на ссылке обычно имеет тот же эффект, что и нажатие клавиши перехода на страницу вниз.
Joel Purra

Ответы:

15

Событие нажатия клавиши из jQuery предназначено для такого рода работы. Вы можете вызвать событие, передав строку «keypress» в .trigger (). Однако, чтобы быть более конкретным, вы можете фактически передать объект jQuery.Event (укажите тип как «нажатие клавиши») и предоставить любые свойства, которые вы хотите, такие как код клавиши, являющийся пробелом.

http://docs.jquery.com/Events/trigger#eventdata

Прочтите документацию выше для получения более подробной информации.

Дмитрий Лихтен
источник
54
Конечно, прочтите документацию, но плакат, вероятно, уже знал об этом. Документация по событиям jQuery немного непрозрачна. Эндрю Калвер дал прямой ответ, а также ссылку для получения дополнительной информации.
Рой Лебан
142

Я считаю, что это то, что вы ищете:

var press = jQuery.Event("keypress");
press.ctrlKey = false;
press.which = 40;
$("whatever").trigger(press);

От сюда .

Эндрю Калвер
источник
17
Это не приведет к созданию фактического текста, например, при использовании с элементом управления вводом.
Alex Burtsev
5
@AlexBurtsev - Вы правы, потому что это только запускает обработчик событий, как если бы была нажата указанная клавиша, но на самом деле не нажимает эту клавишу, как это происходит, когда клавиша нажимается на клавиатуре (вероятно, из соображений безопасности)
BornToCode
6
Есть ли причина, по которой вы смешиваете "$" и "jQuery"?
Дэнни Эндрюс
4
То, что вы написали, у меня не сработало в jQuery 2.2.3 в Chrome. :( Но это случилось:$("whatever").trigger($.Event("keydown", {keyCode: 40}))
Джонатан Бенн
1
Основываясь на методе Джонатана Бенна, вы также можете использовать тот же метод для отправки ключа вместо отправки кода клавиши (поскольку коды клавиш помечены как устаревшие). Например: $ ("что угодно"). Trigger ($. Event ("keyup", {key: "Enter"})) - и, возможно, как показано, с другими событиями клавиатуры.
Алан М.
40

Другой вариант:

$(el).trigger({type: 'keypress', which: 13, keyCode: 13});

http://api.jquery.com/trigger/

Денис Иванов
источник
1
Я не уверен, для чего это нужно which. У keyCodeменя работает только в SAPUI5 (jQuery 2.2.3 в Chrome)
Джонатан Бенн
12

Вы можете попробовать этот плагин jQuery SendKeys:

http://bililite.com/blog/2011/01/23/improved-sendkeys/

$(element).sendkeys(string)вставляет строку в точку вставки во вход, текстовое поле или другой элемент с contenteditable = true. Если точка вставки в данный момент не находится в элементе, он запоминает, где была точка вставки при последнем вызове sendkeys (если точка вставки никогда не была в элементе, она добавляется в конец).

Роберт Харви
источник
Для этого вам не нужен jQuery, вы можете использовать ту же функциональность, просто получив bililiteRangeбиблиотеку: github.com/dwachss/bililiteRange (на самом деле плагин jQuery - это просто тонкая оболочка вокруг этой невероятной библиотеки, которая стоит сама по себе ).
fiatjaf
5

Это работает:

var event = jQuery.Event('keypress');
event.which = 13; 
event.keyCode = 13; //keycode to trigger this for simulating enter
jQuery(this).trigger(event); 
Anoop PS
источник
1
[var event = jQuery.Event ('нажатие клавиши'); event.which = 13; event.keyCode = 13; jQuery (this) .trigger (event);] попробуйте это
Anoop PS
Мне нужно было нажать Enter в диалоговом окне, поэтому в приведенном здесь фрагменте я заменил это на #myEl .. спасибо
Джин Бо