Javascript:使用带有window.open()的setTimeout后,使用setTimeout和window.close()不起作用

问题描述 投票:3回答:4

我有两个setTimeout接连不断。一个用于打开窗口中的网页,另一个用于在预定的时间量后关闭窗口。但是,在使用setTimeout打开网页后,关闭窗口的下一个setTimeout不起作用。带有windows.close的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(){news.window.open('http://www.yahoo.com','_self')}, 2000);
    tmot = setTimeout(function(){news.window.close()}, 5000);
}

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

javascript settimeout
4个回答
2
投票

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

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);
}

不试试IE,我没有。


1
投票

经过一整天尝试同样的事情,我得到了一个解决方案。我的window.open在一些jQuery成功结果中出现,我首先认为是因为我无法将myWindow var从“success”结果传播到主DOM。

事实上,只有在加载新内容后,javascript才会接受操纵任何窗口(我的意思是URL)。但它仍然可以被黑客入侵,因为如果有新内容,似乎javascript只会拒绝操纵。因此,如果您使用完全相同的内容重新加载窗口,那么它就会变得易于操作。

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

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

然后我决定关闭窗口(它是一个SetTimeOut或任何触发器),我只是首先重新加载具有完全相同的URL和相同名称的窗口(并且这次使用var set)。现在我可以神奇地关闭它。

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

不要问我为什么会这样。确实如此。

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


0
投票

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

事实上,超时是在解雇。问题是某些浏览器不允许你使用javascript关闭一个窗口。有一些阻止它的错误 - 特别是浏览器不会让一个网站的代码关闭一个打开到另一个网站的窗口。请参阅下面的评论以获得更好的解释。

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


0
投票

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

以下作品:

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>

DEMO:

View demo

但是,如果我们取消注释加载yahoo.com的行,它就不再起作用了:

View demo


该怎么办?

您可以尝试使用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);

});
© www.soinside.com 2019 - 2024. All rights reserved.