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
kukix
post
Post #2





Grupa: Zarejestrowani
Postów: 600
Pomógł: 2
Dołączył: 1.09.2002
Skąd: Wrocław

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


Dzięki za podpowiedź, ale chyba coś robie nie tak.

Wstawiłem do skryptu JS na poczatku dokładnie taki kod:
  1. var file=document.createElement('script');
  2. file.setAttribute("type","text/javascript");
  3. file.setAttribute("src","config_ustaw_js.php");
  4. var that = this;
  5.  
  6. file.onload = function()
  7. {
  8. this.tablica_config[] = config;/// tutaj tez kombinowałem (IMG:style_emoticons/default/questionmark.gif)
  9. }
  10.  
  11. if (typeof file!="undefined")
  12. {
  13. document.getElementsByTagName("head")[0].appendChild(file);
  14. document.getElementsByTagName("head")[0].removeChild(file);
  15. }
  16.  
  17. tutaj próbowałem na różne sposoby wyświetlić wartość któregoś parametru ale nie wyszło :/
  18. alert(this.translationTables[].param_1);


W Twoim przykładzie była linijka z kodem: that.translationTables[language] = lang; jednak nie wiem nawet skąd ta zmienna lang

Ten post edytował kukix 18.04.2012, 16:57:13
Go to the top of the page
+Quote Post
zegarek84
post
Post #3





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

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


Cytat(kukix @ 18.04.2012, 17:54:04 ) *
  1. if (typeof file!="undefined")
  2. ...

myślisz "synchronicznie" - w kolejności pisania kodu, może nie od razu się przestawisz ale JS jest dobrą podstawą do programowania zdarzeniowego, do zrozumienia domknięć (przede wszystkim zasięgu klamerkowego) a przez to, że niemal wszystko jest referencją to przesiadka na np. C++ to nie problem ;]...

przy programowaniu zdarzeniowym musisz zapomnieć, że tam, gdzie podpinasz dane zdarzenie (funkcję, która ma się wykonać później), to kod występujący za daną funkcją jakby nie istniał (patrz przez "pryzmat" - zdarzenie będzie przed resztą kodu to tylko wtedy zdarzeniowa funkcja wykona się wcześniej - w przeciwnym wypadku zawsze później)... ale by nawiązać do cytatu... przecież if jeszcze nie jest poza zdarzeniem a zawsze będzie prawdziwy gdyż już na początku zadeklarowałeś zmienną "file=document.createElement('script');" - choć programuję tylko hobbystycznie to jednak uważam, iż zrozumienie kiedy co się, dzieje sporo ułatwia (w programowaniu zdarzeniowym if jest jakby oderwany od kodu i dana funkcja raczej wykona się później lub nigdy!!!)... jeśli coś nieraz musiałem wykonać wspierając się wątkami (w JS ich nie ma ;p), to i tak robiłem tylko część krytyczną na wątkach a resztę implementowałem na zdarzeniach...

może Ci coś pomoże stary temat a może nie - trochu teraz się podchmieliłem ale z powyższym jeśli przeczytasz z 3 razy to może zrozumiesz:
[JavaScript]Załączanie prototype poprzez js

...
ps.
a pro po tego cytatu i if'a gdyż nie do końca wytłumaczyłem i chyba nie ma sensu lepiej tłumaczyć puki nie zrozumiesz, co kiedy się dzieje, ale błędem jest konstrukcja synchronicznie wykonana w tym if'ie:
document.getElementsByTagName("head")[0].removeChild(file);
mogłeś to wykonać w funkcji asynchronicznej - aczkolwiek prywatnie uważam, iż to sprawa kosmetyczna, gdyż co miało trafić do obiektu window to trafiło i tam zostało zapamiętane a 1 element drzewa dom w porównaniu do reszty aż tyle pamięci nie odzyska... zresztą to co nieraz widziałem to śmiało można powiedzieć, iż szybkość rozwiązań zależy nie od języka programowania a od stylu programowania - widziałem kilka rozwiązań mniej zasobożernych wykonanych w php jak w c++ - oczywiście to wina nie wiedzy i każdy kiedyś się uczy, jednak jak o jednym wspomniałem tak też napiszę, iż nie ma sensu próbować za wszelką cenę coś optymalizować choćby kosztem czytelności (wszędzie są wyjątki od reguły)

Ten post edytował zegarek84 19.04.2012, 00:19:22
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: 4.10.2025 - 16:07