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

您的位置:首頁技術文章
文章詳情頁

vue動態渲染svg、添加點擊事件的實現

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

業務需求(vue項目中)

1.頁面展示svg內容2.監聽svg內部的點擊事件3.動態改變svg內部元素的屬性和值

html標簽

經多次實驗,用embed、img等標簽改變src屬性的方式,均無法實現上述全部功能(尤其是svg內部點擊事件),最終采用Vue.extend()方法完整實現,代碼也較為簡潔,html結構如下:

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

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

實現思路

1.創建xhr對象

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

2.監聽xhr對象(獲取svg的dom -> 添加事件 -> 修改dom -> 轉成虛擬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的語法,動態設置svg部件的屬性和值 // ④ 將svgDom對象轉換成vue的虛擬dom,創建實例并掛載到元素上 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里要執行的事件綁定到window下面,供外部(剛添加的 handleClick 事件)調用

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

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

特殊注意

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

則將 import Vue from 'vue' 改為 import Vue from 'vue/dist/vue.esm.js'其原因及其他解決辦法本文不做探討可自行百度。2.vue.extend() 方法是 vue 的一個構造器,用來動態創建 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, // 測試結果 - 值 resultMsg: '未檢測', // 測試結果 - 字段 resultColor: '#dcdee2' // 測試結果 - 字段背景色 } }; }, async mounted() { // 將takePhoto方法綁定到window下面,提供給外部調用 window['handleClick'] = () => { this.takePhoto(); }; }, created() { this.getSvg(); }, methods: { // 初始化svg getSvg() { /* 創建xhr對象 */ const xhr = new XMLHttpRequest(); this.svgUrl = this.baseUrl + '/svgs/' + 'test.svg'; xhr.open('GET', this.svgUrl, true); xhr.send(); /* 監聽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對象轉換成vue的虛擬dom */ var oSerializer = new XMLSerializer(); var sXML = oSerializer.serializeToString(this.svgDom); var Profile = Vue.extend({ template: '<div id=’svgTemplate’>' + sXML + '</div>' }); // 創建實例,并掛載到元素上 new Profile().$mount('#svgTemplate'); }); }, // 事件 takePhoto() { ... }, }, beforeDestroy() { this.svgDom = null; }, watch: { photoResult: { handler(newVal, oldVal) { this.getSvg(); }, deep: true } }};</script>

到此這篇關于vue動態渲染svg、添加點擊事件的實現的文章就介紹到這了,更多相關vue動態渲染svg、添加點擊事件內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品一区二区三区美女| 日韩专区视频网站| 亚洲成a人片| 日韩精品亚洲一区二区三区免费| 伊人久久大香线蕉av不卡| 成人综合一区| 黄色网一区二区| 精品国产鲁一鲁****| 国产精品porn| 国产精品久久久久久妇女 | av不卡免费看| 悠悠资源网久久精品| 一级欧洲+日本+国产| 亚洲一区日韩在线| 欧美日韩精品在线一区| 欧美国产另类| 欧美交a欧美精品喷水| 久久精品网址| 欧美日韩精品免费观看视欧美高清免费大片 | 久久成人精品| 天堂va欧美ⅴa亚洲va一国产| 综合亚洲自拍| 国产欧美激情| 国产精品不卡| 99综合视频| 91福利精品在线观看| 国产精品久久久久av电视剧| 久久99久久人婷婷精品综合| 日韩中文字幕区一区有砖一区 | 在线亚洲激情| 日韩精品欧美成人高清一区二区| 日韩一区精品| 福利一区二区| 国产精品社区| 精品久久影院| 欧美天堂亚洲电影院在线观看| 免费人成网站在线观看欧美高清| 日韩精品免费视频一区二区三区| 精品日韩一区| 日韩精品一区第一页| 亚州国产精品| 日韩av中文字幕一区二区三区| 国产欧美69| 丝袜美腿诱惑一区二区三区 | 亚洲激情欧美| 欧美日韩一区二区三区四区在线观看 | 午夜精品一区二区三区国产| 一区二区电影| 欧美xxxx中国| 日韩精品高清不卡| 亚洲国产一区二区在线观看| 亚洲一区二区日韩| 私拍精品福利视频在线一区| 国产日韩欧美在线播放不卡| 黑丝一区二区三区| 国产在线不卡一区二区三区| 婷婷精品久久久久久久久久不卡| 少妇久久久久| 国产精选在线| 久久中文字幕一区二区三区| 美女精品一区| 狠狠操综合网| 日韩欧美午夜| 97精品国产一区二区三区| 欧美一级二级视频| 鲁大师影院一区二区三区| 久久中文字幕一区二区| 国产视频一区二| 日韩三区四区| 日本一区二区三区视频在线看| 在线视频观看日韩| 欧美日韩黑人| 香蕉久久国产| 亚洲免费福利一区| av不卡在线| 国产女优一区| 欧美天堂亚洲电影院在线观看| 亚洲午夜久久久久久尤物| 色一区二区三区| 桃色av一区二区| 国产日韩电影| 国产乱码精品一区二区三区亚洲人| 日本高清久久| 日韩av一区二| 欧美成人aaa| 成人啊v在线| 国产亚洲亚洲| 日韩激情网站| 福利精品一区| 香蕉精品久久| 亚洲ww精品| 久久天堂影院| 日韩成人精品一区二区| 国产aⅴ精品一区二区四区| 精品国产精品国产偷麻豆| 91精品国产成人观看| 精品视频国内| 红桃视频国产精品| 国产日韩一区二区三区在线| 久久亚州av| 欧美二区视频| 欧美日韩一区二区三区四区在线观看 | 国产白浆在线免费观看| 日韩不卡在线| 日本成人在线一区| 亚洲黄色免费av| 在线精品视频一区| 欧美91在线|欧美| 日韩欧美另类一区二区| 免费欧美在线视频| 麻豆精品在线| 中文字幕一区二区三区四区久久| 福利一区二区免费视频| 综合欧美亚洲| 91精品韩国| 国产日本精品| av亚洲免费| 久久不卡日韩美女| 午夜在线视频一区二区区别| 精品久久97| 日韩va亚洲va欧美va久久| 久久久成人网| 精品成av人一区二区三区| 久久婷婷一区| 国产精品久久久免费| 免费观看在线综合色| 欧美成人基地 | av最新在线| 日本午夜精品久久久久| 久久婷婷久久| 国产一区二区三区不卡av | 国产精品毛片久久| 成人午夜亚洲| 婷婷激情一区| 婷婷精品进入| 在线精品亚洲| 国产欧美一区二区三区国产幕精品| 日韩欧美在线精品| 国产精品调教| www.com.cn成人| 91久久黄色| 日本欧美一区二区| 国产精品成人3p一区二区三区| 国产一区二区三区四区| 久久久一二三| 亚洲精品伊人| 久久激情av| 国产精选在线| 亚洲欧洲另类| 国产精品密蕾丝视频下载| 成人av三级| 亚洲3区在线| 久久69成人| 中文一区在线| 美女视频黄免费的久久| 久久婷婷亚洲| 欧美亚洲自偷自偷| 久久天堂精品| 久久国产视频网| 一区二区三区四区在线看| 五月亚洲婷婷 | 日韩中出av| 国产精品s色| 亚洲国产专区校园欧美| 日韩高清中文字幕一区| 麻豆国产在线| 亚洲精品在线二区| 国产福利一区二区三区在线播放| 日韩电影免费在线观看| 日本在线视频一区二区| 久久蜜桃资源一区二区老牛| 日韩精品免费视频人成| 欧美丝袜一区| 久久影院资源站| 亚洲综合婷婷| 亚洲高清久久| 国内在线观看一区二区三区| 五月国产精品| 亚洲免费在线| 激情婷婷综合| bbw在线视频| 国产精品综合色区在线观看| 亚洲天堂免费| 999在线观看精品免费不卡网站| 国产精品xxx| 日韩久久一区| 视频一区二区三区在线| 日韩中文影院| 久久精品国产福利| 日韩精品亚洲专区在线观看| 伊人影院久久| 国产精品欧美一区二区三区不卡| 视频在线观看91| 在线观看免费一区二区| 视频一区欧美日韩| 亚洲久久在线| 免费一级欧美片在线观看网站| 日韩精品a在线观看91| 91在线成人| 国产在线日韩精品|