从网页打印后使用javascript关闭选项卡

从网页打印后使用javascript关闭选项卡,javascript,html,Javascript,Html,我知道你可以用javascript打开一个新的标签,然后关闭它,如果你根据问题保留了对它的引用的话 在我的例子中,我想打开一个新选项卡,其中包含一个自动触发浏览器打印对话框的脚本。一旦“打印”对话框关闭,我希望新选项卡消失。由于新页面中的脚本不是创建该页面的脚本,因此它们无法关闭该页面 是否有方法检测打印对话框何时被关闭,以便创建新选项卡的脚本知道何时关闭它 我正在努力实现的示例: var printTab; $('#print_me').on('click', null, function()

我知道你可以用javascript打开一个新的标签,然后关闭它,如果你根据问题保留了对它的引用的话

在我的例子中,我想打开一个新选项卡,其中包含一个自动触发浏览器打印对话框的脚本。一旦“打印”对话框关闭,我希望新选项卡消失。由于新页面中的脚本不是创建该页面的脚本,因此它们无法关闭该页面

是否有方法检测打印对话框何时被关闭,以便创建新选项卡的脚本知道何时关闭它

我正在努力实现的示例:

var printTab;
$('#print_me').on('click', null, function() {
    printTab = window.open($('#print_me').data('target'), "_blank");
    printTab.focus();
});

function closePrintTab() {
    printTab.close();
}

/* Here is the sketchy part; what triggers a call to closePrintTab? */
在我的例子中,我想打开一个新选项卡,其中包含一个自动触发浏览器打印对话框的脚本。一旦“打印”对话框关闭,我希望新选项卡消失。由于新页面中的脚本不是创建该页面的脚本,因此它们无法关闭该页面

所以我能理解的是,在新选项卡中有一个脚本,它会触发一个对话框,一旦这个对话框被取消,你就会想关闭这个选项卡

假设您可以控制对话框解除事件,您可以使用新打开的选项卡中写入的对话框解除事件处理程序中的关闭此窗口

并对此发表评论

由于新页面中的脚本不是创建该页面的脚本,因此它们无法关闭该页面

是的,您是对的,但是您可以从当前选项卡中的脚本关闭当前选项卡。这时
window.close()被使用。这将关闭当前窗口


希望这有帮助。

我的解决方案是使用HTML5
localStorage
功能。在带有“打印”按钮的页面上:

localStorage.removeItem('printFinished');
var printWindow = window.open('/path/to/print/', "_blank");
window.addEventListener('storage', function(event) {
    if(event.key == "printFinished") {
        printTab.close();
    }
}, false);
这里的要点是
localStorage
无限期地持续存在。每次清除目标变量可确保我们不会与以前会话中的任何内容进行交互。接下来,我们需要确保我们只对感兴趣的项目的更改做出反应

。。。对于单击打印按钮时打开的新选项卡中的代码:

window.onLoad = function() {
    window.print();
    localStorage.setItem('printFinished', true);
}
我在Chrome和FireFox中测试了上述内容,没有任何问题。我不能担保IE/Edge、Safari或Opera,但我对其他人在这些浏览器中可能得到的结果非常感兴趣


如果您按照SO问题的答案使用
会话存储
,上述操作将无效。

您可以尝试以下操作:

function closeThisWindow() {
         var win = window.open('', '_self');
         window.close(); // works for i.e.
         win.close(); //works for chrome
         return false;
}

很难打开新选项卡,然后在新选项卡上观看打印事件。我建议您使用“打开新窗口”,然后观看它的打印事件,然后在打印后自动关闭该窗口。例如:

//.ts

const windowUrl = 'about:blank';
const uniqueName = new Date();
const windowName = 'CloseTillPrint' + uniqueName.getTime();
const PrintWindow = window.open(windowUrl, windowName, 'z-index:999;position:absolute;left:50%;transform: translateX(-50%); top:0; bottom:0; height:100%; width:1000px');

if (PrintWindow) {
      const iframe = this.createIframe(pdfAsString, false);
      PrintWindow.document.open('text/plain');
      PrintWindow.document.write(iframe.outerHTML);
      // PrintWindow.document.write('Hello World');
      PrintWindow.document.close();
      const targetFrame = PrintWindow.frames[iframe.name];
      targetFrame.focus();
      targetFrame.print();
      setTimeout(() => {
        PrintWindow.focus();
      }, 1000);
      PrintWindow.onfocus = () => {
        console.log('print window focused');
        targetFrame.close(); PrintWindow.close();
      };
    }

你想在打印开始后关闭标签吗?这可能会对你有所帮助:@nikoskip:我已经尝试过几种方法。我遇到的问题是,现代浏览器现在只允许脚本关闭一个窗口,如果该脚本是打开窗口的第一步。最后一个解决办法是,当你认为浏览器在积极地试图阻止这种事情时,这是一个很好的长期解决方案。opera@Adam,您能在这里添加一些代码块吗?我试图使用
window.close()
从页面中加载到新选项卡的脚本中,Chrome向我发出警告:“脚本可能只关闭由其打开的窗口。”如果希望关闭新选项卡(至少在Chrome中),则必须使用打开该选项卡的同一脚本。