在对window.open()使用setTimeout后,对window.close()使用setTimeout不起作用

Using setTimeout with window.close() not work after using setTimeout with window.open()

本文关键字:setTimeout 使用 window close 不起作用 在对 open      更新时间:2023-09-26

我有两个setTimeout一个接一个。一个用于在窗口中打开网页,另一个用于在预定时间后关闭窗口。但是,在使用setTimeout打开网页后,关闭窗口的下一个setTimeout不起作用。使用窗口的setTimeout。Close by其本身就可以。

I并试图打开带有消息的窗口;然后在预定的时间后在窗口中打开一个网站,然后在几秒钟后关闭窗口。下面是我的函数:

function showNews() {
    news = window.open("", "NewsWindow", "width=900, height=700");
    news.document.write("<p>The 'NewsWindow' will only appearing for 3 seconds.</p>");
    tmot = setTimeout(function(){news.window.open('http://www.yahoo.com','_self')}, 2000);
    tmot = setTimeout(function(){news.window.close()}, 5000);
}

我尝试在Chrome和IE上运行,两个浏览器只会执行其中一个setTimeout而不是另一个。任何建议和帮助将非常感激!

您最好使用相同的参数使用父窗口重新打开它:

function showNews() {
    news = window.open("", "NewsWindow", "width=900, height=700");
    news.document.write("<p>The 'NewsWindow' will only appearing for 3 seconds.</p>");
    tmot = setTimeout(function(){window.open('http://www.yahoo.com', "NewsWindow")},2000);
    tmot = setTimeout(function(){news.close()}, 5000);
}

一些浏览器禁止你在加载网站后关闭窗口。

以下作品:

HTML:

<button onclick="showNews()">Show News</button>
JavaScript:

<script>
var myWindow;
function showNews()
{
    myWindow = window.open("","myWindow","width=200,height=100");
    myWindow.document.write("<p>This is 'myWindow'</p>");
    //tmot = setTimeout(function(){myWindow.open('http://www.yahoo.com','_self')}, 2000);
    tmot = setTimeout(function(){myWindow.close();}, 5000);
}
</script>
演示:

视图演示

但是如果我们取消加载yahoo.com的注释,它就不能工作了

视图演示


该怎么办?

你可以尝试使用一个hack,像这样:

HTML:

<button type="button" id="show-news">Show News</button>
jQuery:

$("#show-news").click(function() {
    myWindow = window.open('','myWindow', "width=200, height=200");
    setTimeout(function() {
        myWindow.window.open("http://www.w3schools.com/", "_self");
    }, 2000);
    setTimeout(function() {
        myWindow.window.open('', '_self', ''); 
        myWindow.window.close();       
    }, 5000);
});

经过一整天的尝试,我得到了一个解决方案。我的窗户。打开发生在一些jQuery成功的结果,我认为首先是因为我不能传播myWindow var从"成功"的结果到主DOM。

事实上,它只是javascript不接受操纵任何窗口一旦一个新的内容已经加载(我的意思是URL)。但它仍然可以被黑客攻击,因为它似乎javascript只拒绝操纵,如果有一个新的内容。所以,如果你用完全相同的内容重新加载你的窗口,那么它突然变得可操作。

所以在我的代码的某个地方(甚至在一个函数中),我打开窗口(无论它在哪里),不需要在var中设置它。

window.open('myURL','WindowName', "width=200, height=200");

然后,当我决定关闭窗口(无论是SetTimeOut或任何触发器),我只需要首先重新加载窗口与完全相同的URL和相同的名称,(这一次与var集)。现在我可以神奇地关闭它

var windo = window.open('myURL','WindowName', "width=200, height=200");
windo.close();

不要问我为什么它工作。它的功能。

(我猜这是因为它不是一个新的窗口不是javascript的新内容,所以规则得到尊重。)

我在Chrome上的JSFiddle中测试了这个。

超时实际上正在触发。问题是某些浏览器不允许您使用javascript关闭窗口。有一些漏洞可以阻止它——特别是浏览器不会让一个网站的代码关闭一个打开到另一个网站的窗口。请参阅下面的评论以获得更好的解释。

当我在Chrome浏览器中尝试这个setTimeout方法触发,但窗口没有关闭。我通过调用'alert'方法而不是news.window.close()方法来测试它。