e.preventDefault()如果打开新选项卡,则不会阻止CTRL + s的默认功能

时间:2018-11-04 19:22:09

标签: javascript firefox search add-on preventdefault

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

我捕获按键ctrl+s并执行搜索的功能如下:

document.addEventListener("keydown", function(e) {
// Help came from https://stackoverflow.com/a/14562869/6897392
 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 https://stackoverflow.com/a/11384018/6897392
  var win = window.open(url, '_blank');
  win.focus();
  return false;
}

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

我没有运气想出如何防止保存对话框出现在第二个窗口中,并希望获得帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果它确实在按照您的描述进行操作,那听起来像是Firefox中的错误,但是您应该能够通过暂时延迟openInNewTab通话非常来解决该问题:

document.addEventListener("keydown", function(e) {
// Help came from https://stackoverflow.com/a/14562869/6897392
 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的弹出窗口阻止程序应该允许它,因为它是在用户启动的事件中安排的。