【问题标题】:Auto-closing a popup with a file to download自动关闭带有要下载的文件的弹出窗口
【发布时间】:2014-05-13 17:49:15
【问题描述】:

我有一个文件,名为download.php,其中包含一个要下载的文件,所以它有以下标题(用 PHP 声明):

header("Content-Type: ".pathinfo($_GET['file'], PATHINFO_EXTENSION));
header("Content-Length: ". filesize($_GET['file']));
header("Content-Disposition: attachment; filename=". $_GET['file']);

download.php 被另一个页面使用 jQuery 作为弹出窗口打开。

现在我希望download.php 在几秒钟后自动关闭(使用 JavaScript)(这样我可以确保下载开始),但我没有设法编写工作代码。 以下是我尝试过的代码(我将它们放在 标题之后):

window.setTimeout('self.close();', 3000);
window.setTimeout('function(){self.close();}', 3000);
window.setTimeout(self.close();, 3000);

我也简单试过:

self.close();

但它无论如何都不起作用。

我尝试将这些代码放在<head><body> 中。

可能是什么问题?

【问题讨论】:

    标签: javascript php download popup


    【解决方案1】:

    我可以在这个打开的窗口中的浏览器 url 栏中询问它的内容吗?可能是浏览器看到的标题让浏览器知道它将被视为下载并且不会将窗口作为真实页面运行。而是打开类似'about:blank'的东西。如果是这种情况,页面上的 javascript 将永远不会运行。

    不过,我可以提出以下建议。我假设这个窗口正在被另一个页面打开。在这种情况下,让另一个页面通过 javascript 以编程方式打开窗口并从那里控制关闭。

    var popout = window.open("http://example.com/download.php");
    window.setTimeout(function(){
        popout.close();
    }, 1000);
    

    【讨论】:

    • 感谢您的回答。它会显示一个类似mysite.org/download.php?file=image.jpg 的网址,您的代码运行良好,谢谢!
    • 那么,假设下载没有在 1 秒内结束,那会发生什么?
    【解决方案2】:

    我有一个稍微不同的建议,在我的情况下效果很好,并且没有任意超时:

    var newwindow = window.open("http://example.com/download.php");
    newwindow.focus();
    newwindow.onblur = function() {newwindow.close(); };
    

    完成下载后,新窗口最终会失去焦点并关闭。

    【讨论】:

    • 谢谢!适用于 FF 和 Chrome,但不适用于 IE(使用 IE11、Edge [v17 对我来说] 测试)。有谁知道在显示下载对话框时如何捕获事件(如果存在此 suc 事件)?
    • 这真的很好,谢谢。最后一行应该修正一个错字newwindow.onblur = function(){ newwindow.close(); };
    【解决方案3】:

    您可以使用以下 sn-p 关闭当前窗口(感谢 this SO answer):

    window.open(window.location, '_self').close();
    

    要在给定的时间间隔后运行它,只需使用 setTimeout

    setTimeout(function() { window.open(window.location, '_self').close(); }, 3000);
    

    【讨论】:

    • 感谢您的回答。我尝试将您的代码同时放入 download.php 的头部和正文部分,但窗口无论如何都不会关闭:(
    • 对我不起作用。 @David Beech 的回答确实有效。
    【解决方案4】:

    如果您不需要在下载页面上进行额外的用户操作,您可以做一个“技巧”.... 在包含下载页面链接的页面中放置一个隐藏的 iframe

    <iframe id="dwn_frame" src="" height="0" width="0"></iframe>
    

    所以,在调用者页面中应该有这样的内容:

    <script>
    funtion download_page() {
    $('#dwn_frame').attr('src', 'my_dwn_page.php');
    }
    </script>
    <a href="javascript: download_page()">Download File</a>
    <iframe id="dwn_frame" src="" height="0" width="0"></iframe>
    

    这样,用户点击“下载文件”,链接触发“download_page”函数,该函数设置iframe的源属性,iframe加载您的下载页面,准备文件,下载开始时没有弹出窗口或类似的。

    【讨论】:

      【解决方案5】:

      我用过 Onblure 但一点用都没有!

      我使用了下面的代码,它对我有用。

      var popupWindow = window.open("endpoint","","setting");
      var att = document.createAttribute("onblure");  // Create a "onblure" attribute
      att.value = "window.close()";                  // Set the value of the class attribute
      popupWindow.setAttributeNode(att); 
      

      这将允许在出现下载窗口时关闭窗口

      注意: 端点:是您的新窗口端点 设置:是您的窗口设置,例如宽度、高度、顶部、左侧 .. 等

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-05
        • 2010-10-14
        • 2018-02-13
        • 2013-07-30
        • 1970-01-01
        • 2013-03-11
        相关资源
        最近更新 更多