Программно запускать сочетания клавиш, например, в Gmail - PullRequest
0 голосов
/ 20 апреля 2020

Есть ли способ программно вызвать комбинации клавиш из Javascript? Например, возьмите gmail.com, где нажатие «e» приведет к архивированию выбранного письма.

Могу ли я написать код любого типа (скажем, в расширении Chrome), который может имитировать пользователя, нажимающего «e» на клавиатуре?

Например, я попытался вставить в консоль Chrome что-то вроде копирования:

document.body.addEventListener('keydown', function(event) {
  console.log('key detected: ', event);
});

document.body.addEventListener('click', () => {
  console.log('click...');
    document.body.dispatchEvent(new KeyboardEvent('keydown', {
    'key': 'e',
    'keyCode': 69,
    'which': 69,
    'code': 'KeyE',
    'isTrusted': true,  // this has no effect
    'bubbles': true,
    'cancelable': true,
    'view': window,
    'charCode': 0,
  }));
});

Так что любой щелчок на странице напечатает клавишу, которая выглядит так же как нажав «е» на клавиатуре. Но нажатие кнопки события нажатия не запускает функцию «архив» в Gmail.

Это событие не является доверенным, и невозможно сделать то, что я хотел?

1 Ответ

1 голос
/ 20 апреля 2020

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

В любом случае решение Chrome Extension работает следующим образом:

// Attach debugger to the active tab (it's the only way to send
// trusted events.
chrome.debugger.attach({tabId: tab.id}, '1.2', () => {
  // Create shortcut args and send to the tab.
  const eventArgs = {
    'modifiers': 0,
    'text': 'e',
    'unmodifiedText': 'e',
    'key': 'e',
    'code': 'KeyE',
    'windowsVirtualKeyCode': 69,
    'type': 'keyDown'
  };
  chrome.debugger.sendCommand(
    {tabId: tab.id}, 'Input.dispatchKeyEvent', eventArgs,
      (result) => {
        if (chrome.runtime.lastError) {
          console.warn('Error sending the shortcut to active tab:',
              chrome.runtime.lastError);
        }
        chrome.debugger.detach({tabId: tab.id});
      });
    });
  });

Обратите внимание, что отладчик не может подключаться на некоторых очень специфических c веб-сайтах, таких как gmail.com или drive.google.com, когда у пользователей установлено приложение Chrome для этих сайтов. Вы можете увидеть ошибку вроде:

Cannot attach to this target.

Подробнее см. https://bugs.chromium.org/p/chromium/issues/detail?id=885025. Единственный обходной путь - удалить приложения Chrome для целевых сайтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...