![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Na początku napiszę, że problem mam rozwiązany "na okrętkę", ale podam go na końcu... Szukam bowiem rozwiązania ładniejszego ;)
Mam sobie klasę w JS, gdzie w prototypie stworzyłem funkcję do dynamicznego dołączania pliku w strukturę DOM. Standardowe utworzenie elementu script z określonym src i type a całość po utworzeniu walę jako appendChild. Coś w stylu:
W dołączanym pliku mam zmienną
i wszystko fajnie, ale plik ten jest dołączany dosłownie na chwilkę. Dołączam (to działa na bank bo obejście działa), chcę przechwycić zmienną z wewnątrz i odłączyć plik. Dla dołączanego pliku zdefiniowałem sobie zdarzenie
Próbowałem wewnątrz przechwycić var zmienna i przekazać ją wyżej do skryptu i tu jest problem, bo zasięgi widoczności sa takie, iż samą zmienną widzę, dopóki operacje wykonuję wewnątrz funkcji anonimowej (sprawdzane console.log - działa, zmienna jest ok i widoczna na tym poziomie), ale nie mogę wrzucić parametru (onload jako parametr przyjmuje event i nic innego :/), nie mogę użyć self (to mi daje hook na obiekt window) ani this (to mi daje hak na utworzony obiekt script ), a próba wejścia tam na pałę z globalną zmienna tymczasową i do niej przypisanie zawartości zmiennej z pliku kończy się oczywiście przywróceniem wartości z kontekstu globalnego zaraz po wyjściu z funkcji anonimowej. Myślałem o jakimś return wewnątrz funkcji anonimowej, ale do czego by ta wartość się przypisała? file.onload ? To po powrocie też sprawdzę (bo nie zrobiłem tego jeszcze - była 2 w nocy i chciałem już iść w kimę :D ), ale może ktoś do tego czasu mi podrzuci pomysł/wskazówkę/rozwiązanie. Może za bardzo zamotałem sobie życie lub byłem już za bardzo padnięty i zwyczajnie nie zauważyłem jakiegoś banalnego rozwiązania. Zgodnie z adnotacją na początku: zrobiłem obejście (proste po uzupełnieniu klasy Storage o dwie metody, bo ta nie ma, według dokumentacji implementujących firm, możliwości przechowywania obiektów) z użyciem sessionStorage z html5, ale Storage i starsze IE (6, 7) to oczywiście "nieporozumienie". Po powrocie na chatę wrzucę kod tego co zrobiłem, by było widać gdzie konkretnie zmiany moim zdaniem należy przeprowadzić. EDIT: Dorzucam wspomniany kod :)
Powód edycji: [thek]: Fragment kodu odpowiedzialny za manipulację w DOM
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Jeśli to było do mnie, to mogę dodać, że akurat ten fragment jest częścią funkcji sparametryzowanej co może widać będzie w pełniejszej wersji:
Oczywiście zawsze można poszerzyć o rzucanie wyjątków ale na razie "obciąłem" je. To co piszesz o "undefined" to od początku nie było tak planowane jak wspomniałeś, ale jako zabezpieczenie w razie gdyby coś poszło nie tak i obiekt file nie powstał. Stąd jego typeof, by nie dopinać do sekcji head obiektu, który jest w takim wypadku błędny. Rozumiem o czym piszesz bo moja nauka programowania to był początkowo Turbo Pascal, a potem C/C++, więc rozumiem o co Ci chodzi... Gdy tak patrzę na to, myślę że bezpieczniejsze było by owe removeChild(file) przenieść wprost do wnętrza onload jako removeChild(this), czyli przy onload wczytało by wnętrze i "odpięło się samo". Choć dla elastyczności byłoby lepiej miejsce wpinania przekazać podobnie jak that. No ale jak sam wspomniałeś - to już kosmetyka. Choć kod w stylu:
na pewno jest bezpieczniejszy jeśli chodzi o wycieki pamięci (IMG:style_emoticons/default/smile.gif) Niemniej dziękuję za wskazanie miejsca do poprawki, nawet jeśli zrobiłeś to niezamierzenie i z innych powodów, które są bardziej natury kosmetycznej. Zawsze to jakaś luka mniej (IMG:style_emoticons/default/smile.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 11.10.2025 - 22:57 |