Можно ли переместить объект Flash внутри DOM без его перезагрузки?

Я пытаюсь использовать эффект масштаба из библиотеки jQuery UI в элементе-оболочке, который содержит объект Flash.

Проблема, с которой я сталкиваюсь, заключается в том, что содержимое моей обертки автоматически перемещается в другую оболочку (.ui-effects-wrapper), и когда это происходит, объект Flash перезагружается.

Конечно, конкретная проблема здесь связана с тактикой, используемой jQuery UI, - но в целом возможно ли перемещать объект Flash внутри DOM без его перезагрузки?

Ответ 1

Я знаю только, как это работает в Gecko (движок рендеринга Firefox). В этом движке нет, вы не можете перемещать <object> или <embed> в дереве DOM без перезагрузки связанного объекта Flash. Это на самом деле хуже, чем это: вы не можете сделать ничего, что могло бы привести к тому, что окно CSS, нарисованное объектом Flash, будет уничтожено. Gecko рассматривает CSS-поля как эфемерные; почти любая модификация DOM, включающая поддерево, содержащее <object>, приведет к уничтожению связанного поля CSS, а также любое количество манипуляций с CSS, начиная от очевидного (set display:none) до неясного (изменить opacity или overflow). Но состояние плагина привязано к дереву ящиков, а не дереву DOM, поэтому, если ящик уничтожен и воссоздан, плагин перезагружается.

Это согласен быть ошибкой; ошибка 90268, девять лет на момент написания этой статьи. См., В частности, комментарий 80 за действительно длинное объяснение, почему это так и почему, к сожалению, я не удивлюсь, если он пойдет другим девять лет без фиксации.

Возможно, вы могли бы обойти это, экспортировав все свое состояние плагина в JavaScript на странице с содержанием.

ОБНОВЛЕНИЕ: Только два года спустя ошибка исправлена! Исправление будет в Firefox 13, в настоящее время запланировано на выпуск 5 июня 2012 года; если вы захотите этого раньше, он будет в "бета-версии" 24 апреля и "авроре" вскоре после 13 марта (который сегодня). Джош Аас заслуживает большого уважения за борьбу с этим на землю; исправление прошло через 54 ревизий и изменило более 3000 строк кода.

Ответ 2

Я не знаю, можете ли вы сделать эту работу в браузерах, которые страдают от этой проблемы, что, по-видимому, связано с некоторыми тестировками на момент написания последних версий Chrome (Linux), Firefox (Win/Linux), Safari (Win) и Opera (Win/Linux)), но в Internet Explorer (или, по крайней мере, в IE6 и IE8, в Windows XP) апплет Flash не перезагружается. Однако в IE существует некоторая странность, когда SWFObject вызывает обратный вызов "embed" дважды, когда он повторно вставлен в дерево документа. Поэтому я решил просто не пытаться сделать что-то подобное и сохранить состояние Flash в JavaScript, как было предложено в первом ответе.

В любом случае, извините за отсутствие реального ответа, но поскольку это был первый результат google при поиске по той же проблеме, я подумал, что может быть полезно указать, какие браузеры я знаю об этой проблеме (я бы ответил на Комментарий jayarjo, но у меня пока нет достаточной репутации:/)