Javascript 我可以获取引用外部svg的use元素的内容吗?
我正在构建一个web组件,在ShadowDOM中将svg图标呈现到页面上。i、 eJavascript 我可以获取引用外部svg的use元素的内容吗?,javascript,svg,web-component,custom-element,html-imports,Javascript,Svg,Web Component,Custom Element,Html Imports,我正在构建一个web组件,在ShadowDOM中将svg图标呈现到页面上。i、 e <ba-icon i="airplane"></ba-icon> 我有一个外部svg精灵文件,里面有很多svg图标 web组件的内部将以下内容呈现到阴影Dom中: <svg> <use xlink:href="i.dist.svg#i-airplane"></use> <svg> 所有内容都正确地呈现在屏幕上,但我需要SV
<ba-icon i="airplane"></ba-icon>
我有一个外部svg精灵文件,里面有很多svg图标
web组件的内部将以下内容呈现到阴影Dom中:
<svg>
<use xlink:href="i.dist.svg#i-airplane"></use>
<svg>
所有内容都正确地呈现在屏幕上,但我需要SVG中嵌入的一些信息,特别是viewbox
中包含的信息(例如:viewbox=“0 0 32”
)
我知道use
中呈现的内容也会输入到shadowdom中。但我正试图找到另一种方法来获取嵌入use
中的信息。我曾尝试使用ajax处理svg的内容,但这对于页面上的多个图标来说是一个大问题,因为web组件的每个实例现在都在进行调用。我还能怎么做
供参考:
实际上,有很多方法可以实现这一点,具体取决于您使用的SVG文件的结构以及您想做什么 使用SVG精灵作为外部文件,您可以利用HTML导入技术来解析文件:
<head>
...
<link id="ic" rel="import" href="i.dist.svg">
<script>
document.registerElement( "ba-icon", {
prototype: Object.create( HTMLElement.prototype, {
createdCallback: {
value: function ()
{
var name = "i-" + this.getAttribute( 'i' )
var sh = this.createShadowRoot()
sh.innerHTML = '<svg><use xlink:href="i.dist.svg#' + name + '"/>'
this.setAttribute( "i-viewBox", ic.import.querySelector( 'svg#' + name ).getAttribute( "viewBox" ) )
}
}
} )
} )
</script>
</head>
...
文件注册表项(“ba图标”{
prototype:Object.create(HTMLElement.prototype{
createdCallback:{
值:函数()
{
var name=“i-”+此.getAttribute('i')
var sh=this.createShadowRoot()
sh.innerHTML=“”
this.setAttribute(“i-viewBox”、ic.import.querySelector('svg#'+name).getAttribute(“viewBox”))
}
}
} )
} )
SVG文件不会被导入两次,因为它是由浏览器缓存的
注意:此解决方案(使用
)可能不是最快的,但它是最容易编码和理解的。这取决于您真正想要对属性做什么(以及何时)。HTML导入从中删除
使用类似的替代方法。您总是可以将这些信息从原始SVG中获取到自定义元素中。@Supersharp,我不确定是否遵循。当您在引用外部svg的页面上放置svg(
/images/sprite.svg#some icon
)时,浏览器将其视为外部资源,并将以与任何图像相同的方式请求该“sprite”文件。唯一的区别是通过ID(#某个图标)从sprite文件中提取特定符号。我没有将原来的svg内联到页面中。这非常好,好主意!我没有考虑导入I.dist.svg
文件。但是这样做,允许我获取viewBox数据,以便解析一些维度。由于sprite文件现在本质上是一个我可以查询的文档,所以我可以使用符号的子节点,这样我就可以避免使用use
。是的,我认为使用符号的子节点也是一种更好的方法。