在之前的项目中,有一个下载文件的功能。这里只要在浏览器中输入url,就会下载文件。当时我就单纯的用window.open,但是会被浏览器拦截,还得手动打开。然后又搜索研究了其他的方法,看到了各种通过js打开新窗口的方法。这里总结一下如何解决下载功能。先说一下解决下载功能的方法。通过同事的提醒,使用iframe进行处理,直接赋给iframe的src,文件会自动下载。但是,如果后端在responseheader中设置了某个header,则会报错:x-frame-options:DENYx-frame-options,是否允许object和iframe显示,有三个参数:DENY:Even如果是同域名,不能显示SAMEORIGIN:YesDisplayALLOW-FROMurionthesamedomainnamepage:AnysourcecandisplayMDN'sexplanation我后端同事在几个界面把x-frame-options设置为SAMEOPIGIN来下载,前端可以运行无任何副作用的情况下,通过js下载文件export:(url)=>{//移除旧节点constoldNode=document.querySelector('#g-exportOrder-iframe')if(oldNode){document.body.removeChild(document.querySelector('#g-exportOrder-iframe'))}//生成一个新节点用于下载constiframe=document.createElement('iframe')iframe.style.display="none"iframe.id='g-exportOrder-iframe'iframe.src=urldocument.body.appendChild(iframe)}只要调用传递一个url,就会自动下载一个文件。使用window.open,如果我们点击一??个目标,然后同步打开窗口,使用window.open是可以的,但是如果我们把window.open放在一个异步操作中,就会出现问题div.addEventListener('click',open,false)functionopen(){setTimeout(()=>{window.open('/api/admin/adslot/all')},1100)}我在谷歌,火狐还有欧朋,这个会被屏蔽,但是用ie9就不会被屏蔽了。我会给它10秒,ie最终会使用单击事件从您那里弹出到window.open。只要异步操作超过一定的时间,浏览器就会拦截这个弹窗的操作。如果不添加用户事件触发window.open(比如点击事件、鼠标进出等),而是直接在代码中运行window.open,那么浏览器也会拦截window.onload=function(){window.open()}一般来说,如果没有用户操作的事件触发window.open,就会被拦截,如果window.open放在异步操作中,超过某个事件,就也会被屏蔽。拦截这里我首先想到了解决异步和拦截方法的办法vartest=window.open()setTimeout(function(){test.location='http://www.xxx.com'},2000)inasynchronous操作之前,先打开窗口,然后把窗口的位置改到你要操作的位置,但是这个缺陷有点大,异步操作完成后新窗口会从空白变成指定页面,而这个解决方案没有,没有人为事件触发window.open导致被屏蔽的问题使用一个标签这是最常见的打开新标签页的方式
