欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年03月13日 10:02:22   作者:小謳  
這篇文章主要介紹了vue動態(tài)渲染svg、添加點擊事件的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

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

html標簽

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

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

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

實現思路

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 -> 轉成虛擬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)設置svg部件的屬性和值
  
  // ④ 將svgDom對象轉換成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 事件)調用

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

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

特殊注意

給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 的一個構造器,用來動態(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, // 測試結果 - 值
    resultMsg: "未檢測", // 測試結果 - 字段
    resultColor: "#dcdee2" // 測試結果 - 字段背景色
   }
  };
 },
 async mounted() {
  // 將takePhoto方法綁定到window下面,提供給外部調用
  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對象轉換成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>

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

相關文章

  • Vue3使用路由VueRouter4的簡單示例

    Vue3使用路由VueRouter4的簡單示例

    在vue.js項目中使用vue-router,可以使用路由進行界面或路徑跳轉,下面這篇文章主要給大家介紹了關于Vue3使用路由VueRouter4的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • 如何利用vue展示.docx文件、excel文件和csv文件內容

    如何利用vue展示.docx文件、excel文件和csv文件內容

    最近遇到了一些新的需求,需要前端實現文件預覽功能,下面這篇文章主要給大家介紹了關于如何利用vue展示.docx文件、excel文件和csv文件內容的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • van-uploader保存文件到后端回顯后端接口返回的數據

    van-uploader保存文件到后端回顯后端接口返回的數據

    前端開發(fā)想省時間就是要找框架呀,下面這篇文章主要給大家介紹了關于van-uploader保存文件到后端回顯后端接口返回的數據,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • vue 解決文本框被鍵盤遮住的問題

    vue 解決文本框被鍵盤遮住的問題

    今天小編就為大家分享一篇vue 解決文本框被鍵盤遮住的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue中防抖和節(jié)流的使用方法

    vue中防抖和節(jié)流的使用方法

    防抖和節(jié)流是我們在開發(fā)過程中常用優(yōu)化性能的方式,可以減少不必要的計算,不浪費資源,只在適合的時候再進行觸發(fā)計算,這篇文章主要給大家介紹了關于vue中防抖和節(jié)流使用的相關資料,需要的朋友可以參考下
    2021-08-08
  • Vue.js上傳圖片到阿里云OSS存儲的方法示例

    Vue.js上傳圖片到阿里云OSS存儲的方法示例

    這篇文章主要介紹了Vue.js上傳圖片到阿里云OSS存儲的方法示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 解決vue項目運行npm run serve報錯的問題

    解決vue項目運行npm run serve報錯的問題

    這篇文章主要介紹了解決vue項目運行npm run serve報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 在vue中使用vuex,修改state的值示例

    在vue中使用vuex,修改state的值示例

    今天小編就為大家分享一篇在vue中使用vuex,修改state的值示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue進階之CodeMirror的應用小結

    Vue進階之CodeMirror的應用小結

    CodeMirror支持在線編輯代碼,風格包括js, java, php, c++等等100多種語言,下面這篇文章主要來和大家講講CodeMirror的應用,感興趣的可以了解一下
    2023-06-06
  • 詳解Vue-cli 創(chuàng)建的項目如何跨域請求

    詳解Vue-cli 創(chuàng)建的項目如何跨域請求

    本篇文章主要介紹了詳解Vue-cli 創(chuàng)建的項目如何跨域請求 ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論