2010-10-18 9 views
10

Próbuję użyć efektu skali z biblioteki jQuery UI na opakowaniu elementu, który zawiera obiekt Flash.Czy mogę przenieść obiekt Flash w obrębie DOM bez ponownego ładowania?

Problem, który napotykam, polega na tym, że zawartość mojego opakowania jest automatycznie przenoszona do innego opakowania (.ui-effects-wrapper), a kiedy to nastąpi, obiekt Flash jest ponownie ładowany.

Oczywiście, konkretny problem ma tu związek z taktyką stosowaną przez jQuery UI - ale ogólnie, czy możliwe jest przeniesienie obiektu Flash w DOM bez przeładowania?

Odpowiedz

13

Wiem tylko, jak to działa w Gecko (silnik renderujący Firefoksa). W tym silniku nie, nie można przenieść <object> lub <embed> w drzewie DOM bez ponownego ładowania powiązanego obiektu Flash. W rzeczywistości jest to coś gorszego: nie można zrobić niczego, co spowodowałoby zniszczenie obiektu Flash wykonanego za pomocą obiektu CSS. Gecko traktuje pudełka CSS jako efemeryczne; prawie każda modyfikacja DOM obejmująca poddrzewo zawierające <object> zniszczy powiązane pudełko CSS, a więc dowolna liczba manipulacji CSS, począwszy od oczywistego (zestaw display:none) do niejasnego (zmiana opacity lub overflow). Jednak stan wtyczki jest dołączony do drzewa skrzynek, a nie do drzewa DOM, więc jeśli skrzynka zostanie zniszczona i odtworzona, wtyczka zostanie przeładowana.

Zgadza się, że jest to błąd — bug 90268, dziewięć lat od tego pisania. Zobacz, w szczególności, comment 80 za naprawdę długie wyjaśnienie, dlaczego tak jest i dlaczego, niestety, nie zdziwiłbym się, gdyby minęło kolejne dziewięć lat bez naprawy.

Możliwe, że można obejść ten problem, eksportując cały stan wtyczki do JavaScript na stronie zawierającej.

AKTUALIZACJA: Dopiero dwa lata później błąd został naprawiony! Ta poprawka będzie dostępna w przeglądarce Firefox 13, która zostanie wydana w dniu 5 czerwca 2012 r .; jeśli chcesz tego wcześniej, będzie to "beta" 24 kwietnia, a "aurora" krótko po 13 marca (czyli dzisiaj). Josh Aas zasługuje na wiele zasługi za zmaganie się z tym problemem na ziemi — poprawka przeszła 54 poprawki i modyfikuje ponad 3 000 linii kodu.

+0

Bardzo dobra odpowiedź, dziękuję za poświęcony czas ... Szczególnie podobało mi się czytanie błędu 90268! Chociaż nie jestem bliżej poruszania obiektu Flash, powiedziałbym, że znajomość takich ograniczeń jest tak samo ważna jak wiedza, co mogę zrobić *. – JKS

+1

Nie ma za co. Wydaje mi się, że w zależności od tego, jaki jest twój większy cel, możesz uciec z kontenerem 'position: absolute', którego właściwości' top'/'left' manipulujesz z JS? – zwol

+0

Więc, czy to jest ten konkretny problem z Gecko?Nie dzieje się tak z innymi przeglądarkami, prawda? – jayarjo

2

Nie wiem, czy można to zrobić w przeglądarkach, które cierpią z powodu tego problemu - który z niektórych testów wydaje się obejmować w momencie pisania najnowszych wersji Chrome (Linux), Firefox (Win/Linux), Safari (Win) i Opera (Win/Linux)) - ale w Internet Explorerze (lub przynajmniej w IE6 i IE8, w Windows XP) aplet Flash nie jest ponownie ładowany. Jednak w IE jest trochę dziwności, gdy SWFObject wywołuje wywołanie zwrotne 'embed' dwa razy po ponownym wstawieniu do drzewa dokumentu. Postanowiłem więc po prostu nigdy nie próbować zrobić czegoś takiego i zapisać mój stan Flash w JavaScript, co zasugerowałem w pierwszej odpowiedzi.

W każdym razie, przykro mi, że nie podałem prawdziwej odpowiedzi, ale ponieważ był to pierwszy wynik Google podczas wyszukiwania w Google dla tego samego problemu, czułem, że może być użyteczne wskazanie, które przeglądarki, które znam, mają ten problem (odpowiedziałbym do komentarza jayarjo, ale nie mam jeszcze wystarczającej reputacji: /)

Powiązane problemy