الحد الأدنى من repro: 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" بجوار "تراجع" في القائمة؟