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. Zero to One读后感

    Zero to One是一本不错的书,无论你是在职场还是在创业都应该看看先.书中没有告诉你任何的职业技巧,但是很明确的告诉了你应该有的思考方式,告诉你人与机器的关系,告诉成功企业固有的模式以及你为什么 ...

  2. Ubuntu下安装Pyenv不成功,求指教

    虚拟机:VMware12.0 操作系统:Ubuntu16.04 LTS (新安装系统) 已经按照网上的步骤: 1.安装git: $sudo apt-get install git 2.安装依赖包: $ ...

  3. ELK Kafka json to elk

    Logstash配置     input { kafka { zk_connect => "127.0.0.1:2181" topic_id => "clus ...

  4. 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 ...

  5. cloudera cdh native lib

    如果通过命令行的方式安装cloudera 版本的hadoop,下载它的cdh版本. 解压后执行,你会发现报warning,没有native的库,lib/native是空的. 如何获取native的文件 ...

  6. 常用的JavaScript模式

    模式是解决或者避免一些问题的方案. 在JavaScript中,会用到一些常用的编码模式.下面就列出了一些常用的JavaScript编码模式,有的模式是为了解决特定的问题,有的则是帮助我们避免一些Jav ...

  7. [转]Oracle Form 触发器执行顺序

    Trigger 不是数据库中的触发器,不过功能类似,都是当某个事件发生的时候会触发. Trigger中可以编写代码,当对应事件发生的时候就会执行该Trigger中的代码. Oracle Form中的T ...

  8. [Copy]Bird's booklist

    Copy from Bird Thanks! Here is his website: Bird's book list 0x01 编程语言 Python基础教程(第2版) Effective Jav ...

  9. 【转】【收藏】LINQ学习心得分享--------(二)LINQ语法详解

    原地址:http://blog.csdn.net/xuemoyao/article/details/8053444   通过上一章节的学习,相信大家已经掌握了学习LINQ的前期的准备知识.在这一节里, ...

  10. java变量的初始化

    public class Init { private int age;//非静态初始化语句<3> private static String name; //静态初始化语句,先初始化静态 ...