Safari 下用 "location.href = filePath" 实现下载功能的诡异 bug
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 了几次,但是问题还是要解决的。这里提出两点:
- 尽量在移动端页面的 A 标签中不用 target='_blank',如果 Safari 没有在新页面打开,那么用 location.href = filePath 的方法也还是能够实现下载文件功能的,页面也不会出现丢失
- 如果用了 target='_blank' 呢?那就不要用 location.href 的方式去实现下载功能,老老实实写个 A 标签吧!
Safari 下用 "location.href = filePath" 实现下载功能的诡异 bug的更多相关文章
- IE6下window.location.href不跳转到相应url
前天一同事遇到个看似很诡异的问题,就是<a href="javascript:void(0);" onclick="window.location.href=url ...
- 话说好像是这样,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 ...
- location.href 实现点击下载功能
如果页面上要实现一个点击下载的功能,传统做法是使用一个 a 标签,然后将该标签的 href 属性地址指向下载文件在服务端的地址(相对地址或者绝对地址),比如这样: 能这样实现是因为,在浏览器地址栏输入 ...
- js 下载文件 window.location.href
window.location.href ="../../pages2/assessmentplan/exportPointAsessment.do?planId="+planId ...
- JavaScript在IE6下超级链接window.location.href不跳转的bug 及 解决方案
今天遇到个很诡异的问题,就是<a href="javascript:void(0);" onclick="window.location.href=url" ...
- window.location.href 兼容性问题 (ie 浏览器下设置失效)
window.location.href 兼容性问题 (ie 下设置失效) window.location.href = "../index.html" (ie 浏览器失效) wi ...
- window.location.href下载文件,文件名中文乱码处理
下载文件方法: window.location.href='http://www.baidu.com/down/downFile.txt?name=资源文件'; 这种情况下载时:文件名资源文件会中文乱 ...
- 解决安卓微信浏览器中location.reload 或者 location.href失效的问题
在移动wap中,经常会使用window.location.href去跳转页面,这个方法在绝大多数浏览器中都不会 存在问题,但早上测试的同学会提出了一个bug:在安卓手机的微信自带浏览器中,这个是失效的 ...
- 安卓中location.href或者location.reload 不起作用
链接:https://www.cnblogs.com/joshua317/p/6163471.html 在移动wap中,经常会使用window.location.href去跳转页面,这个方法在绝大多数 ...
随机推荐
- 十五天精通WCF——第二天 告别烦恼的config配置
经常搞wcf的基友们肯定会知道,当你的应用程序有很多的“服务引用”的时候,是不是有一种疯狂的感觉...从一个环境迁移到另外一个环境,你需要改变的 endpoint会超级tmd的多,简直就是搞死了人.. ...
- T-SQL基础--TOP
理解TOP子句 众所周知,TOP子句可以通过控制返回行的数量来影响查询. 我们知道TOP子句能很容易的满足返回指定行数的子集,接下来有一些例子来展示什么情况下使用TOP子句来返回一个结果集: 你打算返 ...
- Java并发之ThreadPoolExecutor 线程执行服务
package com.thread.test.thread; import java.util.concurrent.ExecutorService; import java.util.concur ...
- CSS3之让背景图片全部显示
起初是在处理一个图片显示的问题, 图片没有有一部分没有显示出来, 之后用到了background-size, 发现有必要总结一下. background-size 首先声明 background-si ...
- 烂泥:CentOS6.5挂载windows共享文件夹
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 由于工作需要,需要把本机的文件夹共享出去,然后让CentOS服务器临时使用下. 服务器使用的是CentOS系统,而本机使用的win7系统.考虑到是临时使 ...
- Java基础语法总结1
一.标识符及字符集 Java语言规定标识符是以字母.下划线"_"或美元符号"$"开始,随后可跟数字.字母.下划线或美元符号的字符序列.Java标识符大小写敏感, ...
- android oncreate获取宽高度
gridView = (GridView) getView().findViewById(R.id.gridView_musicbook); gridView.getViewTreeObserver( ...
- 远程连接mysql报错【1130 -host 'localhost' is not allowed to connect to this mysql server】
远程连接mysql时包如下错误: 1130 -host 'localhost' is not allowed to connect to this mysql server 解决办法 本地用root账 ...
- 用字符串模拟两个大数相加——java实现
问题: 大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求.可以使用字符串来表示大数,模拟大数相加的过程. 思路: 1.反转两个字符串,便于从低位到高位相加和最高位 ...
- linux shell 之 crontab(定时任务)详解
1.定义: crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行.该词来源于希 ...