Как document.createEvent должен работать с ключевыми событиями? - PullRequest
4 голосов
/ 15 октября 2010

Я пытаюсь смоделировать нажатия клавиш в веб-приложении, оно предназначено для встроенной системы, но использует браузер, полученный из Webkit. Я проверил код в Chrome и получил ту же ошибку.

Я пытался использовать фрагменты кода из этого примера из Yahoo , но я продолжаю получать ту же ошибку при запуске события с помощью dispatchEvent. «target» - это элемент HTML в дереве DOM.

function fireEvent(target) {
    var evt = document.createEvent("UIEvent");
    evt.initEvent("keypress", true, true);
    target.dispatchEvent(evt);
}

Всегда выдается «Ошибка: UNSPECIFIED_EVENT_TYPE_ERR: исключение событий DOM 0», я также пробовал createEvent («События»), и всегда сводится к одному и тому же исключению. Как на встраиваемой системе, так и в Chrome.

Ответы [ 3 ]

3 голосов
/ 02 ноября 2010

Хорошо, при дальнейшем тестировании казалось, что, когда все ключевые параметры события были правильно инициализированы, dispatchEvent работал без запуска исключения.

Следующий код работает.

function fireEvent(target) {
    var evt = document.createEvent("Events");
    evt.initEvent("keypress", true, true);

    evt.view = window;
    evt.altKey = false;
    evt.ctrlKey = false;
    evt.shiftKey = false;
    evt.metaKey = false;
    evt.keyCode = 0;
    evt.charCode = 'a';

    target.dispatchEvent(evt);
}
2 голосов
/ 05 апреля 2012

нажатие клавиши UIEvent. Вы должны использовать initUIEvent( 'type', bubbles, cancelable, windowObject, detail ) вместо initEvent(). Но для Firefox, который реализует keyEvents, вы должны создать KeyEvents и initKeyEvents().

0 голосов
/ 02 марта 2017

Это старый поток, просто чтобы обновить его, я добавляю еще один ответ, чтобы он стал более понятным для любого.

initEvent () устарел Он все еще поддерживается внекоторые браузеры, но избегайте его использования.

Существует более краткий способ создания событий, подобных этому

  function fireEvent(target) {
   var event = new Event('build');

   // Listen for the event.
   target.addEventListener('build', function (e) { ... }, false);

   // Dispatch the event.
    target.dispatchEvent(event);
}

Чтобы добавить больше данных в объект события, существует интерфейс CustomEvent, и свойство detail можетиспользоваться для передачи пользовательских данных.Например, событие может быть создано следующим образом:

var event = new CustomEvent('build', { 'detail': target.dataset.time });

Ссылка: Создание и запуск событий

...