В клиентском JavaScript возможно ли захватить событие и запустить его на более позднем этапе? - PullRequest
1 голос
/ 10 апреля 2011

Мне интересно сделать что-то вроде этого:

...
event.preventDefault();
...
el.dispatchEvent(event);

Я попробовал это в Firefox, который выдал исключение NS_ERROR_ILLEGAL_VALUE.

Можно ли захватить событие и запустить его на более позднем этапе?


Для тех, кто заинтересован, вот моя цель высокого уровня. Я пытаюсь определить, когда подчеркивание набирается в текстовой области (т.е. shift + "-"). К сожалению, Firefox сообщает, что keyCode и charCode для этого события равны 0, то же самое значение, что и нажатие клавиши тильды (shift + "` "). Чтобы устранить неоднозначность, моя идея состоит в том, чтобы захватить событие, подавить его поведение по умолчанию и «отпустить» его на другой текстовой области. Затем я проверил бы значение этой (скрытой) текстовой области, чтобы определить, какая клавиша была нажата.

Обновление: Я использую onkeydown, а не onkeypress.

Ответы [ 2 ]

1 голос
/ 10 апреля 2011

Насколько я знаю, событие, уже находящееся в очереди, нельзя «повторно использовать», поскольку его нельзя «извлечь» из очереди.Он передается вам, затем следующему обработчику в строке и так далее, но нативный делегат одинаков для всех них.Итак, вы должны сделать новый.Поскольку вы говорите, что не можете получить все данные о событии, это проблема.

Более простой трюк может состоять в том, чтобы отслеживать текстовую область на предмет изменений, а затем удалять подчеркивание, когда оно появляется втекст.Если вы хотите сохранить положение курсора, вы можете здесь найти решение о том, как точно позиционировать курсор (ответ RonPK).

Из любопытства, согласно моему тесту здесь , Firefox 4 сообщает правильный код CharCode и состояние сдвига.Это конкретная версия / проблема ОС?

0 голосов
/ 10 апреля 2011

Что не так с:

String.fromCharCode(event.keyCode);

?

Например, в обработчике события:

var character = String.fromCharCode(event.keyCode);
if (character === '_') {
    // Do something.
}
...