如何从其原点关闭浏览器选项卡

时间:2016-03-17 14:44:11

标签: javascript html browser

我可以打开一个新标签,然后从父母那里关闭它,执行以下操作:

<a id="mylink" href="javascript:" onclick="mynewwindow = window.open('https://www.google.co.in');" target="_blank">Sample Code</a>
    <a href="javascript:" onclick="closemywindow();">close</a>
    <script>
        var mynewwindow;
        function closemywindow(){
            mynewwindow.close();
        }
</script>

但是如果通过上下文菜单或使用滚动打开新选项卡,我该如何关闭该新标签?

3 个答案:

答案 0 :(得分:0)

window.open的结果只是对窗口的另一个引用。在您的页面中,您只需使用window.close。

请注意,如果它是唯一的打开标签,它可能会要求用户允许关闭窗口。

感谢Darren的评论我理解你可能想要从中心点关闭窗口。这可以与外部Web服务一起使用。您的链接可以采用http://anotherpage?openedfrom=thispage格式,然后新页面可能会定期连接到中心点,看是否需要关闭。从原始页面,您可以指示服务“关闭由此打开的所有窗口”。在这种情况下,'thispage'将是一个随机生成的键,用于标识开始页面。

如果您只想在当前浏览器上执行此操作,则甚至可能不需要使用Web服务,而是使用local storage

以下是一些代码(测试html文件名为test13.html - 正确更改名称):

<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js'></script>
<a href="test13.html" target="_blank">A link</a><br/>
<input type="button" value="Close all opened windows"/>
<script>
function guid() { //generates a random GUID like string
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
    });
}

window.windowKey=guid(); //generates a key for the window
//uncomment this if you want all the opened pages to share a key
//var m=/[\?&]windowKey=([^\?&]+)/.exec(document.location.href);
//if (m) window.windowKey=m[1];


if (!window.localStorage) {
    alert('No local storage, no autoclosing pages');
} else {
    $('input').click(function() { //click on the button to close all pages referred by this one
        window.localStorage.setItem(windowKey,"yes");
    });

    window.localStorage.setItem(windowKey,"no"); // you could skip this if you don't want to list the opened window keys
    $(window).on('beforeunload',function() {
        window.localStorage.removeItem(windowKey); // clean up localStorage
    });


    setInterval(function() {
        var m=/[\?&]windowKey=([^\?&]+)/.exec(document.location.href);
        if (!m) return;
        var referralKey=m[1]; //get the key from the windowKey URL parameter
        var shouldClose=window.localStorage.getItem(referralKey)=="yes";
        if (shouldClose) window.close(); //close this page if the key is marked for closing
    },1000);


    // you might want to execute this on window.ready
    $('a').each(function() { //add the window key to all the links on the page
        var a=$(this);
        var url=a.attr('href');
        url=url+(/\?/.test(url)?'&':'?')+'windowKey='+windowKey;
        a.attr('href',url);
    });
}
</script>

如果您想支持该场景:页面A打开打开页面C的页面B,然后打开A关闭B和C,更改guid行,如下所示:

window.windowKey=guid();
var m=/[\?&]windowKey=([^\?&]+)/.exec(document.location.href);
if (m) window.windowKey=m[1];

答案 1 :(得分:0)

一个解决办法可能就是在你的所有页面上都有一个脚本,它有一个关闭窗口的计时器,除非页面上有鼠标事件。

document.addEventListener("DOMContentLoaded", function(event) { 
   var timeoutID;
   timeoutID = window.setTimeout(closeWindow, 2000);
   document.addEventListener('mousemove', clearAlert, false);

   function clearAlert() {
      window.clearTimeout(timeoutID);
      document.removeEventListener('mousemove', clearAlert, false);
   }
   function closeWindow() {
      window.close();
   }
});

我不完全确定它是否会起作用,但它也可能总是在移动设备上关闭窗口,或者在切换到选项卡之前浏览器不会执行脚本

答案 2 :(得分:-1)

您无法关闭使用window.open()创建的窗口。这将是一个非常糟糕的行为,例如因为这样做也会删除标签历史记录。该选项卡属于用户,而不是您。

https://developer.mozilla.org/en-US/docs/Web/API/Window/close