Itt az új év: 2013. Mindenkinek kívánok sok-sok boldogságot és world peace!
Találtam egy jó kis oldalt, amin sok-sok megoldás olvasható: code.google.com. De az e témában megejtett korábbi hozzászólásim is >itt< olvashatók.
Hogyan nézhetjük meg, hogy egy adott nevű függvény létezik-e, ha már nagyon elkeveredtünk a sok betöltött javascript kódok sűrűjében. A typeof(name) hívás "undefined" string-et ad vissza, ha nincs és a "name"-nek megfelelő objektum (ami még nem biztos, hogy függvény), string-et, ha valami más. Így nem meglepő, hogy "function"-t kapunk, ha a name függvény létezik.
De mit csinálhatunk akkor, ha a függvényünk neve egy string-ben van definiálva? Pánik gomb helyett használhatjuk az eval() függvényt.
var func = "_my_function_" + function_name;
var x = eval("typeof " + func);
Az x értéke "undefined" string, ha nincs, "function", ha függvény, és bármi más, ha bármi más.
Meg is hívhatjuk az függvényt, ha ellenőriztük, hogy létezik-e:
var x = eval(func + "()");
Ha nincs visszatérési érték, akkor x értéke undefined lesz. Ha van, akkor az x változó értéke a visszatérési érték lesz.
Hogyan lehetne egy eval() hívást megspórolni? Használjuk a try-catch párost, amivel (szerintem) még "normálisabb" kódot is kapunk:
var func = "_my_function_" + function_name;
try {
var ref = eval(func);
} catch (e) {
return {err: "Not defined function (" + func + ") was found!"};
}
if (typeof(ref) != 'function')
return {err: "Fatal error (" + func + ")!"};
var ret = ref();
És egy újabb érdekes adat: Egy függvényben definiált függvényben minden, a definiáló függvényben definiált változó látható (írható, olvasható) lesz. Így egy csomó paraméter átadást megspórolhatunk magunknak! És persze némileg olvashatatlanabbá tesszük a kódot. Persze, aki menet közben létrehozott nevű függvényeket hív meg, az ne panaszkodjon!
Hoppá, fogtam egy érdekességet. Amibe úgy látom, hogy többen is beleszaladtak. Ha egy HTML file tartalmaz egy <script...> tag-et és a script-en belül bárhol (mondjuk egy string-ben) feltűnik az a karaktersorozat, hogy '</script>', akkor ott véget ér a szkript parse-olása és visszatér HTML parse-olásra a browser. Ez nagy baj! Hogyan lehet ezt megszüntetni. Van ahol azt ajánlották, hogy (előre mondom, rossz!)
<script ...>
//<![CDATA[
...
var s = '</script>';
...
//]]>
</script>
Ez bár nagyon tetszetős megoldás lenne, de csak XHTML esetén működőképes! Szóval ha ilyen oldalt szeretnénk mégis, akkor egy picit csúnyább megoldáshoz kell folyamodnunk:
<script ...>
...
var s = '</scr'+'ipt>';
...
</script>
Kávéírás minden nap!
+jegyzések