svg animation does not start when loaded with settimeout
我正在页面中加载2个嵌入式svg-let。一动画没有。它们使用setTimeout顺序加载。
当我加载动画时,一切都会顺利进行,动画将按预期方式开始,然后正确显示第二个静态svg。当我第一次加载第二个动画,然后加载动画的动画时,动画不会开始。
代码在这里:javascript中的jsfiddle开关#svg1和#svg2。
通过浏览器检查,我发现这可能是一个webkit错误,因为chrome和safari都显示了FF 12和Opera的良好表现。
可以使用JS代码解决此问题,还是应该向Webkit提交错误?
==添加
我认为这个问题应该改写,为什么在用settimeout加载svg之后动画无法开始。
正如Jared在下面进行的研究一样,当元素出现在DOM中并通过dom操纵重新排列到focus元素中时,它可以工作,Chrome和webkit需要一个通过对animate元素的beginElement()调用来实现。对于纯文本构造的元素,这仍然无法解决。因为我只有一台Mac,但我仍然认为这是一个业余项目,因此我完全不使用MS IE。
-
在Opera 12中对我来说效果很好。
-
@ErikDahlstrm感谢您的检查和更新的问题。
-
您知道您正在自动小提琴onLoad处理程序中加载jsFiddles $(document).ready()吗?
-
我做了一些重新格式化,以便您的标记更容易理解:jsfiddle.net/userdude/Kx3Hw/4另外,它在FF13,Win7上似乎运行良好。
-
我实际上已经弄清楚了,但是我还没有完成演示。
好吧,它花了比我预期更长的时间,但是我知道了。基本上,您在标记上使用semi- SVG和正则表达式等使用的方法,至少可以说不是完全完成它的方法。
答案是使用SVG DOM动画方法和属性,尤其是在希望运行动画时启动/停止动画。显然,Firefox只需通过操作内部HTML /标记就可以重新初始化元素和动画。但是,Chrome(Webkit?)实际上需要您以编程方式访问和控制元素。我尚未签入IE,Opera或Safari。
我重做该示例,完全省略了箭头,因为它与问题无关。相反,我专注于创建和测试动画功能。您之前缺少的关键点是:
1 2 3 4 5 6 7 8 9 10
| var $lasso = $('#lasso'),
animater = $lasso.find('animate')[0],
...
animater.beginElement();
...
animater.endElement(); |
这是我制作的演示,与您的问题有很大不同:
http://jsfiddle.net/9hBfs/
不过,我所谓的"套索"效果仍然存在。
我将引用Mozilla开发人员网络(MDN)站点,因为它们具有很多有用的信息,并且是受到高度信任的授权机构:
-
https://developer.mozilla.org/en/SVG
-
https://developer.mozilla.org/en/SVG/Element/animate
-
http://www.w3.org/TR/SVG11/animate.html#animation-mod
-
http://www.w3.org/TR/SVG11/animate.html#InterfaceElementTimeControl
-
http://www.w3.org/TR/SVG11/animate.html#RestartAttribute
-
请注意,我已经在Opera中测试过,并且效果很好。在IE9中,它不支持给Object不支持属性或方法endElement。 IE svg支持Im尚不清楚,但这并不完全令人惊讶。我看能否找到解决方法。
-
非常感谢您的调查。 beginElement确实在settimeout内表现出色。但是,我的用例实际上是关于从一段文本中构造元素,在我的应用程序中,该文本是从外部外部url读取的,然后通过regexp替换操作。再次感谢您的贡献/努力。我目前只知道通过innerHTML或jquery $()构造dom对象,所以也许还有其他方法。
-
我想我不知道该说些什么?那不是使用错误标记的原因(这就是我在原始小提琴中看到的所有内容)。如果确实需要,那么确实需要做一些事情,使您做一些奇怪的事情,例如在页面加载后重新标记并重新注入标记,而不是我建议您移至jQuery SVG或Raphael之类的库。然后使用这些库处理DOM元素。但是您不应该像这样重新标记,这对您的健康不利。 :)
-
有关库的比较,请参见以下问题:stackoverflow.com/a/2381953/451969
-
是的,我明白。我也很抱歉,没有明确指出正则表达式的摆弄是我自己实际用例的一种替代。我的眉毛越来越大,但是我对正则表达式非常满意。我目前正在研究一个项目(www.iscriptdesign.com),该项目大量使用此功能,并且我想向其中添加动画。
-
仅仅因为您知道如何使用正则表达式并不意味着您应该将它们纳入需要解决方案的每个问题中。做对了。如果可以使用正则表达式,则可以学习使用DOM方法和精美的库。
-
因此,您已经通过正则表达式/替换标记构建了整个网站?哇。
-
您的网站上已经有jQuery SVG;为什么不为此使用它?您是否遇到了迫使您退回当前方法的问题?
-
需要使用正则表达式/替换,尤其是用于操纵d属性的路径。关于JQuery SVG,我发现此库更多且多余,因为默认情况下,JQuery现在更能够处理SVG(或已修改浏览器),其余功能现在将合并到我的网站中,因此我可以制作动画并且可以抛弃图书馆。这都是主要重写的一部分。
-
好吧,那么,使用未解析的模板,直到将它们附加到元素上后,如何处理?使用模板技术,您至少能够标记所需的内容,从而替换了la {path-dimensions}。
-
@drjerry-您看过D3吗?
-
是的,绝对可以,我去年在马萨诸塞州的SVG公开赛上看到了迈克尔·博斯托克(Michael Bostock)的演讲,这是非常令人印象深刻的mbostock.github.com/d3/talk/20111018/#0,我的感觉是,它更倾向于图表/绘图,而我对蓝图,建模和可定制设计更感兴趣。但是,D3仍在我的待办事项清单中,并结合了不错的Rest Server框架。
-
@drjerry-听起来很像基于浏览器的Blender(也许也完全关闭了)。这让我想到了Three.js,其接口类似于ThreeFab。在此处查看屏幕截图。当然,该项目更多地涉及运动图形领域,我想您更多地涉及Makerbot 3D打印领域。 TinkerCAD也许吗?
-
是的makerbot,tinkercad是"大"竞争对手。我的工作还包括切出2D图纸并"压配合",折叠,缝制或粘贴到3D对象中。通过操纵2D图纸中的某些尺寸参数,可以实现可定制的设计。顺便说一句,谢谢您的关注,我希望尽快公开一个动画演示文稿,我将通过此线程通知您。
-
@drjerry-哦,好吧,我想我已经看过你在说什么了。我想看它准备好的时候。
-
嗨,我的svg动画已经准备好了,www.stretchsketch.com可在chrome,safari和firefox上运行(仅在Mac上经过测试,但chrome和firefox也可能会在Windows上启动)不幸的是,它无法在iPhone上运行(4)。问候,
-
你好。看起来不错。它有菜单或按钮可以到达某个地方吗?它止于"定制您自己的齿轮并导出到DXF以进行cnc制造"。我也注意到它记录了数百个console.log调用,最后一个是event.layerX and event.layerY are broken and deprecated in WebKit. They will be removed from the engine in the near future。
-
就目前而言,这只是介绍。当然也需要退出或跳过按钮,并且在介绍之后,菜单或类似菜单应再次弹出。关于event.layer...消息,据我所知,这些消息来自jquery(-ui)(在SO上这是一个非常受欢迎的问题),而这些消息的状态目前尚不为我所知,它并不是我的最高优先级。首先,我希望它可以用于移动Safari版本。
-
好。我不确定这是否是在您获得站点之前以某种方式杀死了脚本,还是仍在或多或少地进行中。