最近项目进入了第三方集成的环节,需要IE来集成第三方监控。我该怎么办?老板让我让后台管理系统的框架兼容IE,一直都是在chrome下开发的,不知道IE下到底是什么东西。
目前,后台管理系统的前端建设模式
目前系统是用[emailprotected]生成的,UI框架使用iview,ajax请求使用axois,没有专门的npm包。
有待解决的兼容性问题
经过我自己的测试,目前:主要存在以下兼容性问题
Axios无法使用,因为IE下没有承诺;说到灵活、固定、绝对定位,IE浏览器下的显示效果就大不相同了。导出excel表单时出现异常;使用的npm包中的一些代码在没有编译的情况下会有一些ES6语法;vue路由器路由失败;IE自动缓存ajax请求结果。如何解决这些问题
为了解决第一个问题,需要在项目中引入babel-poly ill。我的处理方法是在build-webpack.base.config.js文件中添加配置:
要解决第二个问题,需要写一些兼容性比较好的风格,这里我就不多解释了;
解决第三个问题的过程相当曲折。系统的下载方式与通过接口返回的文件流相同。你可以看看我的原始代码。最初,响应内容的格式是通过axios的拦截器获得的,然后下载。但是在IE兼容性测试过程中,发现了一个问题,那就是axios在chrome和IE下的性能不一致。一致性在哪里,你可以简单地说:
const DownLoadURl=URL={ let iframe=document . CreateElement(' iframe ');iframe . style . display=' none ';iframe.src=urliframe . onload=function(){ document . body . remove child(iframe);};document . body . appendchild(iframe);};//截取二进制响应流if(RES . headers(RES . headers[' content-type ']==' application/vnd . ms-excel;charset=UTF-8 ' | | RES . headers[' content-type ']==' application/vnd . openxmlfformats-office document . spreadsheetml . sheet ' | | RES . headers[' content-type ']==' application/octet-stream;charset=UTF-8 '){ DownLoadURl(RES . request . response URl);Return}这里的问题是IE浏览器中不存在RES . request . response err属性。即使它确实存在,下载文件时也会有例外。我看到很多人在后台都有这样的问题。我该怎么办?相信这个问题是可以解决的。虽然没有找到合适的解决方案,但有网友建议,这些问题都是第三方封装的ajax请求,那么为什么不手工编写一个原生的ajax请求呢?转换思路后发现还行。ajax可以使用以下代码来下载文件流:
utils.exportFiles=(类型='GET ',URL=null)={ var xhr=null if(window .XMLHttpRequest) { //Mozilla浏览器xhr=new XMlhttprequest()} else { if(window .ActiveX对象){尝试{ xhr=新的ActiveX对象(' Microsoft .XMLHTTP ')} catch(e){ try { xhr=new ActiveX对象(' Msxml 2 .XMLHTTP ')} catch(e){ } } } xhr。open(type,url,true)xhr。response type=' blob ' if(type==' POST '){ xhr。setrequestheader(' Content-type ',' application/JSON ')} xhr。onload=function(RES){ var Content disposition=xhr。getresponseheader(' Content-disposition ')var Content type=xhr。getresponseheader(' Content-type ')var filename=内容处置(拆分';')[2]//eslit-disable-下一行no-eval eval(文件名)filename=decodeURI(文件名)如果(这个。status===201){ var blob=this。响应if(窗口类型。领航员。mssavebob!=='未定义){ //IE浏览器进行下载窗户。领航员。MsSaveBloB(BloB,文件名)} else { //非浏览器进行下载var下载URL=文档。createelement(' a ')下载网址。下载=文件名下载网址。风格。显示='无'下载网址。href=URL。createobjecturl(blob)文档。尸体。appendchild(下载网址)下载网址。点击()网址。revokeobjecturl(下载网址。href)文档。尸体。removechild(下载网址)} } else { console。日志('导出错误)} } xhr.send()}第四个问题同样还是一些工具打包的问题,在vue-cli2.0生成的项目中,哪些射流研究…会使用巴别塔装载机是这样配置的:
我们可以看到,其针对3个文件加的射流研究…代码使用巴别塔装载机,将需要使用巴别塔装载机的新公共管理包添加到其中即可。第五个问题百度可以搜到,其中我比较推荐的解决方案如下:
const IE11 RuleFix={ methods : { HashChangeHandler : }函数(){这个.$路由器。推(窗口。位置。哈希。子串(1,窗口。位置。哈希。长度));},isIE11:函数(){返回!窗户MSInputMethodContext!document.documentMode} },挂载ed :函数(){ if(this。isie 11()){ window。addeventlistener(' hashchange ',这。hash handler);} },驱逐舰d:函数(){ if(this。isie 11()){ window。removeeventlistener('已更改),这。hash handler);} } }导出默认ie 11 RuleFixVar VM=new Vue({ El : ' # App ',路由器,商店,mixin :[ie 11 RuleFix],组件: {App,},模板: ' App/' });第6个问题是过了一段时候发现的,IE会自动的缓存请求的结果,那么对系统中的一些操作是有影响的,比如说是在数据保存完成之后回到列表页的刷新,取到的数据是缓存中的数据。怎么办,我们可以在爱可信的请求拦截器中自动为请求地址添加时间戳,保证每次的请求的地址是不一样的。
总结
以上耗时一天的工业管理学(工业工程)兼容就完成了,目前只能兼容到IE11,IE10,其他的我已经放弃了,就算再兼容完成后,系统再IE10下的表现也不是特别的好,感觉比较卡,再IE11下也只能说是正常。希望对大家的学习有所帮助,也希望大家多多支持我们。