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:
var file = document.createElement('script'); file.setAttribute("src", tu_sciezka); file.setAttribute("type", tu_info_iż_to_javascript);
W dołączanym pliku mam zmienną
var zmienna = TU_STRUKTURA_JSON;
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
file.onload = function() {...}
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 :)
var file=document.createElement('script'); file.setAttribute("type","text/javascript"); file.setAttribute("src","media/js/data/lang."+language+".js"); var temp; /* tu próba zmiennej do przechwycenia */ file.onload = function() { sessionStorage.setObject('storedLang', lang); temp = lang; console.log(lang); /* Pokazuje OK dane */ console.log(this); /* rzuca oczywiście obiekt file */ console.log(self); /* tu zaś obiekt window */ return lang; /* Próba zwrotki */ } if (typeof file!="undefined") { /* Adding element to DOM and extracting */ document.getElementsByTagName("head")[0].appendChild(file); if(sessionStorage.storedLang) { this.translationTables[language] = sessionStorage.getObject('storedLang'); this.storedLangs.push(language); sessionStorage.removeItem('storedLang') } console.log(file.onload); /* Zwróci treść funkcji onload niestety */ console.log(temp); /* tu też kicha... */ /* Remove file from DOM */ document.getElementsByTagName("head")[0].removeChild(file); }