![]() |
![]() ![]() |
![]() |
![]()
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
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 2 350 Pomógł: 512 Dołączył: 4.01.2009 Skąd: Wrocław / Świdnica Ostrzeżenie: (0%) ![]() ![]() |
A nie możesz po prostu tego:
Wrzucić do onload? Jeżeli tak, a jedyny problem to: Cytat this.translationTables[language] = sessionStorage.getObject('storedLang'); i słówko this to to się robi na dwa sposoby: 1. var that = this; i później użyć that lub 2. użyć https://developer.mozilla.org/pl/Dokumentac...y/Function/call Podsumowując - zrób to tak:
Jeżeli to nie to, to przygotuj jakieś najprostsze demo i napisz co chcesz zrobić jeszcze z tymi danymi. Zawsze lepiej mi się myśli, gdy mogę wykorzystać metodę prób i błędów ![]() Pozdrawiam -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Jak widać takie podejście mi umknęło
![]() Tak jeszcze w ramach wyjaśnienia... Fragment tego co dałem ma na celu otworzenie pliku z tłumaczeniami i pobranie jego wnętrza do obiektu tłumaczącego. JSON zawiera pary słowo -> tłumaczenie. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 600 Pomógł: 2 Dołączył: 1.09.2002 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Witam. Podłacze się pod temat.
![]() Prosze mi rozjaśnić troszeczke, w jaki sposób mogę się dobrać do poszczególnych zmiennych w przypadku tego skryptu, jeżeli mój plik z danymi wygląda tak: W jaki sposób odwołać się do poszczególnej zmiennej? Czy ten skrypt ładuje je jakośpo kolei do tablicy that.translationTables[language] ? Nie potafie wyświetlić tych danych a próbowałem na różne sposoby ![]() Ten post edytował kukix 18.04.2012, 12:57:23 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 2 350 Pomógł: 512 Dołączył: 4.01.2009 Skąd: Wrocław / Świdnica Ostrzeżenie: (0%) ![]() ![]() |
Cytat W jaki sposób odwołać się do poszczególnej zmiennej? Taki zapis zwie się JSON-em. W JS możesz się odwoływać do tych elementów za pomocą: Kod config['parm_1'] lub Kod config.parm_1 Cytat Czy ten skrypt ładuje je jakoś po kolei do tablicy that.translationTables[language] ? Nie koniecznie. Po prostu masz tablicę o nazwie translationTables. Teraz chcesz dodać coś do tej tablicy, więc tworzysz nowy indeks o nazwie takiej jaką ma zmienna language. Póżniej możesz się odwołać do niej np. tak: Kod this.translationTables[language]['parm_1'] //lub this.translationTables[language].parm_1 Nie jestem pewien czy na pewno o to pytałeś ![]() -------------------- |
|
|
![]()
Post
#6
|
|
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:
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 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
W moim przypadku zmienna lang jest wewnątrz pliku, który podpinałem... U Ciebie odpowiednikiem jest zmienna var config jeśli dobrze widzę... W moim kodzie jest jeszcze language, ale ta zmienna jest akurat parametrem, który zawiera 2-znakowy kod języka i staje się jednocześnie kluczem tablicy, której wartością jest to, co znajduje się w zmiennej lang w pliku
![]() ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
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 -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
![]()
Post
#9
|
|
![]() 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 ![]() ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#10
|
|
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:
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 -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 15:05 |