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去跳转页面,这个方法在绝大多数 ...
随机推荐
- Javascript之旅——第八站:说说instanceof踩了一个坑
前些天写js遇到了一个instanceof的坑,我们的页面中有一个iframe,我在index页面中计算得到了一个array,然后需要传递到Flight页面 这个嵌套的iframe中的一个函数(Sea ...
- cacti监控mysql
cacti监控mysql 2013-09-25 16:21:43 分类: LINUX 原文地址:cacti监控mysql 作者:baochenggood cacti监控mysql 1 下载cacti监 ...
- sql server ,sql语句,练习笔记
一.删除冗余记录 DELETE [学生表] WHERE id NOT IN (SELECT MIN(id) FROM [学生表] GROUP BY [学号],[姓名],[课程编号],[课程],[分数] ...
- SQL Server 2008 R2——T-SQL 存储过程 返回表
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示
如果你不知道在哪里可以找到ifconfig命令,请按照以下简单的步骤来找到它.首先,让我们找出哪个包提供了ifconfig命令.要完成这项任务,输入以下命令: [root@jrserver app_f ...
- cocos2d-x 3.10 屏幕适配问题
cocos2d-x 的屏幕适配问题困扰了我很久,差不多有一个星期吧.通过亲身实践才解决了问题,分享一下解决办法,供大家借鉴学习. 其实解决办法很简单,把下面代码注释掉就好了 // if (frameS ...
- 烂泥:高负载均衡学习haproxy之关键词介绍
本文由ilanniweb提供友情赞助,首发于烂泥行天下 上一篇文章我们简单讲解了有关haproxy的安装与搭建,在这篇文章我们把haproxy配置文件中使用到的关键词一一介绍下. 关注我微信ilann ...
- C语言 时间函数的学习和总结
一直都是以简单的time_t t,time(&t),ctime(&t)来表示时间,后来要以时间为日志文件的名字时,就有点蒙逼了.学习一下. tm结构: struct tm { ...
- TCL校园招聘——软件开发工程师(java) 只招5个。。。
简介 TCL集团股份有限公司创立于1981年,是全球性规模经营的消费类电子企业集团之一,广州2010年亚运会合作伙伴,总部位于广东省惠州市仲恺高新区TCL科技大厦.旗下拥有TCL集团.TCL多媒体科技 ...
- [转]教你一招 - 如何给nopcommerce增加新闻类别模块
本文转自:http://www.nopchina.net/post/nopchina-teach-newscategory.html nopcommerce的新闻模块一直都没有新闻类别,但是很多情况下 ...