1.使用window.onresize
1 let myChart = this.$echarts.init(document.getElementById(id)) 2 window.onresize = function () { 3 myChat.resize() 4 }
缺點:多個echarts的時候就只有最后一個生效了,onresize會被覆蓋
2.使用window.addEventListener添加resize方法
1 let myChart = this.$echarts.init(document.getElementById(dom)) 2 let listener= function () { 3 myChat.resize() 4 } 5 window.addEventListener('resize', listener)
缺點:當vue頁面路由跳轉到下一個頁面時,上一個頁面的onresize方法會繼續執行
3.實現在div使用onresize方法
實現原理:在div上實現類似window的onresize 監聽,這樣既能實現圖表的自適應,也不會因為頁面跳轉之后繼續執行三個頁面的onresize 方法
實現方法:
- 在assets 創建 esresize.js
1 var EleResize = { 2 _handleResize: function (e) { 3 var ele = e.target || e.srcElement 4 var trigger = ele.__resizeTrigger__ 5 if (trigger) { 6 var handlers = trigger.__z_resizeListeners 7 if (handlers) { 8 var size = handlers.length 9 for (var i = 0; i < size; i++) { 10 var h = handlers[i] 11 var handler = h.handler 12 var context = h.context 13 handler.apply(context, [e]) 14 } 15 } 16 } 17 }, 18 _removeHandler: function (ele, handler, context) { 19 var handlers = ele.__z_resizeListeners 20 if (handlers) { 21 var size = handlers.length 22 for (var i = 0; i < size; i++) { 23 var h = handlers[i] 24 if (h.handler === handler && h.context === context) { 25 handlers.splice(i, 1) 26 return 27 } 28 } 29 } 30 }, 31 _createResizeTrigger: function (ele) { 32 var obj = document.createElement('object') 33 obj.setAttribute('style', 34 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;') 35 obj.onload = EleResize._handleObjectLoad 36 obj.type = 'text/html' 37 ele.appendChild(obj) 38 obj.data = 'about:blank' 39 return obj 40 }, 41 _handleObjectLoad: function (evt) { 42 this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__ 43 this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize) 44 } 45 } 46 if (document.attachEvent) { // ie9-10 47 EleResize.on = function (ele, handler, context) { 48 var handlers = ele.__z_resizeListeners 49 if (!handlers) { 50 handlers = [] 51 ele.__z_resizeListeners = handlers 52 ele.__resizeTrigger__ = ele 53 ele.attachEvent('onresize', EleResize._handleResize) 54 } 55 handlers.push({ 56 handler: handler, 57 context: context 58 }) 59 } 60 EleResize.off = function (ele, handler, context) { 61 var handlers = ele.__z_resizeListeners 62 if (handlers) { 63 EleResize._removeHandler(ele, handler, context) 64 if (handlers.length === 0) { 65 ele.detachEvent('onresize', EleResize._handleResize) 66 delete ele.__z_resizeListeners 67 } 68 } 69 } 70 } else { 71 EleResize.on = function (ele, handler, context) { 72 var handlers = ele.__z_resizeListeners 73 if (!handlers) { 74 handlers = [] 75 ele.__z_resizeListeners = handlers 76 77 if (getComputedStyle(ele, null).position === 'static') { 78 ele.style.position = 'relative' 79 } 80 var obj = EleResize._createResizeTrigger(ele) 81 ele.__resizeTrigger__ = obj 82 obj.__resizeElement__ = ele 83 } 84 handlers.push({ 85 handler: handler, 86 context: context 87 }) 88 } 89 EleResize.off = function (ele, handler, context) { 90 var handlers = ele.__z_resizeListeners 91 if (handlers) { 92 EleResize._removeHandler(ele, handler, context) 93 if (handlers.length === 0) { 94 var trigger = ele.__resizeTrigger__ 95 if (trigger) { 96 trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize) 97 ele.removeChild(trigger) 98 delete ele.__resizeTrigger__ 99 } 100 delete ele.__z_resizeListeners 101 } 102 } 103 } 104 } 105 export {EleResize}
- 使用echarts的vue頁面引入該js
import { EleResize } from '../../../assets/js/esresize';
1 let listener = function() { 2 myChart.resize(); 3 }; 4 EleResize.on(document.getElementById('CompanyLevelCount'), listener);
優點:
- 可以根據窗口大小實現自適應
- 頁面跳轉不會執行上次操作
- 多個方法不會覆蓋