Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dobranie sę do zmiennej z pliku dołączanego dynamicznie, przypisanie zmiennej z tego pliku do obiektu wywywołującego
thek
post
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:
[JAVASCRIPT] pobierz, plaintext
  1. var file = document.createElement('script');
  2. file.setAttribute("src", tu_sciezka);
  3. file.setAttribute("type", tu_info_iż_to_javascript);
[JAVASCRIPT] pobierz, plaintext

W dołączanym pliku mam zmienną
[JAVASCRIPT] pobierz, plaintext
  1. var zmienna = TU_STRUKTURA_JSON;
[JAVASCRIPT] pobierz, plaintext

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
[JAVASCRIPT] pobierz, plaintext
  1. file.onload = function() {...}
[JAVASCRIPT] pobierz, plaintext

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 :)
[JAVASCRIPT] pobierz, plaintext
  1. var file=document.createElement('script');
  2. file.setAttribute("type","text/javascript");
  3. file.setAttribute("src","media/js/data/lang."+language+".js");
  4. var temp; /* tu próba zmiennej do przechwycenia */
  5. file.onload = function()
  6. {
  7. sessionStorage.setObject('storedLang', lang);
  8. temp = lang;
  9. console.log(lang); /* Pokazuje OK dane */
  10. console.log(this); /* rzuca oczywiście obiekt file */
  11. console.log(self); /* tu zaś obiekt window */
  12. return lang; /* Próba zwrotki */
  13. }
  14. if (typeof file!="undefined")
  15. {
  16. /* Adding element to DOM and extracting */
  17. document.getElementsByTagName("head")[0].appendChild(file);
  18. if(sessionStorage.storedLang)
  19. {
  20. this.translationTables[language] = sessionStorage.getObject('storedLang');
  21. this.storedLangs.push(language);
  22. sessionStorage.removeItem('storedLang')
  23. }
  24. console.log(file.onload); /* Zwróci treść funkcji onload niestety */
  25. console.log(temp); /* tu też kicha... */
  26. /* Remove file from DOM */
  27. document.getElementsByTagName("head")[0].removeChild(file);
  28. }
[JAVASCRIPT] pobierz, plaintext
Powód edycji: [thek]: Fragment kodu odpowiedzialny za manipulację w DOM
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zegarek84
post
Post #2





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


pisałem do @kukix by wskazać błąd myślowy i ogólnie chciałem opisać którędy program podąży... przy programowaniu zdarzeniowym kod programu nie jest wykonywany w kolejności występowania kodu, rozgałęzienia następują prawie jak na if'ach (nie wiem do czego to przyrównać) na zdarzeniach...

ale jak tak dzisiaj na trzeźwo patrzę tylko na fragment kodu to u @kukix najprawdopodobniej jest problem ze zrozumieniem this w JS - w kodzie przypisuje this do that i potem nigdzie nie wykorzystuje, jeśli fragment kodu nie jest częścią metody to this będzie oznaczało window... potem jest użycie this w funkcji onload gdzie to this będzie znaczyło element drzewa DOM czyli to samo co zmienna file

ps.
nie wiem dlaczego, chyba dla tego, że jeśli czasami kod komuś poprawiałem to ze zmiennymi przy długich funkcjach jeśli chodzi o zasięg klamerkowy czasami różne rzeczy się dzieją np. nagle ktoś podstawi inny obiekt (chyba, że to było zamiarem) lub całkiem usunie referencję, to takie elementy obiektów gdzie chcę mieć pewność, iż nikt ich nie nadpisze jakoś wolę przekazywać przez argument do funkcji anonimowej w stylu:
[JAVASCRIPT] pobierz, plaintext
  1. file.onload = (function(that){
  2. return function(){
  3. // mam pewność, że referencja do danego obiektu mi nie zginie przez przypadek przez inne operacje kodu
  4. }
  5. })(this);
[JAVASCRIPT] pobierz, plaintext

podobnie można robić z innymi obiektami nie tylko this
a jeśli gdzieś coś ma się zmieniać dynamicznie to np. przekazuję referencję do obiektu o jeden poziom wyżej i w kodzie funkcji anonimowej odwołuję się do zmiennych składowych danego obiektu...

Ten post edytował zegarek84 19.04.2012, 10:10:10
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 05:24