Vue中如何通过XMLHttpRequest调整svg的属性
Admin 2023-04-06 群英技术资讯 1122 次浏览
在实际应用中,我们有时候会遇到“Vue中如何通过XMLHttpRequest调整svg的属性”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“Vue中如何通过XMLHttpRequest调整svg的属性”文章能帮助大家解决问题。公司项目中有一个关于图标库管理的需求,大致需要在页面能够动态去更改对应svg图标的大小、颜色等(这里的更改颜色限制线性图标)。在网上查找了相关资料,做了技术的预研及demo的编写,在此记录一下。
首页我们可以利用XMLHttpRequest对象来请求对应的svg图标的远程资源链接地址,并监听实现XMLHttpRequest对象的load事件,将返回的资源进行dom对象的转换、string转换为xml。
代码如下:
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.xx.com/img/xxx.svg', true);
xhr.send();
/* 监听xhr对象 */
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.responseXML, 'xhr.responseXML---------')
}
};
xhr.addEventListener('load', () => {
const resXML = stringToXml(xhr.response);
this.svgDom = resXML.documentElement.cloneNode(true);
});
这里的工具函数stringToXml的完整代码如下:
//将字符串转化成dom对象;string转换为xml
function stringToXml (xmlString) {
let xmlDoc;
if (typeof xmlString == "string") {
//FF
if (document.implementation.createDocument) {
const parser = new DOMParser();
xmlDoc = parser.parseFromString(xmlString, "text/xml");
} else if (window.ActiveXObject) {
// eslint-disable-next-line no-undef
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(xmlString);
}
}
else {
xmlDoc = xmlString;
}
return xmlDoc;
}
这样就可以获取到远程svg资源对应的dom结构了。
产品的要求需要能够动态更改对应svg图标的宽、高、颜色值等。要实现这样的功能有以下几个小点:
const oSerializer = new XMLSerializer();serializeToString方法将svgDom对象进行字符串化;通过svgDom对象提供的宽、高属性值,结合正则来遍历svgDom字符串化后的字符串,进行宽高值的替换。代码如下:
let sXML = oSerializer.serializeToString(this.svgDom);
sXML = sXML.replace(`width="${this.svgDom.width.baseVal.value}"`, 'width="40"').replace(`height="${this.svgDom.height.baseVal.value}"`, 'height="40"')
sXML来截取svg结构表示的字符串里对应的颜色值,并结合is-color这个插件判断是否是一个真正的颜色,是的话,根据想要替换的颜色值进行全局替换就行。代码如下:let curColor = sXML.split('#')[1].substr(0, 6)
if (!isColor(`#${curColor}`)) {
curColor = sXML.split('#')[1].substr(0, 3)
}
sXML = sXML.replace(new RegExp(`#${curColor}`, "gm"), '#90EE90')
Vue实例提供的extend方法创建实例并挂载到某个元素上,代码如下:const Profile = Vue.extend({
template: "<div id='svgTemplate'>" + sXML + '</div>'
});
// 创建实例,并挂载到元素上
new Profile().$mount('#svgTemplate');
处理前的效果图:

处理后的效果图(将svg宽高由原来的20变为40,将颜色值改为"#90EE90"):

最终完整的代码如下:
testSvg () {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.xx.com/img/xxx.svg', true);
xhr.send();
/* 监听xhr对象 */
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.responseXML, 'xhr.responseXML---------')
}
};
xhr.addEventListener('load', () => {
const resXML = stringToXml(xhr.response);
this.svgDom = resXML.documentElement.cloneNode(true);
/* 将svgDom对象转换成vue的虚拟dom */
const oSerializer = new XMLSerializer();
let sXML = oSerializer.serializeToString(this.svgDom);
let curColor = sXML.split('#')[1].substr(0, 6)
if (!isColor(`#${curColor}`)) {
curColor = sXML.split('#')[1].substr(0, 3)
}
sXML = sXML.replace(`width="${this.svgDom.width.baseVal.value}"`, 'width="40"').replace(`height="${this.svgDom.height.baseVal.value}"`, 'height="40"').replace(new RegExp(`#${curColor}`, "gm"), '#90EE90')
const Profile = Vue.extend({
template: "<div id='svgTemplate'>" + sXML + '</div>'
});
// 创建实例,并挂载到元素上
new Profile().$mount('#svgTemplate');
});
},
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
目录Storage本地化存储localStoragesessionStorageStrorage本地存储实例在model文件夹下面新建一个storage.js创建storeStorage本地化存储存储优点:空间更大:cookie为4kb,storage为5mb节省网络流量:不会发送数据到服务器,直接存储在本地快速显示:
这篇文章主要为大家详细介绍了Vue实现菜单切换功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
如何用jquery实现穿梭框效果?穿梭框效果就是将在一个选择框内选中的选项添加到另一个选择框中的效果,那么这一效果要如何来实现呢?下面小编就给大家分享一下jquery实现穿梭框效果的代码,效果图和代码如下,感兴趣的朋友可以看一看。
本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了JavaScript的书写规则、变量的声明格式、变量的命名规则、及注意事项,变量的数据类型,数据类型的分类,空(null) 与 未定义(undefined)的用法,下面一起来看一下,希望对大家有帮助。
这篇文章主要为大家详细介绍了使用js中的Canvas实现橡皮擦效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008