У меня есть интерактивный холст 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());
}
});
Проблема в том, что стандартный ярлык для отмены различается в зависимости от ОС, и существуют полностью ортогональные способы его запуска (например, встряхивание телефона).
Я хочу каким-то образом сообщить браузеру, что я поддерживаю отмену, и что он должен перенаправить все сумасшедшие способы запуска отмены, специфичные для ОС, указанному мной методу. В настоящее время браузер не знает, что пользователь делает что-либо, что может повлечь за собой отмену. Все, что видит браузер, - это холст, на который нажимают и на котором рисуют.
Есть ли стандартный способ попросить браузер перехватывать за меня все события отмены? В соответствии с требованиями завтрашнего дня, который продолжает работать, даже когда производители изобретают новые действия отмены? А как насчет хитрого обходного пути? Или, может быть, есть библиотека, которая занимается именно этой проблемой?
Примечания:
- Этот вопрос отличается от Как обрабатывать событие отмены / повтора в javascript? а>. Этот спрашивает об обнаружении изменений в элементе, тогда как я всегда знаю о любых изменениях, потому что мой код выполняет эти изменения.
- Вопрос Слушать событие отмены / повтора в contenteditable div: также об обнаружении изменений вместо реализации отмены и ограничивается определенным типом элемента. Я хочу использовать настраиваемые элементы, чтобы эта работа работала.