为什么prompt()会破坏e.preventDefault()?

时间:2013-11-06 04:18:02

标签: javascript jquery

此处的jsfiddle - http://jsfiddle.net/sueM7/4/ - 在结果窗口中输入Ctrl + S时会显示“另存为”对话框,即使代码包含e.preventDefault();问题是JavaScript第5行的prompt()。如果你注释掉第5行,e.preventDefault()会正确阻止“另存为”对话框。

有谁知道这里发生了什么,以及如何运行提示行并阻止“另存为”?

感谢。

window.addEventListener('keydown', function (e) {
    if (e.ctrlKey && e.keyCode === 83) {
        e.preventDefault();
        console.log("got Ctrl+S");
 var groupName = prompt("Group Name: ", "abc");
    }
}, false);

1 个答案:

答案 0 :(得分:0)

事实证明,Firefox有一些非常棘手的非同步关于它的警报(),我认为prompt()可能会给你带来同样的问题。请参阅Can't Override Ctrl+S in Firefox

建议的答案是:

$(document).bind('keydown', 'Ctrl+s', function(event) {
  event.preventDefault();
  event.stopImmediatePropagation();
  alert('saving?');
  return false;
});

关键似乎是设法在Firefox失序之前调用防护,并在弹出警报/提示窗口时触发默认操作。如果这不起作用,我会尝试一个简短的计时器 - 这是一个肮脏的黑客,诚然 - 给Firefox 100-150毫秒来让它一起行动,然后调出一个提示符()。这个用例太短,不会造成明显的接口延迟,它应该用于帮助修复有关用户警报的Firefox错误/功能。