js中因接口加载过长window.open被浏览器拦截
问题描述:
在项目中通过接口请求后台完成文件生成,但因为后台文件生成时间较长,前台等待过长时间后才执行window.open,因此window.open会被自动拦截,但生成文件较快时仍可以正常打开新窗口。
解决思路:
主要思路:在请求接口前就执行window.open打开一个新窗口,但会出现窗口404,然后在接口请求成功后将window.open中的连接进行替换使window.open显示新的内容。
完善思路(可以提升用户体验):在前端创建一个加载页面并创建一个加载页面的路由,在请求接口前执行的window.open打开这个创建的路由界面(给用户一个加载回馈,让用户知道系统正在加载),然后在进行接口请求,请求成功后将已开的window.open的页面连接替换成想要的,这样不光可以解决window.open因过久未执行被拦截问题,也能解决没有加载反馈的问题
代码
设置文件路由
//设置加载页面路由,如发现你项目中的路由和这个不一样,可以仿照项目中404路由进行设置
{
path: '/路由名称',
component: (resolve) => require(['要显示的vue文件路径'], resolve),
hidden: true
},
vue页面中调用的函数
text() {
// 加载页面路由,在此之前记得在router设置文件路由
let { href } = this.$router.resolve({
//与上面的文件路由中的path一致
path:'/路由名称',
})
// 请求接口前打开新页面,打开的是你设置的路由
let docwindow = window.open(href);
getUrl(this.params).then(res=>{
var url =“新连接”;
//接口返回后用新连接替换已的打开的window.open,页面会重新加载显示
docwindow.location.href=url;
})
},