基于Vue+iView+OpenLayer在IE11上运行的方法总结

因为项目要求必须在IE11上面运行,经过了多次尝试,特此总结方法

1、

webpack.base.conf.js中

 

 

      {
        test: /\.js$/,
        loader: 'babel-loader',
        include: [resolve('src'), resolve('test'),resolve('static'), resolve('node_modules/iview'), resolve('node_modules/webpack-dev-server/client')]
      },

2、

cnpm install es6-promise --save
cnpm install babel-polyfill --save

在main.js中配置

 

 

 3、配置IR11RouterFix解决IE11路径不默认跳转的问题,在main.js中

 

 

 

 

建议把这个放到单独的JS文件内,例如

 

const IE11RouterFix = {
  methods: {
    hashChangeHandler: function () {
      this.$router.push(window.location.hash.substring(1, window.location.hash.length));
    },
    isIE11: function () {
      return !!window.MSInputMethodContext && !!document.documentMode;
    }
  },
  mounted: function () {
    if (this.isIE11()) {
      window.addEventListener('hashchange', this.hashChangeHandler);
    }
  },
  destroyed: function () {
    if (this.isIE11()) {
      window.removeEventListener('hashchange', this.hashChangeHandler);
    }
  }
}

export default IE11RouterFix

4、解决当重复请求同一个地址时,IE不发送请求的问题。这个是由于IE默认下会缓存,也就是当请求和原来一样的时候,就不发送了 ,需要加时间戳,但是这次我发现,加时间戳也未必能解决,还是要禁止缓存,在main.js中配置

import axios from "axios";

let ser = axios.create({
  headers: {
    'Cache-Control': 'no-cache'
  }
});

ser.interceptors.request.use(config => {
  if (config.method === 'post' || config.method === 'POST') {
    config.data = {
      ...config.data,
      _t: new Date().getTime()
    }
  }else if (config.method === 'get' || config.method === 'GET') {
    config.params = {
      _t: new Date().getTime(),
      ...config.params
    }
  }

  return config
},function (error) {
  return Promise.reject(error)
})

Vue.prototype.$axios = ser;

然后在你的所有页面中只需要使用this.$axios即可,不一定腰带时间戳了,因为此处已经配置了nocache和时间戳

5、openlayer适配问题

经过筛查,我发现6.3.1必定可以稳定在IE11上使用,但是要注意写法,

例如以前我喜欢写

import {Circle,Stroke} from 'ol/style';

但是现在这么写就是运行不出来 ,我拆开来写

import Circle from 'ol/style/Circle';
import Stroke from 'ol/style/Stroke';

又可以了,所以在此记录一下,如果要在IE11上面跑的话,所有的引用,全部单独写,不要并在一起,

另外:

我发现在IE11上面,如果我撒点用图片来当icon,会导致地图显示异常,例如

 

 还有其他很多卡顿和异常,所以只能用自己画的方式来代替,比如circle或者做dash等等,此处记录一个雷达式样

 

 

 这个的写法是:

  function getStyle(feature, resolution) {
    let size = feature.get('features').length;
    let style = styleCache[size];
    if (!style) {
      let color = size > 25 ? "192,0,0" : size > 8 ? "255,128,0" : "0,128,0";
      let radius = Math.max(8, Math.min(size * 0.75, 20));
      let dash = 2 * Math.PI * radius / 6;
      let dashes = [0, dash, dash, dash, dash, dash, dash];
      style = styleCache[size] = new Style({
        image: new Circle({
          radius: radius,
          stroke: new Stroke({
            color: "rgba(" + color + ",0.5)",
            width: 15,
            lineDash: dashes,
            lineCap: "butt"
          }),
          fill: new Fill({
            color: "rgba(" + color + ",1)"
          })
        }),
        text: new Text({
          text: size.toString(),
          fill: new Fill({
            color: size > 1 ? '#fff' : "rgba(" + color + ",1)"
          })
        })
      });
    }
    return style;
  }

 

posted @ 2021-01-27 18:54  昜木辰deブログ  阅读(265)  评论(0编辑  收藏  举报