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

时间:2014-03-25 22:56:35

标签: javascript settimeout

我有两个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而不执行另一个。任何建议和帮助将不胜感激!

4 个答案:

答案 0 :(得分: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 :(得分:1)

尝试了一整天后,我得到了解决方案。 我的window.open出现在某些jQuery成功结果中,我首先想到的是,因为我无法将myWindow变量从“成功”结果传播到主DOM。

实际上,只有在加载新内容(我的意思是URL)后,JavaScript才会接受对任何窗口的操作。 但是它仍然可以被黑客入侵,因为如果有新内容,似乎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的新内容,因此必须遵守规则。)

答案 2 :(得分:0)

我在Chrome上的JSFiddle中对此进行了测试。

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

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

答案 3 :(得分: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>

<强>样本:

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

});