Минимальное воспроизведение: https://gist.github.com/DanielDignam/b49084941a2f731501d5
Мы используем узел 4.1.1, Chrome 45.0.2454.85 и Electron 0.35.2 в Windows 10.
Запустите прикрепленное приложение. Обратите внимание, что ^Z правильно сообщает на консоль. Введите что-нибудь в поле ввода и нажмите кнопку, чтобы удалить элемент из DOM. Нажмите ^Z, обратите внимание, что он не сообщает. Нажмите ^Z еще раз и обратите внимание, что это так.
Если вы повторно запустите и вставите что-то в текстовое поле N раз, вы заметите, что количество ^Z, которое требуется, прежде чем будет сообщено, равно N+1.
Подразумевается, что поле ввода все еще обрабатывает события, даже если оно больше не находится в DOM, и не передает ^Z, пока не очистит свой стек отмены.
Это прерывает отмену в нашем приложении, где действия отмены приложения не будут восстановлены на ^Z, если поле ввода было использовано, а затем удалено из DOM.
Мы хотим отменить другое состояние в нашем приложении, когда нет формы/ввода.
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
</head>
<body id='body'>
<h1>Hello World!</h1>
We are using node <script>document.write(process.versions.node)</script>,
Chrome <script>document.write(process.versions.chrome)</script>,
and Electron <script>document.write(process.versions.electron)</script>.
<script>
function removeInput(event) {
var i = document.getElementById("foo");
var b = document.getElementById("body");
b.removeChild(i);
}
const remote = require('electron').remote;
const Menu = remote.Menu;
const MenuItem = remote.MenuItem;
var template = [
{
label: 'Edit',
submenu: [
{
label: 'Undo',
accelerator: 'CmdOrCtrl+Z',
click: function () {
console.log('Undo called');
},
enabled: true
}
]
}];
menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
</script>
<input id='foo' type='text'/>
<input type='button' onclick='removeInput()'/>
</body>
</html>
Это ошибка Chromium при обработке входных данных DOM, я думаю, что решение состоит в том, чтобы обрабатывать ввод с событиями DOM вручную, вместо того, чтобы полагаться на ускоритель меню.
Чтобы исправить это, нам нужно копаться в исходном коде Chromium, но это слишком много работы. Сообщить об этом в Chromium тоже вряд ли получится, потому что для его воспроизведения вам нужно добавить пользовательский пункт меню в Chrome, что невозможно.
Я закрываю это, поскольку это не будет исправлено, поскольку, вероятно, никто не будет в этом разбираться, и вы можете обойти это, прослушивая ключевые события DOM.
Для людей, которые столкнулись с этой проблемой, как я: вот проблема в трекере ошибок Chromium, на момент написания она все еще не исправлена.
Я работаю над этим, создавая пункт меню без ускорителя и прослушивая событие клавиши Ctrl + Z в средстве визуализации. Это работает. Однако как мне теперь сделать так, чтобы ярлык «Ctrl + Z» отображался рядом с «Отменить» в меню?