<template>
<div>
<div id="svgTemplate" ref="svg"></div>
</div>
</template>
<script>
import wftSvg from "@/assets/img/wft.svg";
import Vue from 'vue/dist/vue.esm.js'
import * as d3 from "d3";
export default {
data() {
return {
svgDom: null,
allDom: null
};
},
created() {
this.getSvg();
},
mounted() {
window['handleClick'] = function(e,currNodeId) {
let tag = e.srcElement || e.target;
console.log(e, '点击----->>>')
},
window['havcZooming'] = (e) => {
console.log(e, 'havcZooming----->>>')
this.zoomimg();
}
},
methods: {
getSvg() {
const xhr = new XMLHttpRequest();
xhr.open
("GET", wftSvg, true);
xhr.send();
xhr.addEventListener("load", () => {
const resXML = xhr.responseXML
this.svgDom = resXML.documentElement.cloneNode(true);
this.svgDom.style.width = "100%";
this.svgDom.style.height = "80vh";
this.svgDom.style.border = "1px solid yellow";
this.svgDom.setAttribute("v-on:mousewheel", "this.havcZooming($event)");
let adomNodeAll = this.svgDom.getElementsByTagName("a");
for(let i = 0; i < adomNodeAll.length; i++) {
adomNodeAll[i].style.cursor = 'pointer'
let currNodeId = adomNodeAll[i].getAttribute('id')
adomNodeAll[i].setAttribute("v-on:click", "this.handleClick($event, '"+ currNodeId +"')");
let currNode = this.svgDom.getElementById(currNodeId
)
}
let gtag = this.svgDom.getElementsByTagName("g");
gtag[0].setAttribute("id", "svgcanvas");
var oSerializer = new XMLSerializer();
var sXML = oSerializer.serializeToString(this.svgDom);
var Profile = Vue.extend({
template: "<div>" + sXML + '</div>'
});
new Profile().$mount('#svgTemplate');
let svgcanvasDom = document.getElementById("svgcanvas");
this.allDom = svgcanvasDom.getElementsByTagName("a");
for(let i = 0; i < this.allDom.length; i++) {
let curraNodeId = this.allDom[i].id
if(this.allDom[i].childNodes.length) {
let fontDom = this.allDom[i].getElementsByTagName("font");
if(fontDom.length) {
fontDom
[0].innerHTML = 'self'
}
let imageDom = this.allDom[i].getElementsByTagName("image");
if(imageDom.length) {
imageDom[0].attributes['xlink:href'].value = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAADUElEQVQ4jY2VzW8bRRiHn9kZ7/o7thPbbVGT8NUIQSDtja+ey4EiJFSJSnBBoP4LqBd6QhyQuFW5cUKCAwgu7V/AASkUVDWQFiq3gbYhdrCdxPs5M2gXg8ohZN/L7L6jffTO+/72N8JaS564dPEiFW/DdrtdavU6SZygtUUIwWg85NbNdWK7IlQuGtDvDxjbHicebfH8i08z2hmxs9UnSiyjwRa/3d1EVY6TGyiVhw0trhLMtZtIY/B3HmCMRSkH1y3ilhs4eYGN5jKIEmEUE4UxxgoMkrRlQRggC3VmWyv5gZX6C0wmitFoTBgESOkgpYu2DqPRgCSpUy6fRImvX89HXIJ31gRxWp3WIARCOBgjiKMYbRwQ5f9UuABcBu4A4XS9PM1nYW2EcJzsmFiNMSk8xqJIkj5R9MO/wDPAdeACMA+40/XCNH/m7KcPbLniY4WTkkFYtA6JIx/pCOYaksnwS5tOeRH4HKgdcNg0/8UTKy3mmVB0BUkcopSHEG7WyyOdOnNNhxs/Xctk8z5QP6SDtdunupyvHENIRWwsjhXUGm1UsUqr3UFYn+0/dzPgK3lmsuZannvpXSwGaywCSa1ts36qgkK6mrX1rQzYzQPcivZQ7hHAADod0UO7MstZqzLgFnD8MOAskp+/W8VY8zdCuVidQtJnhUkCere+z4BXgPcOAz65s8+3N69grINyXBCSKA4QQKlUJYp8fr93PwN+CLz5P1NOY/eZ69u1XuKQaloVPDy3iDapFjVuweD7Y4JQZTrsAefSjw6CpfvD3szoxsaQPwYBnaNHWXrqBJ12m0QX+KW3zY/rmwi1cOkfYV8FloFVYBOIpuvqNH/1s7fKDWPKPL44y9lXT3P65WVOLc9z8tlFqhWHMCrSfeTcBw/b153pn3FgtJsl5lplZuoVUq8pepLZRoV2q8R2E2q1x1D2ta8Om0cWH3/0DRveJ5lLR1FMQTqZF6bvUMAk9wj8a/kNtqJuQ6GAUi46FbbVGSzFeZ6H60Iw+TW/H+6Ot3GjPjMztQzq+wGJtpkGq9UyjmPZ2x/nrzC7lKymWCpQb1TRsZ8WjCckUgqSJEJYm7/CzrE3CPdb7N0fM7w7IByE6DHEg4igP8STS8wvvM1fZW5twKdzQs0AAAAASUVORK5CYII='
}
if(this.allDom[i].childNodes[0].getTotalLength) {
let length = this.allDom[i].childNodes[0].getTotalLength()
let duration = length / 50
let animationString = duration.toFixed(0) + "s " + "linear infinite hacvRun";
this.allDom[i].childNodes[0].style.strokeDashoffset = length;
this.allDom[i].childNodes[0].style.animation = animationString;
}
}
}
});
},
zoomimg(x, y) {
if (!x) {
x = 0;
}
if (!y) {
y = 0
;
}
const svg = d3.select("svg");
const g = d3.select("#svgcanvas");
function zoomActions() {
g.attr("transform", d3.zoomTransform(svg.node()));
}
let zoomHandler = d3.zoom().on("zoom", zoomActions).scaleExtent([0.5, 40]);
svg.call(zoomHandler);
svg.transition().duration(750).call(zoomHandler.transform, d3.zoomIdentity.translate(-x, -y).scale(2));
},
stringToXml(xmlString) {
let xmlDoc = null
if (typeof xmlString == "string") {
if (document.implementation.createDocument) {
var parser = new DOMParser();
xmlDoc = parser.parseFromString(xmlString, "text/xml");
} else if
(window.ActiveXObject) {
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(xmlString);
}
}else {
xmlDoc = xmlString;
}
return xmlDoc;
}
}
};
</script>
<style>
@keyframes dash {
to {
stroke-dashoffset: 0;
}
}
@keyframes run {
from {
stroke-dasharray: 10, 5;
}
to {
stroke-dasharray: 40, 5;
}
}
@keyframes hacvRun {
from {
stroke-width: 6;
stroke-dasharray: 10, 8;
}
to {
stroke-width: 6;
stroke-dashoffset: 0;
stroke-dasharray: 10, 8;
}
}
</style>