我创建了一个包含 3000 多个路径的怪物动画 SVG 文件。每个路径都使用声明性 SMIL 动画独立制作动画。它在所有新浏览器中播放缓慢但很漂亮,使用 IE9 的小 js 后备。(我会发布一个链接,但它不会澄清任何事情。)
我使用 HTML5 和内联 SVG 开发了该页面。就在我完成的时候,我意识到我不想强迫移动浏览器阻塞这个巨大的文件。因此,我将 svg 移至外部文件,并将所有 xml 声明重新添加进去。在页面中的重要信息已经呈现后,我使用一些条件逻辑和一些教科书 ajax 调用外部 svg:
function loadThatSvg(){
var xhr = new XMLHttpRequest;
xhr.open('get','floral.svg',true);
xhr.onreadystatechange = function(){
if (xhr.readyState === 4) {
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304 ) {
var flowers = xhr.responseXML.getElementById('floralpaths');
var stage = document.getElementById('stage');
stage.appendChild(flowers);
}
}
};
xhr.send(null);
}
window.onload = function(){
setTimeout(loadThatSvg,3000);
}
各种浏览器中的检查器工具显示文件正在正确加载。问题是动画永远不会被触发,所以什么也没有发生!它们在 DOM 中。我可以看到他们。但是,在标记中启动 SMIL 动画的任何计时器或事件似乎都不适用于动态加载的动画元素。
但后来我阅读了关于 Bugzilla 的这个错误报告,它专注于这个用例,并表明问题已经解决(尽管对于我在 FF13 中的测试,它显然还没有解决)。唔...
是否有一些自定义函数或声明可用于在动态加载的 SVG 内容中启动 SMIL 动画的时钟?即使答案是明确的“不”,对于像我这样的人来说,知道一种或另一种方式也会很好。感谢您的澄清!
更新:
这是原始的svg文件。它适用于 FF、Opera 和 Webkit。请耐心等待:
这是一个页面,它引用了来自同一个域的同一个 SVG 文件。我已经更改了appendChild
我之前代码中的语句以包含一个adoptNode()
方法,该方法使它在 FF13 和 Opera 11.64 中工作,但动画仍然从未在 webkit 中启动: