【问题标题】:Animating SVG elements in jQuery + namespaced attribute issues在 jQuery + 命名空间属性问题中动画 SVG 元素
【发布时间】:2015-06-23 06:52:28
【问题描述】:

我正在尝试在 jQuery 中对 SVG 中的形状做一些基本的动画,并加载了 jQuery SVG。

问题一:

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

代码:

// 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);
}

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

Uncaught TypeError: undefined is not a function (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 );

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

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 文件中那样让它意识到它。

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

【问题讨论】:

  • 您找到解决方案了吗?我遇到了同样的问题,我没有找到任何解决方案:(
  • 不幸的是,我不记得我是否做过 - 那是 3 年前,在我不再工作的公司的一个项目中:(

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


【解决方案1】:

问题 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>

【讨论】:

  • 是的,已经试过了;您的示例仅适用于 jQuery,但 jQuery SVG 似乎不想使用它:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2012-07-14
  • 1970-01-01
  • 2012-08-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多