调用window.location.assign后,chrome / firefox之间的网页呈现方式不同

时间:2014-10-26 11:32:36

标签: javascript html google-chrome firefox mjpeg

我有一个显示实时mjpeg视频流的网页(作为'img')和一个下载位图文件的链接(该视频流的最后保存的快照)。

当我点击Chrome中的链接时,浏览器会下载bmp文件,视频流会一直保持渲染状态。

当我在FireFox中执行相同操作时,会出现一个对话框,提示“保存/打开”文件并在页面上停止呈现实时视频。显示空的占位符而不是图像。

这是一个用于演示问题的小型HTML代码:

<html>
<head>
<script>
    function DownloadFile(link) {
        window.location.assign(link);
    }
</script>
</head>
<body>
    <img align="center" src="http://148.61.151.202/mjpg/video.mjpg?camera=1" height="375" width="500">
    <div style="color: rgb(142, 217, 255);" 
        onclick="DownloadFile('http://www.mywrapper.com/downloadfile/plug-ins/circle.bmp');">
        Download
    </div>
</body>
</html>

如何在FF和Chrome中启用下载位图文件并保持页面正确呈现?

1 个答案:

答案 0 :(得分:2)

这是因为两个浏览器处理链接分配过程的方式不同。您可以使用Firefox中的隐藏iframe沙箱链接分配以解决此问题。见下文:

<html>
    <head>
        ...
    </head>
    <body>
        <img align="center" src="http://148.61.151.202/mjpg/video.mjpg?camera=1" height="375" width="500">
        <button id="download">
            Download
        </button>
        <iframe style="display:none" id="f"></iframe>
        <script type="text/javascript">
            function DownloadFile (link) {
                var f = document.getElementById("f");
                f.contentWindow.location.assign(link);
            }
            document.getElementById("download").addEventListener('click', function(){
                DownloadFile('http://www.mywrapper.com/downloadfile/plug-ins/circle.bmp');
            });
        </script>
    </body>
</html>

这实质上导致FF让主窗口继续工作并创建一个iframe,其window具有自己的iframeElement.contentWindow,由addEventListener引用并跟随那里的链接分配。

使用css隐藏iframe:)

我在您的代码中做了一些更改:

  1. 始终将脚本标记放在结束正文标记之前。这可以确保正确加载DOM并且我们可以对其进行处理。此外,脚本加载阻塞,这会减慢页面加载速度。把它们放在最后可以解决这个问题。
  2. 不要使用内联事件监听器(即onclick = blabla)。查找,学习,练习和使用button
  3. 遵循正确的语义,使用button代替divonclick {{1}}毫无意义。