在jQuery +命名空间属性问题中动画化SVG元素

时间:2015-04-16 17:28:34

标签: javascript jquery svg jquery-animate jquery-svg

我正在尝试使用jQuery SVG在jQuery中对SVG中的形状做一些基本动画。

问题1:

每当我尝试设置标准元素的动画时,我的控制台都会抛出错误:

代码:

// Load the map - this works fine!
var svgNode = $(divSelector).svg('get');
svgNode.clear();
svgNode.load(mapPath, {
    addTo: false,
    changeSize: true,
    onLoad: resizeSvg  // This is a function elsewhere that resizes the SVG to fill or fit within the container, using a viewbox.
});

// Try to animate all path objects
var objSelector = 'path';
// Got to add svgNode.root() to the selector, or jQuery doesn't know where to look.
if( $($(objSelector), svgNode.root()).length > 0 ) {
    $($(objSelector), svgNode.root() ).animate({
        'svgFill': 'lightblue'
    }, 2000);
}

这会在控制台中引发以下错误:

  

未捕获的TypeError:undefined不是函数(jquery.svganim.js:250)

看起来jQuery接受了animate调用,并将其正确传递给jQuery SVG的动画脚本,但它失败了。仍不确定原因。

问题2:

我想通过命名空间属性的值引用一个对象,即inkscape:label。我以前在CSS中遇到过这个问题,它通过在CSS文件的顶部添加@namespace标记并通过inkscape|label引用属性键来解决,但jQuery SVG似乎找到对象有自己的问题:

var svgNode = $(divSelector).svg('get');
var labelVal = 'foo';
var objSelector = '[inkscape\|label=\"' + labelVal + '\"]';
console.log("Selector String: '" + objSelector + "'");
console.log("Objects matched: " + $($(objSelector), svgNode.root()).length );

尽管至少有一个匹配foo的SVG路径元素,但这始终是控制台的输出:

Selector String: '[inkscape\|label="foo"]'
Objects matched: 0

我尝试了各种编写选择器的方法,包括(但不限于):

inkscape:label
inkscape|label
inkscape\\:label
inkscape\\|label
inkscape\\\:label
inkscape\\\|label

但似乎没有任何效果。有些人抛出错误,有些则没有,但仍然找到0个对象。仅使用path作为选择器的相同控制台日志消息正确识别文件中的42个元素。

我只能假设jQuery SVG遇到了命名空间属性名称的问题,但我不知道如何让它像我在CSS文件中那样使用它。

任何建议都很棒,啤酒也会欠。

1 个答案:

答案 0 :(得分:0)

  

问题2:

     

我想通过命名空间属性的值引用一个对象,   即inkscape:标签

尝试

"[inkscape\\:label=" + labelVal + "]"

var labelVal = "abc";
$("[inkscape\\:label=" + labelVal + "]").text("abc");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div inkscape:label="abc"></div>