Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ActionScript, Stage.width - błędy w IE7
Forum PHP.pl > Inne > Hydepark
siemakuba
O co chodzi:
  • Mam obiekt SWF, w którym scaleMode ustawione jest jako "noScale". Ustawione zarówno z poziomu AS jak i atrybutów dla htmlowego <PARAM>.
  • Ustawienie noScale potrzebuję, bo szerokość osadzonego w HTML obiektu ustawiam na 100% - potrzebuję mieć go rozciągniętego na całą dostępną szerokość strony.
  • Cała animacja polega na ruchu obiektu od lewej krawędzi okna do prawej i potem z powrotem, potrzebuję więc z poziomu AS wiedzieć, jaką faktyczną szerokość ma mój obiekt SWF. Mogę się dowiedzieć tego za pomocą właściwości Stage.width. Wszystko działa OK, ale pod Firefoxem. Sprawdzane było również na 6 systemach WinXP SP2 z zainstalowanym IE7. Na 4 z nich działa poprawnie, na 2 nie działa poprawnie.
  • Niepoprawne działanie objawia się tym, że wartość Stage.width zamiast wynosić faktyczną szerokość okna przeglądarki wynosi 0.
  • Tak, googlowałem, szukałem. Podobno to jakiś błąd w czytaniu zcachowanych SWFów przez niektóre(!) IE7. Opróżnienie cache niestety nic nie pomaga, nie pomaga też dodanie losowego ciągu znaków jako parametru do pliku SWF, co powinno zmusić przeglądarkę do czytania pliku z serwera a nie z pamięci podręcznej

Pytam, bo problem jest z kategorii "z .upy" i być może ktoś się natknął na coś podobnego i udało mu się jakoś wybrnąć z sytuacji.

pozdr.
Łukasz O.
w jaki sposób osadzasz tego flash'a na stronie?
siemakuba
  1. <object type="application/x-shockwave-flash" data="images/top-animation2.swf?parent=0&uid=1179775830" width="100%" height="114">
  2. <param name="movie" value="images/top-animation2.swf?parent=0&uid=1179775830">
  3. <param name="quality" value="high">
  4. <param name="wmode" value="opaque">
  5. <param name="bgcolor" value="#000000">


Wydaje mi się jednak, że nie tu jest problem. Jak pisałem - działa bez problemu na Fx, działa na IE6. Działa na niektórych IE7. Na niektórych IE7 nie chce działać.

pozdr.
DjKermit
Proponuję zczytać wartości na początku, zaraz po odpaleniu głównego swf'a, przechowywać np na _root'cie (lub w statycznej klasie) i do nich się odwoływać.
Łukasz O.
zainteresuj się tym - jak narazie nie potrafię wywołać Twojego błędu
siemakuba
Cytat(DjKermit @ 21.05.2007, 21:36:53 ) *
Proponuję zczytać wartości na początku, zaraz po odpaleniu głównego swf'a, przechowywać np na _root'cie (lub w statycznej klasie) i do nich się odwoływać.


Tak właśnie robię.
Nie ma znaczenia, czy złapię wartość Stage.width na początku do zmiennej i korzystam ze zmiennej, czy korzystam z niej bezpośrednio później w kodzie.

Kiedy wszystko jest OK, Stage.width ma odpowiednią wartość, kiedy nie jest - ma wartość 0.

edit:
Cytat
jak narazie nie potrafię wywołać Twojego błędu

Ten błąd nie jest odtwarzalny. Powtórzę jeszcze raz - na niektórych IE7 w firmie od początku wszystko działa, działało przy wszelkich debugach tak jak się spodziewałem.
Na dwóch z IE7 w firmie nie działa od początku. Wartość Stage.width uparcie wynosi 0.

pozdr.
Łukasz O.
po pierwsze nie ma się co denerwować;) proponowałem po prostu sprawdzić

po drugie - oto Twoje rozwiązanie:
Kod
Stage.scaleMode = "noScale";
var szerokosc:Object = new Object();
szerokosc.onResize = function () {
    _root.rozmiar.text=Stage.width; //rób co chcesz - ja dla testu dawałem tekst środek sceny
}
Stage.addListener(szerokosc);


jak będziesz wiedział, że dalej Ci to ten nasłuch nie potrzebny to daj "Stage.removeListener(szerokosc)"

PS. gdyby ktoś jeszcze szukał rozwiązania i nie wiedział gdzie pies pogrzebany - flash w IE odbiera dwa sygnały onResize i ustawia je na 0 - dlatego trzeba od początku nasłuchiwać i wychwytywać te zmiany
siemakuba
:) @Łukasz O.: nie nie, to nie nerwy :) Chciałem wyraźnie podkreślić istotę problemu :)
Widzisz, znalazłem już wcześniej to, co podałeś. Owszem, fajnie wszystko działa, ale na tych IE na których działało i bez tego...
Niestety na tych, na których nie działało to nic nie pomaga - robiłem nawet mniej więcej taki debug jak u ciebie - pisałem wartość Stage.width do TextFielda - ciągle było to 0 :/

Dzięki za zainteresowanie - nie mam za bardzo jak tego w tej chwili nawet testować - na moim PC działa bez problemu, będę z tym walczył jutro od rana.

Co do SWFObject - znam to, i nie sprawdzałem czy cokolwiek zmieni użycie tego. Było to zrobione w zupełnie innym celu, ale z pewnością warto sprawdzić, co też jutro uczynię ;)

edit:
Po wykonaniu testów właśnie dostałem info, że wszystko zaczęło działać tam, gdzie wcześniej nie działało.
Rozwiązanie okazało się w sumie dość banalne, nie było tylko oczywiste, że tam trzeba go szukać gdzie się znalazło ;)
Zamiast pliku *.swf w źródle HTML dałem odwołanie do pliku *.php, którego zadaniem jest zaserwowanie swfa. Plik php poza podaniem swfa dodaje nagłówki, które wymuszają pominięcie cache przez IE:
  1. <?php
  2. header("Cache-Control: no-cache, must-revalidate");
  3. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  4. header("Content-Type: application/x-shockwave-flash");
  5. header("Content-Disposition: inline; filename=top-animation2.swf");
  6. readfile("top-animation2.swf");
  7. ?>


pozdr.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.