关于H5页面在iphone手机safari浏览器window.open部分位置失效的问题

场景

最新在做一个H5功能,做附件下载。
适用场景: 新窗口打开一个连接。

思路

根据附件id查询出附件地址之后,利用 window.open(failUrl) 打开新窗口来下载附件。

现象

安卓手机所测试的常用浏览器基本上都没问题,唯独iphone手机自带的safari浏览器不生效。

解决办法

对safari浏览器做特殊判断。

  • 判断safari浏览器的方法
/* 判断是否是ios手机safari浏览器打开的 */
export const isIosSafari = () => {
  const ua = navigator.userAgent.toLowerCase();
  if (
    ua.indexOf('applewebkit') > -1 &&
    ua.indexOf('mobile') > -1 &&
    ua.indexOf('safari') > -1 &&
    !(ua.indexOf('android') > -1) &&
    !(ua.indexOf('linux') > -1) &&
    !(ua.indexOf('crios') > -1) && 
    !(ua.indexOf('chrome') > -1) && 
    !(ua.indexOf('browser') > -1) && 
    !(ua.indexOf('ios') > -1)
  ) {
    return true;
  }
  return false;
};

方案一 (推荐)

先打开一个空白窗口,然后再给窗口赋值地址。

// 按钮
<span onClick={() => this.handleDownload(item)}>下载文件</span>

/* 下载文件方法 */
handleDownload = (item) => {
  const { dispatch } = this.props;
  // 要先定义打开新窗口,否则也会被拦截  不生效
  const winRef = window.open("about:blank","_blank");
  dispatch({
    type: 'common/downloadFile',
    payload: { fileId: item.fileId },
    callback: (data) => {
      // 后台接口返回回来的地址  fileUrl1
      const fileUrl1 = data.fileUrl;
      winRef.location = fileUrl1;
    }
  });
};

如果const winRef = window.open("about:blank","_blank");放在异步回调函数中,恭喜你,不会生效,会被拦截哟~

方案二

当时safari浏览器的时候,我们通过超链接点击来跳转。
创建的标签,执行TagA.click()方法,在safari上也是不生效的,有老铁说safari下的A标签默认是没有绑定事件,那么我们就可以手动绑定一个事件,然后触发即可。

 /* 利用a标签下载附件 */
  downloadFileByTagA = (fileUrl) => {
    const TagA = document.createElement('a');
    TagA.href = fileUrl;
    // TagA.target = '__blank';
    document.body.appendChild(aSpan);
    TagA.className = 'oInput';
    TagA.style.display = 'none';

    // 兼容ios safari浏览器
    const e = document.createEvent('MouseEvent');     
    e.initEvent('click', false, false);     
    TagA.dispatchEvent(e);
  }

上诉👆代码我注释掉了TagA.target = '__blank'; 应为我加上去之后就不生效了,被safari安全机制拦截了。

当然这个可以通过 苹果系统设置,偏好设置->安全性,去掉阻止弹窗的复选框 来解决~~~。

方案三

生成一个a标签,让用户自己去点击。这个无论如何都不会被拦截。
不过这样也不好,会使用户多一步操作。

方案四

苹果系统设置,偏好设置->安全性,去掉阻止弹窗的复选框,如上所述。不太推荐,改变了用户的主观意愿

复盘分析

首先连接是无论如何不会被拦截的,可以生成一个连接让用户去点击,这样不太友好~~~

<a id="file-download-a" href="http://www.baidu.com" target="__blank">
  我是一个连接呀
</a>

为什么会被拦击呢?
当然是window.open被广告商滥用,严重影响用户的使用。
当然也不是所有的window.open都会被拦截,我们只需要找准时机去触发即可。
避免在回调函数中去执行window.open方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容