Запрос событий отмены / повтора в html / javascript

У меня есть интерактивный холст HTML5, где иногда пользователи хотят отменить свои действия. У меня есть логика для этого, но я не уверен, как правильно отловить событие «пользователь хочет отменить».

В настоящее время я просто слушаю события клавиатуры и интерпретирую «CTRL + Z» как запрос на отмену, например:

document.addEventListener("keydown", e => {
    const Z_KEY = 90;
    let isUndo = e.keyCode == Z_KEY && e.ctrlKey && !e.shiftKey;
    if (isUndo) {
        restore(revision.undo());
    }
});

Проблема в том, что стандартный ярлык для отмены различается в зависимости от ОС, и существуют полностью ортогональные способы его запуска (например, встряхивание телефона).

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

Есть ли стандартный способ попросить браузер перехватывать за меня все события отмены? В соответствии с требованиями завтрашнего дня, который продолжает работать, даже когда производители изобретают новые действия отмены? А как насчет хитрого обходного пути? Или, может быть, есть библиотека, которая занимается именно этой проблемой?

Примечания:


person Craig Gidney    schedule 02.05.2016    source источник


Ответы (1)


Не существует стандартного способа javascript для перехвата таких вещей, как отмена / повтор, поскольку для них нет определенного события.

Может быть, Mousetrap сделает то, что вы хотите. Это библиотека для абстрагирования событий клавиатуры в javascript и включает в себя способ делать общие [system modifier]+key горячие клавиши.

Тем не менее, вам, вероятно, где-нибудь понадобится кнопка, если вы хотите мобильное устройство. (Я не знаком с действием встряхивания, чтобы отменить. Это похоже на чушь хиппи нового века. = P)

person Ouroborus    schedule 02.05.2016
comment
К сожалению, уловить события клавиатуры - не самая сложная часть. Очень жаль, что нет стандартного сигнала. - person Craig Gidney; 02.05.2016
comment
@CraigGidney Я подозреваю, что именно поэтому мы видим много вещей, связанных с веб-страницами в приложении. Это означает, что вы получаете удобство общей веб-разработки в сочетании с доступом к функциям, зависящим от устройства. - person Ouroborus; 02.05.2016
comment
@CraigGidney Я видел эту статью, в которой говорится о том, как захватить скрытое поле ввода, чтобы вы могли заставить его действовать как прокси для встроенной возможности отмены браузера. - person Ouroborus; 20.05.2018