0

我正在尝试获取一个需要几秒钟才能在后台加载的文件,因此我可以同时显示一个微调器。

我目前正在后台尝试使用 iframe,这可行,但我不确定如何在它完成加载时收到通知(这样我就可以删除微调器)。

有什么好的方法吗?有比 iframe 更好的解决方案吗?

到目前为止,这是我的代码:

<script>
    $(document).ready(function() {
        var link = $('.generate-pdf');

        link.click(function(e) {
            e.preventDefault();
            var spinner = $("<img src='/assets/images/ajax-loader.gif' />");
            var iframe = $('<iframe src="' + link.attr('href') + '" style="height:0;width:0;visibility;hidden;display:none;"></iframe>');
            link.before(spinner);
            link.before(iframe);

        });
    })
</script>

根据这个网站,鉴于我Content-dispositionattachment我不能保证收到任何事件。我可以轮询 iframe 上的任何属性以找出答案吗?

4

2 回答 2

0

你有没有尝试过

iframe.load(function(){
    log("done");
})
于 2012-10-10T09:05:09.627 回答
0

最后,我不得不联系服务器,查看文件是否已发送到浏览器。我仍然希望看到一个纯粹的基于客户端的实现。

谢天谢地,下载是用 PHP 生成的,所以没问题。

<script>
    $(document).ready(function() {
        var link = $('.generate-pdf');

        link.click(function(e) {
            e.preventDefault();
            var spinner = $("<div class='spinner'><img src='/assets/images/ajax-loader.gif' /><span>Your PDF is being generated...</span></div>");
            var downloadKey = new Date().getTime();
            var iframe = $('<iframe src="' + link.attr('href') + '&downloadKey='+downloadKey+'" style="height:0;width:0;visibility;hidden;display:none;" onload="alert(\'hello\')"></iframe>');
            link.before(spinner);
            link.before(iframe);

            var hasFinished = function(downloadKey, callback) {
                var that = this;
                $.ajax({
                    url: "index.php?controller=is-download-finished&downloadKey=" + downloadKey,
                    success: function(data) {
                        if (data) {
                            callback();
                        } else {
                            setTimeout(function() {
                                that(downloadKey, callback);
                            }, 1000);
                        }
                    }
                })
            };
            hasFinished(downloadKey, function() {
                spinner.remove();
                iframe.remove();
            });

        });
    })
</script>

额外的请求只返回 JSON true 或 false。

于 2012-10-10T09:44:01.217 回答