修改 electron 中 textarea/menu 的 undo/redo 行为
Modify undo/redo behaviour on a textarea/menu in electron
我开发电子应用
使用 canvas 和多个文本区域编辑 UML 序列图的应用程序。
由于 window 上的文本区域接受撤消 (Ctrl + z),因此不会调用 Electron 菜单上的撤消。
如何使文本区域的撤消无效并将 Control + z 传递给电子菜单?
重现步骤
在 Electron 的菜单中注册撤消 (Ctrl + z)。
创建包含文本区域的应用程序屏幕。
启动应用程序。
编辑文本区域。
(不关注文本区域)按 Ctrl + z。
我希望看到的
调用了 Electron 菜单中的撤消。
我看到的是什么
焦点移动到文本区域。
textarea的内容被撤销
不调用 Electron 菜单中的撤消。
其他
并不完美。
我今天遇到了同样的问题。我认为这是电子中的一个错误,当设置加速器时,它们不会覆盖输入字段的本机 ctrl + z 和 ctrl + y。
我找到了解决这个问题的方法:
let zDown = false;
let zFired = false;
let yDown = false;
let yFired = false;
document.onkeydown = function(e) {
if (e.ctrlKey) {
if (e.key === 'z') {
zDown = true;
}
else if (e.key === 'y') {
yDown = true;
}
}
};
document.onkeyup = function(e) {
if (e.key === 'z' && zDown) {
if (!zFired) {
menu.getMenuItemById('undo').click();
}
zDown = zFired = false;
}
else if (e.key === 'y' && yDown) {
if (!yFired) {
menu.getMenuItemById('redo').click();
}
yDown = yFired = false;
}
};
let menu = Menu.buildFromTemplate([{
"label": "Edit",
"submenu": [{
"id": "undo",
"label": "Undo",
"accelerator": "CmdOrCtrl + z",
click: () => {
zFired = true;
app.undo();
}
}, {
"id": "redo",
"label": "Redo",
"accelerator": "CmdOrCtrl + y",
click: () => {
yFired = true;
app.redo();
}
}]
}]);
它很脏,但它能用。
我开发电子应用
使用 canvas 和多个文本区域编辑 UML 序列图的应用程序。
由于 window 上的文本区域接受撤消 (Ctrl + z),因此不会调用 Electron 菜单上的撤消。
如何使文本区域的撤消无效并将 Control + z 传递给电子菜单?
重现步骤
在 Electron 的菜单中注册撤消 (Ctrl + z)。
创建包含文本区域的应用程序屏幕。
启动应用程序。
编辑文本区域。
(不关注文本区域)按 Ctrl + z。
我希望看到的
调用了 Electron 菜单中的撤消。
我看到的是什么
焦点移动到文本区域。
textarea的内容被撤销
不调用 Electron 菜单中的撤消。
其他
我今天遇到了同样的问题。我认为这是电子中的一个错误,当设置加速器时,它们不会覆盖输入字段的本机 ctrl + z 和 ctrl + y。
我找到了解决这个问题的方法:
let zDown = false;
let zFired = false;
let yDown = false;
let yFired = false;
document.onkeydown = function(e) {
if (e.ctrlKey) {
if (e.key === 'z') {
zDown = true;
}
else if (e.key === 'y') {
yDown = true;
}
}
};
document.onkeyup = function(e) {
if (e.key === 'z' && zDown) {
if (!zFired) {
menu.getMenuItemById('undo').click();
}
zDown = zFired = false;
}
else if (e.key === 'y' && yDown) {
if (!yFired) {
menu.getMenuItemById('redo').click();
}
yDown = yFired = false;
}
};
let menu = Menu.buildFromTemplate([{
"label": "Edit",
"submenu": [{
"id": "undo",
"label": "Undo",
"accelerator": "CmdOrCtrl + z",
click: () => {
zFired = true;
app.undo();
}
}, {
"id": "redo",
"label": "Redo",
"accelerator": "CmdOrCtrl + y",
click: () => {
yFired = true;
app.redo();
}
}]
}]);
它很脏,但它能用。