日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

vue動態(tài)渲染svg、添加點擊事件的實現(xiàn)

瀏覽:158日期:2023-01-31 14:39:23

業(yè)務(wù)需求(vue項目中)

1.頁面展示svg內(nèi)容2.監(jiān)聽svg內(nèi)部的點擊事件3.動態(tài)改變svg內(nèi)部元素的屬性和值

html標(biāo)簽

經(jīng)多次實驗,用embed、img等標(biāo)簽改變src屬性的方式,均無法實現(xiàn)上述全部功能(尤其是svg內(nèi)部點擊事件),最終采用Vue.extend()方法完整實現(xiàn),代碼也較為簡潔,html結(jié)構(gòu)如下:

<template> <div> <div id='svgTemplate'></div> </div></template>

直接將svg文件的內(nèi)容復(fù)制粘貼到.vue文件里,是可以在標(biāo)簽內(nèi)直接添加@click事件完成需求的,方式簡單但會造成文件過長,本文不多陳述

實現(xiàn)思路

1.創(chuàng)建xhr對象

const xhr = new XMLHttpRequest();this.svgUrl = ...; // svg的絕對地址,在瀏覽器中打開能看到的那個xhr.open('GET', this.svgUrl, true);xhr.send();

2.監(jiān)聽xhr對象(獲取svg的dom -> 添加事件 -> 修改dom -> 轉(zhuǎn)成虛擬dom并掛載)

