Я создал монтированный анимированный SVG-файл с более чем 3000 дорожками. Каждый путь анимируется независимо, используя декларативные анимации SMIL. Он играет медленно, но красиво во всех новых браузерах, используя небольшой js-резерв для IE9. (Я бы опубликовал ссылку, но это ничего не разъясняло.)Сбой SMIL-анимации при динамически загружаемом внешнем SVG
Я разработал страницу с использованием HTML5 и встроенного SVG. Так же, как я заканчивал, я понял, что не хочу заставлять мобильные браузеры задыхаться от этого огромного файла. Поэтому я переместил svg во внешний файл и снова добавил все объявления xml. Я вызываю внешний svg после того, как важная информация на странице уже отображена, используя некоторую условную логику и некоторый учебник ajax:
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 в разметке, как представляется, не относится к динамически загружаемым элементам анимации.
Но тогда я прочитал this bug report о Bugzilla, в котором основное внимание уделяется этому варианту использования, и предполагает, что проблема решена (хотя для моих тестов в FF13 явно нет). Hmm ...
Есть ли какая-то пользовательская функция или объявление, которое я могу использовать для запуска часов анимации SMIL в динамически загружаемом SVG-содержимом? Даже если ответ будет плоским, «нет», было бы хорошо, если бы такие люди, как я, знали одно или другое. Спасибо за любые разъяснения!
UPDATE:
Вот исходный файл SVG. Он работает в FF, Opera и Webkit. Будьте терпеливы, пожалуйста:
А вот страница, что ссылки в тот же файл SVG, из того же домена. Я изменил заявление AppendChild в моем предыдущем коде включить метод adoptNode(), который получает его работы в FF13 и Opera 11.64, но анимация не все еще никогда не стартовал в WebKit:
Вы уверены, что загруженный svg находится в правильном пространстве имен? Вероятно, вы должны использовать stage.appendChild (document.importNode (цветы, истина)). Если вы все еще застряли, то предоставление полного примера в Интернете было бы полезно. –
Спасибо, Роберт. Я уверен, что вы правы, но можете ли вы объяснить, почему использовать importNode()? Кроме того, если я перехожу на этот маршрут, вы можете объяснить разницу между importNode() и acceptNode()? В чем разница между «копированием» и «перемещением» узлов? Документы неясны. Похоже, что acceptNode был бы более уместным в этом случае, так как я хочу все поддерево SVG (предполагая, конечно, что поддержка браузера есть). – Ben