直接上代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<div id="myChart" style="width: 600px; height: 400px"></div>
</div>
<script src="echarts.min.js"></script>
<script src="china.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>
var app = new Vue({
el: "#app",
data: {
index: 0,
myChart: null,
myData: [
{
"name": "上海",
"value": [121.4648, 31.2891],
"count": 33,
},
{
"name": "杭州",
"value": [120.208324, 30.252583],
"count": 75,
},
{
"name": "温州",
"value": [120.706191, 28.001086],
"count": 188,
},
]
,
timerObj: null,
},
methods: {
triggerClick() {
window.open("https://www.baidu.com");
},
mOver(e, el) {
const _this = this;
if (!e) e = window.event;
var reltg = e.relatedTarget ? e.relatedTarget : e.fromElement;
while (reltg && reltg != el) reltg = reltg.parentNode;
if (reltg != el) {
clearInterval(_this.timerObj);
e.stopPropagation();
}
},
mOut(e, el) {
const _this = this;
if (!e) e = window.event;
var reltg = e.relatedTarget ? e.relatedTarget : e.toElement;
while (reltg && reltg != el) reltg = reltg.parentNode;
if (reltg != el) {
setTimeout(() => {
_this.swichTooltip();
}, 400);
_this.autoTooltip();
e.stopPropagation();
}
},
initMap() {
let myData = this.myData;
let option = {
tooltip: {
enterable: true,
alwaysShowContent: true,
show: true,
triggerOn: "click",
backgroundColor: "#050E29",
borderColor: "#050E29",
textStyle: {
color: "#fff",
fontSize: 10,
},
formatter: function (obj) {
return `<div onclick="triggerClick(event, this)" onmouseover="mOver(event,this)" onmouseout="mOut(event,this)" style="text-align:left">
<div>
地区:
${obj.data.name}
</div>
<div>
项目数:
${obj.data.count}
</div>
</div>`;
},
},
geo: {
map: "china",
roam: false,
itemStyle: {
areaColor: "#022065",
borderColor: "#0165b4",
},
emphasis: {
disabled: true,
areaColor: "#022065",
},
silent: true,
},
series: [
{
name: "",
type: "effectScatter",
coordinateSystem: "geo",
data: myData,
rippleEffect: {
brushType: "stroke",
},
label: {
show: false,
fontSize: 16,
color: "green",
position: "right",
formatter: "{b}",
},
symbolSize: "10",
itemStyle: {
color: "#00FF00",
},
},
],
};
this.myChart = echarts.init(document.getElementById("myChart"));
this.myChart.setOption(option);
this.autoTooltip();
},
swichTooltip() {
this.myChart.dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: this.index,
});
this.index++;
if (this.index > this.myData.length) {
this.index = 0;
}
},
autoTooltip() {
const _this = this;
this.timerObj = setInterval(function () {
_this.swichTooltip();
}, 2000);
},
},
mounted() {
this.initMap();
window.mOver = this.mOver;
window.mOut = this.mOut;
window.triggerClick = this.triggerClick;
},
});
</script>
</body>
</html>
重点
- 如何在原生的js中调用vue的方法
window.mOver = this.mOver;
<div onmouseover="mOver(event,this)"></div>
- div父级增加鼠标的移入移出事件后,子div也会触发导致移入移出的事件触发错乱
mOver(e, el) {
const _this = this;
if (!e) e = window.event;
var reltg = e.relatedTarget ? e.relatedTarget : e.fromElement;
while (reltg && reltg != el) reltg = reltg.parentNode;
if (reltg != el) {
}
},
mOut(e, el) {
const _this = this;
if (!e) e = window.event;
var reltg = e.relatedTarget ? e.relatedTarget : e.toElement;
while (reltg && reltg != el) reltg = reltg.parentNode;
if (reltg != el) {
}
},