e.preventDefault() 在打开新选项卡时不会阻止 CTRL + s 的默认功能

e.preventDefault() does not prevent default functionality of CTRL + s if it opens a new tab

我正在编写这段代码,以允许我使用 firefox 插件快速搜索网页上突出显示的文本。我将代码公开托管 here

我捕获按键 ctrl+s 并进行搜索的函数如下:

document.addEventListener("keydown", function(e) {
// Help came from 
 if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)){
   text = getSelectionText();
   if(text != ""){
      e.stopImmediatePropagation();
      e.preventDefault();
      console.log(text);
      openInNewTab(searches[default_search]+text);
   }
 }
}, false);

如果我注释掉openInNewTab(searches[default_search]+text);行,就是下面的函数:

function openInNewTab(url) {
// Help came from 
  var win = window.open(url, '_blank');
  win.focus();
  return false;
}

它会阻止保存对话。但是,如果我留下代码,它会阻止原始选项卡中的保存对话框,但它打开的新选项卡会弹出保存对话框。

我没能弄清楚如何防止保存对话框出现在第二个 window 中,希望得到一些帮助。

谢谢!

如果它确实按照您的描述运行,这听起来像是 Firefox 中的错误,但您应该能够通过延迟 openInNewTab 调用 very 来解决它简要地:

document.addEventListener("keydown", function(e) {
// Help came from 
 if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)){
   text = getSelectionText();
   if(text != ""){
      e.stopImmediatePropagation();
      e.preventDefault();
      console.log(text);
      setTimeout(() => {                                // ***
          openInNewTab(searches[default_search]+text);
      }, 50);                                           // ***
   }
 }
}, false);

Firefox 的弹出窗口拦截器应该允许它,因为它是在用户启动的事件中安排的。