Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以获取引用外部svg的use元素的内容吗?_Javascript_Svg_Web Component_Custom Element_Html Imports - Fatal编程技术网

Javascript 我可以获取引用外部svg的use元素的内容吗?

Javascript 我可以获取引用外部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

我正在构建一个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>

所有内容都正确地呈现在屏幕上,但我需要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
。是的,我认为使用符号的子节点也是一种更好的方法。