ugrás a tartalomhoz

Javascript includes - yet another way of RPC-ing

Hojtsy Gábor · 2005. Aug. 6. (Szo), 11.06
Dinamikus JavaScript kód betöltés
 
1

Ezzel egy bajom van csak...

wiktor · 2005. Aug. 17. (Sze), 17.18
Idézem:
The problem here is that Firefox (I tested 1.0.1) does not wait until the external file is completely loaded, it does that in some parallel thread it seems.

http://cain.supersized.org/archives/2-Dynamic-loading-of-external-JavaScript-.js-files.html

Magyarul, tök jó, hogy így betölti, de ugye ez akkor lenne nagyon finomság, ha csak akkor töltök be vmit, ha tényleg szükség van rá és és rögtön utána tudom használni a betöltött rutint.

Valahogy így:
includeJs("foobar.js"); // ebben van egy foobar függvény
foobar('foobar');

De mint a fenti oldalon is írja a srác, ez firefox alatt nem működik, a foobar függvény még nem létezik. Próbálkoztam már mindenféle delay-jel, de akkor meg azt kaptam, hogy ez a script lelassítja a böngészőt, meg kívánom-e szakítani... :( Van erre ötlet? Nem találtam semmit... :(
2

callback

Hojtsy Gábor · 2005. Aug. 17. (Sze), 18.25
Hát ki lehet várni, hogy az includeJs() csak akkor térjen vissza, ha megvan a teljes szkript. A kiterjesztett PHP CHM doksi megoldásban azt csináltuk, hogy a betöltött JS visszahív egy függvényt a kódja végén, azaz az akkor hívódik meg, ha betöltődik. Az includeJs() is figyelhet egy tömböt, amiben mondjuk a betöltött szkript beállít egy értéket, és akkor figyelhető, hogy mikor töltődött be.
3

ha saját...

wiktor · 2005. Aug. 17. (Sze), 19.24
Jónak tűnnek az ötletek, nekem is eszembe jutottak, csak nem túl elegáns szerintem... :) Saját kódoknál még igen, csak akkor csúnya, ha mondjuk valami külső csomagról van szó, mondjuk egy wysiwyg editor vagy ilyesmi. Ebbe belenyúlni, hogy állítgasson értéket... Hát... :(

function loadExternalJS(url) {
	var node=document.createElement("script");
	node.setAttribute("type", "text/javascript");
	node.setAttribute("loaded", false);
	node.setAttribute("src", url);
	node.setAttribute("id", url);
	node.onload=function () {
		this.setAttribute("loaded", true); 
	}
	document.getElementsByTagName("head")[0].appendChild(node);
	while (document.getElementById(url).getAttribute("loaded")!=true) {
		var i=i+1;
	}
}
Ennél jobb ötletem nem volt, de ez meg a már említett "slow run"-nal elszáll a while miatt. :(