xhr.addEventListener('load', () => { // ① 獲取svg的dom const resXML = xhr.responseXML; this.svgDom = resXML.documentElement.cloneNode(true); // console.log(this.svgDom); // ② 添加click事件 let btn = this.svgDom.getElementById('...'); btn.setAttribute('v-on:click', 'this.handleClick()'); // ↑↑↑ 此處注意:原生事件handleClick此時在window層,解決辦法見后文 // ③ 修改 dom this.svgDom.getElementById('...').childNodes[0].nodeValue = ... this.svgDom.getElementById('...').setAttribute('style', `....; fill:${this.photoResult.resultColor}; ...`); // ↑↑↑ 用js操作dom的語法,動態(tài)設(shè)置svg部件的屬性和值 // ④ 將svgDom對象轉(zhuǎn)換成vue的虛擬dom,創(chuàng)建實例并掛載到元素上 var oSerializer = new XMLSerializer(); var sXML = oSerializer.serializeToString(this.svgDom); var Profile = Vue.extend({ template: '<div id=’svgTemplate’>' + sXML + '</div>' }); new Profile().$mount('#svgTemplate');});

3.將methods里要執(zhí)行的事件綁定到window下面,供外部(剛添加的 handleClick 事件)調(diào)用

async mounted() { window['handleClick'] = () => { this.takePhoto(); };},methods:{ takePhoto(){ ... }}

到這里就基本完成需求:動態(tài)渲染了svg、用js操作dom的語法修改svg部件的屬性和值、給svg部件動態(tài)添加了事件 handleClick,最后將 takePhoto() 事件綁定給了 window 對象的 handleClick,可以放心大膽的在 takePhoto() 里寫你要執(zhí)行的內(nèi)容了!

特殊注意

給svg的dom部件添加事件時:1.經(jīng)多次嘗試,只有 setAttribute + v-on:click 寫法有效2.setAttribute 不支持 @click(非原生事件),會報語法錯誤3.addEventListener 和 onclick 均會被 vue 攔截將svgDom對象轉(zhuǎn)換成vue的虛擬dom時:1.如果報錯如下

則將 import Vue from 'vue' 改為 import Vue from 'vue/dist/vue.esm.js'其原因及其他解決辦法本文不做探討可自行百度。2.vue.extend() 方法是 vue 的一個構(gòu)造器,用來動態(tài)創(chuàng)建 vue 實例,template 組件模板只能有一個根元素3.$mount 手動掛載到 id 為 svgTemplate的 元素上,掛載后將替換原本的dom(替換原本的 <div id='svgTemplate'></div>)。由于每次更新 svg 都要重新掛載,沒有找到 dom 元素是無法掛載的,因此 template 里面最外層的 div 也要加上 id 的屬性:

var Profile = Vue.extend({ template: '<div id=’svgTemplate’>' + sXML + '</div>' // ↑↑↑ 最外層的 id 不能省略,否則首次渲染后找不到 #svgTemplate});new Profile().$mount('#svgTemplate'); // ↑↑↑ 原本的 #svgTemplate 將被替換成 Profile 的 template

完整代碼

<template> <div> <div id='svgTemplate'></div> </div></template>

<script>import Vue from 'vue/dist/vue.esm.js';// window.handleClick = () => { // 原本的 handleClick 事件是 window 的// };export default { name: 'svg-drawing', data() { return { /* 全局 */ svgUrl: '', // svg的url svgDom: null, // 獲取到的svg元素 /* svg的變量 */ photoResult: { resultVal: 0, // 測試結(jié)果 - 值 resultMsg: '未檢測', // 測試結(jié)果 - 字段 resultColor: '#dcdee2' // 測試結(jié)果 - 字段背景色 } }; }, async mounted() { // 將takePhoto方法綁定到window下面,提供給外部調(diào)用 window['handleClick'] = () => { this.takePhoto(); }; }, created() { this.getSvg(); }, methods: { // 初始化svg getSvg() { /* 創(chuàng)建xhr對象 */ const xhr = new XMLHttpRequest(); this.svgUrl = this.baseUrl + '/svgs/' + 'test.svg'; xhr.open('GET', this.svgUrl, true); xhr.send(); /* 監(jiān)聽xhr對象 */ xhr.addEventListener('load', () => { /* 1. 獲取 dom */ const resXML = xhr.responseXML; this.svgDom = resXML.documentElement.cloneNode(true); /* 2.SVG對象添加click事件 */ let btnTakePhotoDom = this.svgDom.getElementById('...'); btnTakePhotoDom.setAttribute('v-on:click', 'this.handleClick()'); /* 3. 修改 dom */ this.svgDom.getElementById('...').childNodes[0].nodeValue = ...; this.svgDom.getElementById('...').setAttribute('style', `....; fill:${this.photoResult.resultColor}; ...`); /* 4.將svgDom對象轉(zhuǎn)換成vue的虛擬dom */ var oSerializer = new XMLSerializer(); var sXML = oSerializer.serializeToString(this.svgDom); var Profile = Vue.extend({ template: '<div id=’svgTemplate’>' + sXML + '</div>' }); // 創(chuàng)建實例,并掛載到元素上 new Profile().$mount('#svgTemplate'); }); }, // 事件 takePhoto() { ... }, }, beforeDestroy() { this.svgDom = null; }, watch: { photoResult: { handler(newVal, oldVal) { this.getSvg(); }, deep: true } }};</script>

到此這篇關(guān)于vue動態(tài)渲染svg、添加點擊事件的實現(xiàn)的文章就介紹到這了,更多相關(guān)vue動態(tài)渲染svg、添加點擊事件內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩avvvv在线播放| 精品一区二区三区四区五区| 国产99久久| 国产在线观看91一区二区三区| 97精品久久| 日韩精品视频在线看| 免费观看在线综合色| 日韩精品一区第一页| 日韩在线综合| 国产中文字幕一区二区三区| 国产一区二区三区不卡视频网站| 久久99蜜桃| 97精品国产| 成人午夜在线| 成人日韩在线| 亚洲少妇在线| 国产日韩欧美一区在线| 欧洲亚洲一区二区三区| 亚洲精品成a人ⅴ香蕉片| 91精品1区| 婷婷综合成人| 日本va欧美va欧美va精品| 国产精品中文字幕制服诱惑| 亚洲精品韩国| 青草av.久久免费一区| 国产精品亚洲成在人线| 国产成人精品一区二区三区在线| 天堂中文在线播放| 黄色不卡一区| 日韩在线电影| 欧美激情日韩| 精精国产xxxx视频在线播放| 在线综合欧美| 91精品日本| 久久中文欧美| 欧美1区2区3区| 蜜臀精品久久久久久蜜臀| 91麻豆精品| 国产福利亚洲| 成人久久一区| 日韩中文字幕麻豆| 国产精品jk白丝蜜臀av小说| 日韩在线看片| 久久亚洲精品伦理| 国产精品2023| 九一精品国产| 国产色噜噜噜91在线精品| 美女精品视频在线| 精品九九在线| 婷婷久久免费视频| 日韩欧美一区二区三区免费看| 亚洲理论在线| 精品在线91| 91亚洲一区| 中文在线а√在线8| 日韩精品麻豆| 正在播放日韩精品| 欧美日韩国产在线一区| 欧美三级第一页| 香蕉视频亚洲一级| 日本成人在线网站| 国产一区二区精品久| 国产精品嫩草99av在线| 国产精品成人**免费视频| 日本久久成人网| 伊人久久一区| 国产99在线| 天堂精品久久久久| 国产精成人品2018| 天堂成人国产精品一区| 成人亚洲欧美| 欧美一区久久| 99re国产精品| 捆绑调教日本一区二区三区| 日韩精品免费一区二区夜夜嗨 | 久久婷婷丁香| 欧美伊人久久| 亚洲欧美日韩视频二区| а√天堂8资源在线| 日韩国产欧美三级| 亚洲一级网站| 国产精品入口久久| 免费国产自线拍一欧美视频| 精品伊人久久| 日韩成人在线看| 日韩精品一区第一页| 7777精品| 国产精品99视频| 亚洲综合不卡| 麻豆视频观看网址久久| 夜夜嗨av一区二区三区网站四季av| 亚洲日本久久| 亚洲高清影视| 亚洲精品综合| 国产一区二区三区免费在线| 日本一区二区三区视频在线看| 日本高清不卡一区二区三区视频| 国产日产一区| 欧美经典一区| 国产精品久久久久久久久妇女| 亚洲精品一级二级| 国产精品国码视频| 91精品尤物| 国产精品一区亚洲| 国产激情久久| 国产精品观看| 日韩另类视频| 日韩精品一二区| 欧美亚洲专区| av资源新版天堂在线| 热久久久久久| 影音先锋久久| 黄在线观看免费网站ktv| 香蕉久久99| 综合日韩av| 国产成人精品一区二区三区视频| 国产精品色在线网站| 男女精品网站| 精品久久中文| 日韩在线a电影| 久久精品国产www456c0m| 精品国产美女a久久9999| 欧美午夜三级| 国产亚洲一区二区三区不卡| 欧美日韩国产欧| 久久uomeier| 伊人久久成人| 国产欧美日本| 日本免费新一区视频| 欧美久久香蕉| 四虎国产精品免费久久| 国产亚洲毛片在线| 亚洲精品精选| 欧美日本一区| 91大神在线观看线路一区| 婷婷成人av| 狠狠操综合网| 99成人在线| 欧美精品自拍| 免费一区二区视频| 美女日韩在线中文字幕| 国产精品尤物| 精品国产美女a久久9999| 91中文字幕精品永久在线| 天堂av在线| 亚洲一级二级| 蜜臀精品一区二区三区在线观看| 亚州国产精品| 国产日韩三级| 精品网站999| 日韩精品永久网址| 婷婷综合在线| 中文字幕日韩高清在线| 日韩三级精品| 国产高清亚洲| 欧美一区久久久| 久久久影院免费| 亚洲综合日本| 奇米777国产一区国产二区| 开心激情综合| 九色porny丨国产首页在线| 99热精品在线观看| 欧美在线不卡| 中文一区一区三区高中清不卡免费| 99精品美女| 久久福利毛片| 国产精品亚洲综合久久| 中国字幕a在线看韩国电影| 国产精品7m凸凹视频分类| 日韩中文一区二区| 捆绑调教美女网站视频一区| 韩国三级一区| 美日韩精品视频| 亚洲精品乱码久久久久久蜜桃麻豆| 成人羞羞视频播放网站| 亚洲性视频h| 蜜桃tv一区二区三区| 日韩av一区二区三区四区| 亚洲狼人精品一区二区三区| av中文资源在线资源免费观看| 视频一区二区三区中文字幕| 欧美~级网站不卡| 亚洲黄色免费看| 亚洲精品在线a| 日韩精品欧美大片| 国产高清亚洲| 久久毛片亚洲| 久久亚洲不卡| 精品美女在线视频| 亚洲欧洲一区二区天堂久久| 日韩1区在线| 久久99精品久久久久久园产越南 | 欧美久久精品一级c片| 久久不见久久见免费视频7| 中文字幕亚洲在线观看| 国产麻豆综合| 欧美午夜不卡| 亚洲成人精选| 亚洲日本网址| 国产 日韩 欧美一区|