Przerejestrowanie obiektow JS po zaladowaniu kontentu AJAX’em
Niewielka sprawa, jednak zabrala mi troche czasu. Ten przypadek wymagal dociagania skryptow JS w zaleznosci od zaladowanego kontentu (On Demand JS) lecz dostarczane obiekty mialy nazywac sie identycznie. Wazne bylo, aby metoda getAnswer obiektu Question zwracala odpowiednio sformatowane dane, w zaleznosci od wyswietlonego kontentu. Silnik ladowany byl po wejsciu na strone wraz z zawartoscia zawierajaca obiekty JS, logiczne wiec, ze parser je wczytal i zarejestrowal. Wymienny kontent zawieral override’y zaladowanych obiektow, ktore niestety nie rejestrowaly sie automatycznie.
Mamy wiec cos podobnego
Question = function() { this.answer = null; { body } }; Question.prototype.getAnswer = function() { if (this.answer != null) { return this.answer; } else { { body } } };
w kazdej dynamicznie dostarczanej zawartosci z ta roznica, ze { body } roznie formatowalo dane
Aby dzialalo to poprawnie, nalezy po wczytaniu kontentu AJAX’em zarejestrowac wczytane obiekty, a mozna to zrobic tak
function reloadScripts(id) { // pobieramy obiekt zawierajacy override'y var obj = document.getElementById(id); if (obj) { // wyciagamy tagi potencjalnie zawierajace skrypty JS var scripts = obj.getElementsByTagName("script"); for (var i = 0; i < scripts.length; i++) { script = scripts[i].innerHTML; // rejestrujemy JS'y eval(script); } } };
lub tak, jezeli dostarczamy jedynie JS’y
eval(ajax.xmlHttp.responseText);
Jak masz inny pomysl na rozwiazanie tego problemu … nie krepuj sie, daj komentsa
