苹果手机访问html文件路径,关于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;

};

方案一 (推荐)

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

// 按钮

this.handleDownload(item)}>下载文件

/* 下载文件方法 */

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标签,让用户自己去点击。这个无论如何都不会被拦截。

不过这样也不好,会使用户多一步操作。

方案四

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

复盘分析

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

我是一个连接呀

为什么会被拦击呢?

当然是window.open被广告商滥用,严重影响用户的使用。

当然也不是所有的window.open都会被拦截,我们只需要找准时机去触发即可。

避免在回调函数中去执行window.open方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值