Safari 下的一些诡异 bug 我们已经领教一二,比如前文中说的 无痕浏览模式下使用 localStorage 的 API 就会报错。今天我们要讲的是利用 location.href = filePath 实现下载文件功能却在 Safari 下有一些奇怪的现象。

location.href = filePath


一般在页面中实现文件的下载,我们都会用一个 A 标签,然后将该标签的 href 属性指向文件在服务端的地址,但是我们也可以用 location.href = filePath 的 js 语句实现文件的下载。具体可以参考我以前写的文章 location.href 实现点击下载功能

target='_blank'


如果一个 A 标签上有个 target 属性,并且属性值为 '_blank',那么点击这个 A 标签,就会在新的标签页打开该 A 标签所指向的地址。

在移动端,一般我们不会在 A 标签上再画蛇添足写上 target='_blank',因为移动端频繁打开新的页面体验会很差。如果写上了 target='_blank' 呢?没关系,基本上所有的移动端浏览器都会自动忽略它,也就是说你加了我也不让你在新页面打开,但是也有个别浏览器允许你新建页面打开,这里面就包括了 Safari 和 chrome。

BUG 根源


说了这么多铺垫,我们来聊聊具体的 bug。需求很简单,有个 A 页面,A 页面上有个超链接指向 B 页面,B 页面上有个下载按钮,指向一个 app 的下载地址。

我们先写 A 页面,如果你是这样写的,那么恭喜你,就没有后续问题了:

<a href="B.htm">click me</a>

但是如果你加上了 target='_blank' 的话,那么可能就会有隐患:

<a href="B.htm" target='_blank'>click me</a>

假设我们写了后者,接下来写 B 页面的逻辑。如果你用的是 A 标签实现下载功能,那么恭喜你,你应该不会碰到问题:

<a href='https://itunes.apple.com/...'> download app </a>

但是楼主正是因为在 A 页面用了 target='_blank' 并且在 B 页面用了 location.href = filePath 才发现了这个奇葩问题。比如在 B 页面这样写:

<a id='a'>download app</a>
<script>
  document.getElementById('a').onclick = function() {
    location.href = 'https://itunes.apple.com/...';
  };
</script>

如果单独打开 B 页面,点击下载按钮,自动跳到 appStore,不会有任何问题;但是如果从 A 页面打开标签进入 B 页面,然后在 B 页面点击下载按钮,跳到 appStore,新打开的 B 页面自动关掉了!

是不是用了 target='_blank' 的原因呢?接着在 chrome 下测试,发现 chrome 没有类似问题,从 A 页面打开进入 B 页面,然后点击 B 页面的下载,能进入 appStore,同时 B 页面也不会消失

解决方法


我们会出现这样的问题?我个人认为是浏览器的解释问题,我们无法改变。出现了这种问题,虽然心中把 Safari XX 了几次,但是问题还是要解决的。这里提出两点:

  1. 尽量在移动端页面的 A 标签中不用 target='_blank',如果 Safari 没有在新页面打开,那么用 location.href = filePath 的方法也还是能够实现下载文件功能的,页面也不会出现丢失
  2. 如果用了 target='_blank' 呢?那就不要用 location.href 的方式去实现下载功能,老老实实写个 A 标签吧!

Safari 下用 "location.href = filePath" 实现下载功能的诡异 bug的更多相关文章

  1. IE6下window.location.href不跳转到相应url

    前天一同事遇到个看似很诡异的问题,就是<a href="javascript:void(0);" onclick="window.location.href=url ...

  2. 话说好像是这样,ios下面通常用iframe来打开你的scheme地址; Android下通常用location.href来。。。 不过实际情况好像比这个复杂得多。。

    http://js.40017.cn/touch/hb/p/openApp.js/** * Created by wsy10943 on 2015/5/18. */ window._web_publi ...

  3. location.href 实现点击下载功能

    如果页面上要实现一个点击下载的功能,传统做法是使用一个 a 标签,然后将该标签的 href 属性地址指向下载文件在服务端的地址(相对地址或者绝对地址),比如这样: 能这样实现是因为,在浏览器地址栏输入 ...

  4. js 下载文件 window.location.href

    window.location.href ="../../pages2/assessmentplan/exportPointAsessment.do?planId="+planId ...

  5. JavaScript在IE6下超级链接window.location.href不跳转的bug 及 解决方案

    今天遇到个很诡异的问题,就是<a href="javascript:void(0);" onclick="window.location.href=url" ...

  6. window.location.href 兼容性问题 (ie 浏览器下设置失效)

    window.location.href 兼容性问题 (ie 下设置失效) window.location.href = "../index.html" (ie 浏览器失效) wi ...

  7. window.location.href下载文件,文件名中文乱码处理

    下载文件方法: window.location.href='http://www.baidu.com/down/downFile.txt?name=资源文件'; 这种情况下载时:文件名资源文件会中文乱 ...

  8. 解决安卓微信浏览器中location.reload 或者 location.href失效的问题

    在移动wap中,经常会使用window.location.href去跳转页面,这个方法在绝大多数浏览器中都不会 存在问题,但早上测试的同学会提出了一个bug:在安卓手机的微信自带浏览器中,这个是失效的 ...

  9. 安卓中location.href或者location.reload 不起作用

    链接:https://www.cnblogs.com/joshua317/p/6163471.html 在移动wap中,经常会使用window.location.href去跳转页面,这个方法在绝大多数 ...

随机推荐

  1. Enabling Cross-Origin Requests in ASP.NET Web API 2

    Introduction This tutorial demonstrates CORS support in ASP.NET Web API. We’ll start by creating two ...

  2. Sql Server之旅——第六站 使用winHex利器加深理解数据页

    这篇我来介绍一个winhex利器,这个工具网上有介绍,用途大着呢,可以用来玩数据修复,恢复删除文件等等....它能够将一个file解析成 hex形式,这样你就可以对hex进行修改,然后你就可以看到修复 ...

  3. layout 布局、手风琴accordion、选项卡tabs

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. iOS OC和Swift进行互相调用

    有时候 ,我们会涉及到双向混合编程,特别是OC和swift的互相引用. swift调用oc的方法: 1.桥接文件,一般是swift工程,在创建一个oc文件时,系统自动添加(不用改名,直接默认即可) 2 ...

  5. QT学习第1天

    QT学习第一天  坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) ...

  6. x01.os.15: 看上去很美

    张碧晨在韩国学的不是技巧,而是基本功:气息!声音由气息托着,似真声而不是真声,似假声又不是假声,所以才能在动听的地方唱得更动听.编程也是一样,基本功很重要:内存!所谓的黑客高手,攻击的一大手段,便是利 ...

  7. Android中dip、dp、sp、pt和px的区别

    1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小.在有些情况 ...

  8. 地图编辑器V2.3

    MapEditorV2.3 changelog: ====================================== V2.9.0 (2013-11-18)----------------- ...

  9. [书目20160624]Android应用开发从入门到精通

    卢海东 著 第1章 揭开神秘面纱——Android系统简介 1   1.1 认识Android系统 2   1.1.1 Android成长历程 2   1.1.2 发行版本 3   1.1.3 得到大 ...

  10. JustWeEngine - 轻量级游戏框架

    JustWeEngine - 轻量级游戏框架 An easy open source Android game engine. Github地址 引擎核心类流程图 使用方法 引入Engine作为Lib ...