Feb 28 2010

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 :)