Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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文件并更改填充_Javascript_Jquery_Svg - Fatal编程技术网

Javascript 加载许多svg文件并更改填充

Javascript 加载许多svg文件并更改填充,javascript,jquery,svg,Javascript,Jquery,Svg,我跟随并为我工作50% 我想在屏幕上显示许多图像(在Inkscape中绘制SVG),我已经有了这个。问题是,我想用不同的颜色绘制每个图像,如果我有一个黑色背景的圆圈,我想绘制红色或绿色。无论每个svg的内部元素如何,都将绘制所有。例如,如果我有一个带有5个方块的svg,那么所有方块都应该被涂成相同的颜色 图像可以重复,我可以有5个圆圈,1个红色,1个蓝色,2个绿色和1个XXX 我试过了 function SetSvg(div,name,color){ var dir="..

我跟随并为我工作50%

我想在屏幕上显示许多图像(在Inkscape中绘制SVG),我已经有了这个。问题是,我想用不同的颜色绘制每个图像,如果我有一个黑色背景的圆圈,我想绘制红色或绿色。无论每个svg的内部元素如何,都将绘制所有。例如,如果我有一个带有5个方块的svg,那么所有方块都应该被涂成相同的颜色

图像可以重复,我可以有5个圆圈,1个红色,1个蓝色,2个绿色和1个XXX

我试过了

   function SetSvg(div,name,color){
        var dir="../images/";
        div.svg({
            onLoad: function()
                {
                var svg = div.svg('get');
                svg.load(dir+name+'.svg', {addTo: true,  changeSize: false});        
                },
            settings: {}}
            );
        //comment is bad intent :(
        //div.find("path, polygon, circle, square").attr("fill", "#ccc");

        //div.children('svg>g>rect').attr('fill','#FFF');  
        //div.attr('fill','#DDD');
        //var svg = div.svg('get'); 
        //$('rect', svg.root()).attr('stroke', 'red');
        //and
        //$('rect').attr('fill','green')
    }
但都不管用

问题可能是inkscape为所有元素和重复的图像创建了id,这些id相互冲突

这是一个测试文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   version="1.1"
   viewBox="0 0 200 200"
   width="200"
   height="200"
   id="svg2">
  <defs
     id="defs4" />
  <metadata
     id="metadata7">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     transform="translate(0,-852.36218)"
     id="layer1">
    <path
       d="m 187.26672,105.16928 a 79.025597,72.799339 0 1 1 -158.051197,0 79.025597,72.799339 0 1 1 158.051197,0 z"
       transform="matrix(1.2329032,0,0,1.3383488,-33.450822,811.609)"
       id="path3755"
       style="fill:#000000;stroke:#ffffff;stroke-width:4;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none" />
  </g>
    </svg>

但我希望在加载时使用它,而不是在单击时使用它。

这应该可以更改上面对象的颜色…请点击此处


您可以发布一些示例对象和代码的JSFIDLE吗?这也可能取决于形状的复杂程度和颜色。它们的复杂程度是否都会有所不同?变化很小,通常是1或2个数字、矩形或带有填充和笔划的圆形路径,所有情况下都是简单多边形。对于1个svg,如果添加2个或更多,仅在第一个实例中更改填充。并且只在click事件中有效,但在load svg中无效。请参见editCan,您可以使用两个对象来突出显示问题。还可以在onload函数中尝试它,尽可能在将其加载到svg之前进行设置。
function SetSvg(div,name,color){
            var dir="../images/";
            div.svg({
                onLoad: function()
                    {
                    var svg = div.svg('get');
                    svg.load(dir+name+'.svg', {addTo: true,  changeSize: false});        
                    },
                settings: {}}
                );

            $('path').attr('fill','red') //NOT WORKS IN LOAD
        }

        function svgClick(){

                $('path').attr('fill','green') // YES WORKS
            });
        }
$( "#svg2" ).find("path").css('fill', 'red' ) ;