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去跳转页面,这个方法在绝大多数 ...
随机推荐
- Zero to One读后感
Zero to One是一本不错的书,无论你是在职场还是在创业都应该看看先.书中没有告诉你任何的职业技巧,但是很明确的告诉了你应该有的思考方式,告诉你人与机器的关系,告诉成功企业固有的模式以及你为什么 ...
- Ubuntu下安装Pyenv不成功,求指教
虚拟机:VMware12.0 操作系统:Ubuntu16.04 LTS (新安装系统) 已经按照网上的步骤: 1.安装git: $sudo apt-get install git 2.安装依赖包: $ ...
- ELK Kafka json to elk
Logstash配置 input { kafka { zk_connect => "127.0.0.1:2181" topic_id => "clus ...
- Fatal error: Call-time pass-by-reference has been removed
下面的代码报错:Fatal error: Call-time pass-by-reference has been removed function myFunc($arg) { do somethi ...
- cloudera cdh native lib
如果通过命令行的方式安装cloudera 版本的hadoop,下载它的cdh版本. 解压后执行,你会发现报warning,没有native的库,lib/native是空的. 如何获取native的文件 ...
- 常用的JavaScript模式
模式是解决或者避免一些问题的方案. 在JavaScript中,会用到一些常用的编码模式.下面就列出了一些常用的JavaScript编码模式,有的模式是为了解决特定的问题,有的则是帮助我们避免一些Jav ...
- [转]Oracle Form 触发器执行顺序
Trigger 不是数据库中的触发器,不过功能类似,都是当某个事件发生的时候会触发. Trigger中可以编写代码,当对应事件发生的时候就会执行该Trigger中的代码. Oracle Form中的T ...
- [Copy]Bird's booklist
Copy from Bird Thanks! Here is his website: Bird's book list 0x01 编程语言 Python基础教程(第2版) Effective Jav ...
- 【转】【收藏】LINQ学习心得分享--------(二)LINQ语法详解
原地址:http://blog.csdn.net/xuemoyao/article/details/8053444 通过上一章节的学习,相信大家已经掌握了学习LINQ的前期的准备知识.在这一节里, ...
- java变量的初始化
public class Init { private int age;//非静态初始化语句<3> private static String name; //静态初始化语句,先初始化静态 ...