Zápis JS kódu do stringu (a je po problémech) – JavaScript, AJAX, jQuery – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Zápis JS kódu do stringu (a je po problémech) – JavaScript, AJAX, jQuery – Fórum – Programujte.comZápis JS kódu do stringu (a je po problémech) – JavaScript, AJAX, jQuery – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Petroff0
Věrný člen
24. 7. 2007   #1
-
0
-

Už párkrát jsem byl nucen použít JS kód uložený v řetězci, a tedy vím, jak snadno se stane žroutem času překlep/chyba v syntaxi|sestavení;
dlouhé sekvence příkazů se stávají nepřehlednými díky nemožnosti zapsat řetězec na více řádků (leda pomocí CONCATenace).
Nelze použít debugging či zvýrazňovač syntaxe......ledaže by:
Existuje snadný způsob jak příkazy zapsat v běžné víceřádkové formě do těla jakékoliv funkce a příkazový řetězec vygenerovat:

Následující ukázka je určena pro Mozillu/FF: [Používá metodu toSource a konzoli Firebugu]

1. Přiřadíme objektu Function tyto metody:

Function.prototype.toCmdLine= 

function(){ return this.toSource().replace(/^\(?function[^{]+{(.+)}\)?$/,'$1'); } ;

Function.prototype.toCmdString=
function(){ return '"' + this.toCmdLine().replace(/(["\\])/g, '\\$1') + '"'; } ;

Function.prototype.logCmds=
function(){ console.log("CmdLine:\n %s \nCmdString:\n %s \n",this.toCmdLine(),this.toCmdString()); }


2. Blok příkazů vložený do funkce xxx, řetězec vygeneruje volání: xxx.toCmdLine()
Případně lze použít anonymní funkci - vše obstará jediný výraz: function(){p1;p2...}.toCmdLine()
[Jako uvozovací znak používat pouze " ]
   /***** příklad použití řetězce ve funkci setTimeout ******/


setTimeout( function()
{
var outp;
var src = Function.prototype;
for(var f in src)
if(typeof src[f]=="function"){
outp = "METODA: " + f + "\n\n" + src[f].toString();
alert(outp);
}
}
.toCmdLine() , 2000 )

3. Pro použití např. v záložkových aplikacích potřebujeme řetězec jako čistý literál bez nevýznamných mezer=whitespace znaků.
Takový generuje metoda toCmdString, nejpraktičtější je vypsat tento literál do okna konzole a zkopírovat z něj:

(function(){

var src=Function.prototype;
for(var f in src){
if(typeof src[f]=="function"){
alert("METODA: " + f + "\n\n" + src[f].toString());
};}
})
.logCmds();
========================================= CONSOLE ================================================================================================
CmdLine:
var src = Function.prototype;for (var f in src) {if (typeof src[f] == "function") {alert("METODA: " + f + "\n\n" + src[f].toString());}}
CmdString:
"var src = Function.prototype;for (var f in src) {if (typeof src[f] == \"function\") {alert(\"METODA: \" + f + \"\\n\\n\" + src[f].toString());}}"
==================================================================================================================================================

Univerzální metody - funkční nejen v FF: [Při nepřítomnosti toSource/konzole se použije: toString/prompt]
Function.prototype.logCmds = (window.console) ?

function(){ console.log("CmdLine:\n %s \nCmdString:\n %s \n",this.toCmdLine(),this.toCmdString()); }
: function(){ prompt("CmdLine:",this.toCmdLine()); prompt("CmdString:",this.toCmdString()); } ;

Function.prototype.toCmdLine = (Function.toSource) ?
function(){ return this.toSource().replace(/^\(?function[^{]+{(.+)}\)?$/,'$1'); }
: function(){ return this.toString().replace(/[\n\r]/gm,'').replace(/^\(?function[^{]+{(.+)}\)?$/,'$1'); } ;

Function.prototype.toCmdString =
function(){ return '"' + this.toCmdLine().replace(/(["\\])/g, '\\$1') + '"'; } ;

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
Prog.0
Věrný člen
7. 8. 2007   #2
-
0
-

Je to pekne :-)

ja len, ze ak niekto (ako ja) nema rad zasahovanie do zakladnych objektov, nech si nadefinuje funkciu, ktorej sa predava parameter(funkcia) a vracia string(kod):

nieco ako:

var toCmdLine  = (Function.toSource) ?

function(f) { return f.toSource().replace(/^\(?function[^{]+{(.+)}\)?$/,'$1'); }
: function(f) { return f.toString().replace(/[\n\r]/gm,'').replace(/^\(?function[^{]+{(.+)}\)?$/,'$1'); };


potom sa da pouzit:

var str = toCmdLine(function() {


// kod funkcie

});

Nahlásit jako SPAM
IP: ...–
Prog.
Petroff0
Věrný člen
28. 8. 2007   #3
-
0
-

Vím, že to není "nejčistší" řešení, ale chtěl jsem volání ve formátu co nejjednodušším - i jedny závorky navíc (přes několik řádků)
jsou potenc.místem nové chyby když se nedaří.
Mě se většina těchhle JS detailů po měsíci trochu vykouřila z hlavy, ale vzpomínám si, že jsem nemohl přijít na to,
kdy je ()závorka u volání: (function(){. . . .}).logCmds(); [podtrzene]NUTNÁ[/podtrzene]
a kdy např. function(){. . . .}.toCmdLine() [podtrzene]NETŘEBA[/podtrzene]
<=> viz kód v příspěvcích....
A NEVÍM TO DODNES

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
28. 8. 2007   #4
-
0
-

(function(){ ... }).logCmds()

logCmds je definovana takto: Function.prototype.logCmds = function() { ... , táto metoda je teraz prístupná všekým objektom typu Function -- čiže aj anonymným funkciám. Slúži to len na to, aby sa namiesto takýchto zápisov:

function f1() {  ... };

vystup = logCmds( f1 );
vystup = logCmds( function() { } ); // anonymne

dalo používať toto: objekt.logCmds();, kde objekt je typu Function, napr:
function f1() {  ... };

vystup = f1.logCmds();
vystup = ( function(){} ).logCmds(); // anonymne


Tie zátvorky tam treba dávať stále, keď definuješ anonumnú funkciu, pretože bez nich, by došlo k zmätku, či sa jedná o Function alebo Object:

Object.prototype.metoda_objektu()

{
alert('toto je metoda vsetkych objektov');
// this tu je referencia na object z ktoreho sa metoda zavolala
};
Function.prototype.metoda_funkcie()
{
alert('toto je metoda vsetkych funkcii');
// this tu je referencia na function z ktorej sa metoda zavolala
};

function f1() { ... };
var f2 = function() { ... }; // funkcia
var f3 = new Function(...);

var o1 = new Object(); // prazdny objekt
var o2 = {}; // objekt sa definuje aj takto
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Creating_New_Objects:Using_Object_Initializers

f1.metoda_funkcie();
f2.metoda_funkcie();
f3.metoda_funkcie();

o1.metoda_objektu();
o2.metoda_objektu();

/* nič sa nestane ak dáš aj zátvorky: */
(f1).metoda_funkcie();
((f2)).metoda_funkcie();
(((o1))).metoda_objektu();

/* Myslím, že všetko jasné, ale teraz anonymne: */

// všeobecne: VÝRAZ_KTORÉHO_VÝSLEDKOM_JE_FUNCTION.metoda_funkcie();
// všeobecne: VÝRAZ_KTORÉHO_VÝSLEDKOM_JE_OBJECT.metoda_objektu();

( function() { .. } ).metoda_funkcie();
({}).metoda_objektu();
{}.metoda_objektu();

function() {}.metoda_ ...objektu ? funkcie ? ...syntax error?
// ani som to neskusal takto napisat, tie zatvorky mi tam pasuju.

pozn.: metoda_objektu() je pristupna aj pre funkcie, pretoze aj funkcia je objekt, ale to je teraz nepodstatne...

S týmy zátvorkami to máš ako v matematike. Ak ich napíšeš aj navyše, nič sa nestane, ale problém je ak ich nedáš

Nahlásit jako SPAM
IP: ...–
Prog.
Petroff0
Věrný člen
2. 9. 2007   #5
-
0
-

Přečetl jsem to dvakrát = celkově souhlasím = ale mám pocit že jsi mi ten rozdíl nevysvětlil.
[ROZDÍL= PROČ NĚKDY JE ZÁPIS function(){. . . .}.Metoda1() V POŘADKU
A JINDY ZÁPIS function(){. . . .}.Metoda2() GENERUJE SYNTAX ERROR, KTERY ODSTRANÍŠ POUŽITÍM ZÁVOREK:
(function(){. . . .}).Metoda2()]
[podtrzene] Jsou možné 2 verze: [/podtrzene]
buď žádný rozdíl není a já si to špatně pamatuju
nebo jsi mi to nevysvětlil
-----------------------------------až si udělám čaj zjistím která verze platí, jde konkretně o tyto případy-----------------------
setTimeout( function(){alert("zavorky netreba")}.toCmdLine() , 2000 );
(function(){alert("zavorky treba,bez nich to hází chybu")}).logCmds();

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
3. 9. 2007   #6
-
0
-

Uf, tak presne to neviem, ...Ja osobne tam tie zatvorky pisem stale, a tak nemusim tieto veci riesit. Chcelo by to dokonale neastudovat Javascriptacku syntax, aby si tomu rozumel do bodky.... ;-)

Nahlásit jako SPAM
IP: ...–
Prog.
Petroff0
Věrný člen
3. 9. 2007   #7
-
0
-

Mám takovou hypotézu (až bude čas,tak ji prověřím).
V JS kódu jsou pozice, kde je možno umístit:
A.výraz (vyhodnocením dává nějakou hodnotu) ......mimochodem chceme-li použít A jako B: void A
a B.příkaz (ten se provede).
Zvláštním případem je function fff(){xxxxxx} => dá se použít jako A i B
[definice funkce] X [anonymní funkce jako objekt function (fff se pak používá vevnitř xxxxx při realizaci rekurze)]

[podtrzene]Abych neodbočoval:[/podtrzene]
# v pozici B se sekvence znaků začínající function považuje za začátek definice funkce.
Mějme metodu f.m objektu function f=function.... a volání f.m() je příkaz, ale je považován za začátek definice funkce:
function fff(){.....}.m() --->interpret hlásí chybu syntaxe. [podtrzene]Závorky jsou nutné:[/podtrzene]
(function fff(){.....}).m()
# v pozici A interpret definici fce nečeká a tedy chybu nehlásí, [podtrzene]závorky netřeba:[/podtrzene]
var sss=function(){.....}.m()
setTimeout(function(){.....}.m(), 1000)
Už jsem to trochu zkoušel,asi to tak bude!!!

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 19 hostů

Podobná vlákna

Osekání stringu — založil Lido

Nacteni Stringu — založil dargorar

Kopírování stringů — založil seno1

Rozdeleni stringu — založil Figa

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý