经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » 浏览器 » 查看文章
vue+iview 兼容IE11浏览器的实现方法
来源:jb51  时间:2019/1/8 9:18:33  对本文有异议

最近在搞一个基于vue的后台管理系统兼容IE浏览器,眼泪都要掉下来。后来和产品说了,同意兼容IE11,感动得我眼泪啊

这里也就是记录一下我遇到的超级烦的bug

 首先是'babel-polyfill' 和 "autoprefixer-loader" 这个不用多说,资源一大堆

然后 打包之后一直  const  去不掉,查了之后是 webpack 有 webpack-dev 不支持IE低版本了,要把 webpack 版本往下调,我是拒绝的

1、IE  new Date() 失败

  1. new Date('2018-1-1')
  2. //Mon Jan 01 2018 00:00:00 GMT+0800 (中国标准时间) chrome
  3. //Invalid Date IE
  4. new Date('2018/1/1')
  5. //Mon Jan 01 2018 00:00:00 GMT+0800 (中国标准时间) chrome
  6. //Mon Jan 01 2018 00:00:00 GMT+0800 (中国标准时间) IE

2、在IE里,点击 input type=checkbox 多次点击会逻辑混乱

原因:在 IE中,多次点击之后会同时出发 dblclick 和 click 事件,而这两个事件是一起执行了 click 事件,会导致click 事件失效

  1. $("input[type='checkbox']").attr('ondblclick', 'this.click()');
  2. $('.content').on('dblclick','input[type="checkbox"]',function(){
  3. this.click(); // 把双击事件变成单击事件
  4. })

注意,要判断是否是IE浏览器,要不然会把chrome 带进沟里

3、input placeholder 会触发 input 事件

意思就是说你渲染上去了,可能会自动触发一次 input,然后清空了文本,又触发一次

重点是,IE tm 的不要脸地承认了!!说不影响安全,俺们就不修复了哈

这东西的兼容就见仁见智了,用span 来代替 placeholder 也是可以的嘛,不多哔哔

4、Input type=file 中,将 其置空清除 缓存会在IE中触发 change 事件,

  1. var fileName = $(this).val();
  2. filename == undefined

这东西的兼容就见仁见智了,可以判断一下filename,不多哔哔

5、input type=text 中,text-overflow: ellpsis失效

input输入框如果东西太多,希望展示位   ...  省略号,但是chrome成功了,IE失败了

需要将 input 标签置为 readonly 才能起作用

没错,这东西是 iview select 里的 input标签

So:

  1. initTheSelect () {
  2. var input = document.querySelector('.ellipsisInput .ivu-select-selection .ivu-select-input');
  3. input.setAttribute('readonly', true);
  4. input.addEventListener('click', function (params) {
  5. input.removeAttribute('readonly');
  6. input.focus()
  7. });
  8. input.addEventListener('blur', function (params) {
  9. input.setAttribute('readonly', true);
  10. })
  11. },

6、在IE中,本系统是 使用了cookie 来保存验证信息的,但是没多久就能发现发送的请求都不携带cookie而导致重新登录

查看了,是304 即读取缓存的时候,不会携带cookie,然后一旦读到一个  重新登录,你这个系统基本就完了,一直从缓存里读取,你登录了?诶,有缓存,我拿缓存吧。

缓存:咳咳,你不是上次重新登陆吗?我给你存着呢,给给给,重新登录去吧。

所以要么设置IE不缓存,要么代码改

 后端设置,前端的设置要么不保险(神tm时灵时不灵),要么就是太麻烦,后端几行代码搞定

不允许浏览器端或缓存服务器缓存当前页面信息。

  1. response.setHeader( "Pragma", "no-cache" );
  2. response.setDateHeader("Expires", 0);
  3. response.addHeader( "Cache-Control", "no-cache" );//浏览器和缓存服务器都不应该缓存页面信息
  4. response.addHeader( "Cache-Control", "no-store" );//请求和响应的信息都不应该被存储在对方的磁盘系统中;
  5. response.addHeader( "Cache-Control", "must-revalidate" );*//于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时;

2018-11-14

僵持住了,还是我这边改吧

  1. axios.interceptors.request.use(
  2. config => {
  3. // 给每个请求加上一个 ieT 的时间参数
  4. if (window.navigator.userAgent.indexOf('Trident') > -1) {
  5. config.url = config.url + `?ieT=${new Date().getTime()}`
  6. }
  7. return config;
  8. },
  9. err => {
  10. return Promise.reject(err);
  11. });

7、本系统使用了 tinymce 来进行富文本编辑,但是,初始化失败!!!而且不报错!!!

这里使用tingmce只是导入了  tinymce一个文件,其他文件都放进了 dist 文件夹之中,然后让他自己去读取文件

不知道为什么网上一点资源都没有,难道全世界就我一个人碰到了?可是这bug我去其他系统上必现的呀,老哥

Tinymce.js

这bug困扰了我整整两天!!一行一行在IE里面debug,对比chrome里的debug终于有结果了

是tinymce在IE中的基本路径表现和chrome不一致,改源码

Tinymce.js

  1. var load = function (name, addOnUrl, success, scope, failure) {
  2. if (urls[name]) {
  3. return;
  4. }
  5. var urlString = typeof addOnUrl === 'string' ? addOnUrl : addOnUrl.prefix +
  6. addOnUrl.resource + addOnUrl.suffix;
  7. if (urlString.indexOf('/') !== 0 && urlString.indexOf('://') === -1) {
  8. // 兼容IE 浏览器
  9. // 在load函数中,需要判断 当前浏览器,然后加上 dist
  10. urlString = AddOnManager.baseURL + 'dist/' + urlString;
  11. console.log(urlString)
  12. }
  13. urls[name] = urlString.substring(0, urlString.lastIndexOf('/'));
  14. if (lookup[name]) {
  15. loadDependencies(name, addOnUrl, success, scope);
  16. } else {
  17. ScriptLoader.ScriptLoader.add(urlString, function () {
  18. return loadDependencies(name, addOnUrl, success, scope);
  19. }, scope, failure);
  20. }
  21. };
  22. var loadLanguage = function (scriptLoader, editor) {
  23. var settings = editor.settings;
  24. if (settings.language && settings.language !== 'en' && !settings.language_url) {
  25. // 兼容IE浏览器
  26. if (window.navigator.userAgent.indexOf('Trident') > 0) {
  27. settings.language_url = editor.editorManager.baseURL + '/dist/langs/' +
  28. settings.language + '.js';
  29. } else {
  30. settings.language_url = editor.editorManager.baseURL + '/langs/' +
  31. settings.language + '.js';
  32. }
  33. }
  34. if (settings.language_url && !editor.editorManager.i18n.data[settings.language]) {
  35. scriptLoader.add(settings.language_url);
  36. }
  37. };

Theme.js

  1. var getSkinUrl = function (editor) {
  2. var settings = editor.settings;
  3. var skin = settings.skin;
  4. var skinUrl = settings.skin_url;
  5. if (skin !== false) {
  6. var skinName = skin ? skin : 'lightgray';
  7. if (skinUrl) {
  8. skinUrl = editor.documentBaseURI.toAbsolute(skinUrl);
  9. } else {
  10. // 兼容IE 浏览器
  11. if (window.navigator.userAgent.indexOf('Trident') > 0) {
  12. skinUrl = EditorManager.baseURL + '/dist/skins/' + skinName;
  13. } else {
  14. skinUrl = EditorManager.baseURL + '/skins/' + skinName;
  15. }
  16. }
  17. }
  18. return skinUrl;
  19. };

8、导出excel文件

其实我是倾向于使用 iview 自带的 exportCsv 的,但是 其

不会执行 columns 里的render、

导出的数字 0002 打开会变成 2

。。。

很多问题,没办法,这个文件天生的,避免不了

IE 的话,又不兼容 download属性、我的系统又说什么阻止了正向与反向缓存什么的,点进去还蛮多符合的东西的,结果window.href 也gg,只能使用 msSaveBlob 了

  1. // 兼容IE
  2. if (window.navigator.msSaveOrOpenBlob) {
  3. const blob = new Blob([template], {type: "application/vnd.ms-excel"})
  4. navigator.msSaveBlob(blob, this.name.indexOf('xls') > 0 ? this.name : this.name +
  5. '.xls');
  6. } else {
  7. let link = document.createElement('a');
  8. link.href = uri + this.base64(template);
  9. link.download = this.name.indexOf('xls') > 0 ? this.name : this.name + '.xls';
  10. link.click();
  11. }

9、复制粘贴失效!?

测试和我说复制粘贴失效了,我整个人差点爆炸!

冷静一点...

分析一下:在IE中,复制之后会将回车复制进去,然后黏贴到input标签时,只展示第一行

  1. //监听 paste事件
  2. MyPaste () {
  3. if (window.navigator.userAgent.indexOf('Trident') > 0) {
  4. var copyText = window.clipboardData.getData("Text");
  5. this.filters.phoneNum = this.filters.phoneNum ?
  6. this.filters.phoneNum + copyText.replace(/[\r\n]/g,"") :
  7. copyText.replace(/[\r\n]/g,"");
  8. }
  9. },
  10. ...
  11.  

还有好多,但是就不一一讲了,其他的应该能查到,byebye

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号