Autor Zpráva
peta
Profil *
Mam
<PRE id="pre">
"www.jakpsatweb.cz" *
"javascript.webz.cz" *
"www.webtvorba.cz" *
"www.w3schools.com" *
</PRE>
<DIV id="aaa"></DIV>

function objGet(x)
{var d = document; return d.getElementById?d.getElementById(x):d.all?d.all[x]:d.layers?d.layers[ x]:null;}

var a,b,c,i,j,k,l,m,n, o, r,r1,r2,q,reg,repl,reg1,repl1,viz, x,y,z;
c = new Array();
a = objGet("pre").innerHTML;
a = a.replace(/(\t)+/g,"\t");

//links
x = "([_a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,4})(?:\\\/[-_~#%&;=\\?\\.a-zA-Z0-9\ \\/]*)?"; //&amp;
y = window.location;
y = Boolean(y.hostname)?y.hostname:"www.volny.cz/peter.mlich";
z = "\\\.(\\\/[-_~#%&;=\\?\\.a-zA-Z0-9\\\/]*)+";

q = [
["\\\"("+x+")\\\"(?:\\t([^\\t\\n]*))?(?:\\t([^\\n]*))?", "<li><a href=\"http:\/\/$1\">$3 $2<\/a> $4<\/li>"]
];
for (i in q)
{
r = q[i];
reg = new RegExp(r[0],"g");
if (reg.test(a)) alert(i)
else alert(reg.source)
a = a.replace(reg,r[1]);
}

objGet("pre").innerHTML = "";
objGet("pre").style.display = "none";
objGet("aaa").innerHTML = b+a;
</script>

A cela legrace ted spociva v tom, ze, kdezto IE i Mozilla mi z toho udelaji odkazy, tak Opera nikoli. A nejlepsi na tom je, ze JS konzola je zista a ta podminka s alerty mi vypise chybu, ze se regularni vyraz neshoduje.

Zajimalo by mne, kdo mi poradi?
Treba nazor Dera a Chamurapi (nebo jaky to ma nick ten rejpal), by mne velice zajimal :)
peta
Profil *
Jo, asi tam budou chybet tabelatory, u toho PRE, tak si je tam nejak sikovne dejte:
"www.jakpsatweb.cz"\t*\t
"javascript.webz.cz"\t*\t
"www.webtvorba.cz"\t*\t
"www.w3schools.com"\t*\t
(ale musite to dat jako tab :) Pocet tabelatoru neva, to resi a = a.replace(/(\t)+/g,"\t") )
Chamurappi
Profil
Odpovím ti tvým stylem:
To si myslíš, že si někdo bude ten kód odtud kopírovat a ladit? Nedal jsi odkaz na stránku, problém neexistuje, já mám vyřešeno :-)))))))))))))).e+42
thingwath
Profil
var a,b,c,i,j,k,l,m,n, o, r,r1,r2,q,reg,repl,reg1,repl1,viz, x,y,z;

Tohle je asi ta nejúchylnější věc co jsem za posledních pár dní viděl.
Chamurappi
Profil
Reaguji na petu:
Opera v innerHTML převádí uvozovky na entity &quot;, proto se regulární výraz netrefí. Řešení je prosté:
a = a.replace(/&quot;/g, "\"");

Kdybys na JavaScriptem vygenerovaný kód poslal své oblíbené validátory (jako je posíláš na každého, komu „radíš“), vynadaly by ti, že <li> do <div>u nepatří.

"www.w3schools.com" *
W3Schools nebrat, nedoporučovat, zahrabat a nechat rozložit. Píše ho podobná drbna, jako jsi ty.

Zajimalo by mne, kdo mi poradi?
Na tohle ani nepotřebuješ JavaScriptového guru.

Když hledám chybu a ladím kód, musím vycházet z nějakých předpokladů. V tomto případě jsem předpokládal, že implementace regulárních výrazů v Opeře bude bezchybná a problém bude jinde. Vysledoval jsem tedy, co vstupuje do test a replace, a vše bylo jasné, předpoklad byl správný. Zkusil jsem pak korekci entity popsanou výše a problém zmizel. Triviální. Kdybych tu drobnost neodhalil, neodpověděl bych ti vůbec. Když řešení nevím, tak mlčím.

Když ty někomu radíš, vybalíš na něj desítky různých předpokladů, které s jeho problémem občas prokazatelně nesouvisí, aniž bys znal řešení. Cizí kódy u sebe neladíš, jen si tipuješ, co by mohlo pomoct. Pokud ten, komu se snažíš radit, nemá o JS přehled, zmateš ho. Navíc je vždy část tvých předpokladů chybná. Ve výsledku se možná chudák-tazatel dohrabe k funkčnímu kódu, ale z tvých rad si odnese i mnoho blbostí, o které vůbec nežádal. Třeba tady měl kolega wizard zjevně problém s tím, že při postupném přidávání řádků do innerHTML mu Mozilla a Explorer okamžitě zavíraly neuzavřené elementy (tedy ten otevřený <div> se sám hned zavřel). Od tebe se tam dozvěděl, že "/aaa/" je regulární výraz, že kdesi hluboko v tvém chatu by mohl najít inspiraci a že se ti nelíbí identifikátory resultDiv a id. Při tom jsi ho seřval (spíš ses mu vysmál), že nedal odkaz na stránku, a když ho konečně dal, odmítl ses na ni v Exploreru ze strachu před viry podívat. To jsou opravdu rady nad zlato.

Vytvořit si vždy pokusný soubůrek a na něm zkoušet, jestli to, co se chystáš poradit, funguje (či jestli to má vůbec nějaký vliv), přeci nezabere tolik času, ne? Pokud jsi na něco takového příliš líný, neraď vůbec. Tu lenost ti však doporučuji překonat, při ladění cizích kódů se můžeš dozvědět spoustu nového nebo si napravit neznalosti. Ty máš stále neznalostí dost a šíříš je tu jak rýmu.

Sice chceš tazateli pomoct, ale klameš ho. Mnohokrát jsi zde nabádal k opatrnosti při užívání lomítek v řetězcích -- při tom stačí provést jeden či dva jednoduché pokusy, aby sis ověřil, že jsou lomítka neškodná, řetězec zůstane řetězcem, nestane se z něj regulární výraz. Zpětné lomítko se před lomítko dává ve skriptech uvnitř HTML kódu, pokud máš někde uvnitř skriptu sekvenci znaků „</“ a pokud toužíš po validitě HTML (žádné praktické dopady to nemá). Tehdy a jen tehdy má smysl psát „<\/“ (nebo řetězec uprostřed rozseknout). Obdobně ty proměnné, jejichž názvy se ti nelíbí -- také si můžeš snadno ověřit, jestli jsou příčinou problému, k němuž se chystáš vyjádřit. Došel bys k závěru, že téměř nikdy nejsou. Zrovna tak bys skoro určitě zjistil, že ničemu nevadí podtržítka.

Změň přístup. Tak zní moje rada. Jinak do tebe budu rejpat tak dlouho... až tě kousek urejpnu.
peta
Profil *
Chamurappi
Jo, podobnym zpusobem testuji vstupy a vystupy. V zivote by mne nenapadlo, ze Opera muze byt natolik zvlastni, ze mi prevede pri akci "innerHTML"uvozovky na entitu, ackoliv k tomu nema jediny duvod.
Dik, zkusim. Super, dik, jede.

"Když ty někomu radíš, vybalíš na něj desítky různých předpokladů"
Nekdy je daleko lepsi vedet postup, jak postupovat sam nez cekat nez ti poradi.
Nejhorsi je, ze lidi casto nenapisi, co zkusili, takze pak dojdes ty a nadas mi, ze pisi vsechno, co mne napadlo. Ano, to pisi proto, ze ja takovy problem neresil. Proc bych mlcel, kdyz mam dobry napad?

"že nedal odkaz na stránku, a když ho konečně dal, odmítl ses na ni v Exploreru ze strachu před viry podívat."
Prohlidl sis tu stranku? Ja ano a usoudil jsem, ze otvirat to v IE by mohlo byt nebezpecne. Na druhou stranu, nemel jsem doma vir 2 roky. Takze si to preber, jak chces.

"Vytvořit si vždy pokusný soubůrek"
To samozrejme delam. Proto mi to funguje v IE i FF. Nenapadlo mne, ze Opera si usmysli jeste neco jineho. Takze jsem zvlast kvuli tomu splodil ten souborek nahore. Ano, neni to vedene jako odkaz na stranku, protoze v tomto pripade to snad nema smysl. Ale kdyz chces, muzu ti dat. Cekal jsem, ze s tim prijdes :)

"... nevadí podtržítka ..."
A? Muj nazor je, ze bych se te kombinaci ID a lomitkam vyhnul. Proto se to tu jmenuje diskusni forum, aby se kazdy mohl vlozit do debaty a nejmenuje se to FAQ, kde odpovidaji emancipovani lide z dane firmy na caste otazky ke svemu programu.

"rejpat tak dlouho"
Jen si rejpni :) Legrace musi byt :) Mne to nevadi, ja to to jen pri nejblizsi prilezitosti otlucu o hlavu :)

thingwath
Co se ti na mem var nezda? Deklaraci promennych setris cas provedeni scriptu. Navic jsou prohlizece, ktere bez deklarace promenne ji neumi spravne zpracovat. Zalezi na tom, jaky pouzivas script, protoze nektere funkce si provadeji var sami, treba mam pocit, ze FOR.
thingwath
Profil
peta
Neznám Javascript, ale tohle mi přijde úchylné v jakémkoliv jazyce a pokud to tam úchylné není, tak je úchylný ten jazyk. Nedokážu si představit, jak bych uhlídal, jestli tam mám deklarované všechny potřebné proměnné, udělal bych v tom nepochybně chybu a i tak by mě to stálo neskutečné množství práce. Navíc určitě není nutné, aby všechny proměnné byly deklarované ve stejném oboru platnosti, spíš to škodí.

Už vůbec nemluvím, že mít patnáct proměnných pojmenovaných podle písmen abecedy je samo o sobě docela síla...
Joker
Profil
peta
thingwatch nemyslí samotný ten příkaz, ale to opravdu úchylné pojmenování proměnných.
Názorně předvedu, co tím myslí:

Zkuste mi říct, co asi dělá tohle (vezmu PHP, nechce se mi hledat kus JS kódu):
$a->b("SELECT COUNT(a) FROM p WHERE f = ".$g);
$d = $a->c();
$d = intval($d[0]);

...a teď to zkuste ještě jednou:
$database->query("SELECT COUNT(id) FROM komentare WHERE id_clanku = ".$id);
$pocetKomentaru = $database->sql_fetch_array();
$pocetKomentaru = intval($pocetKomentaru[0]);


Kdysi na výuce programování nám říkali, že proměnné nemáme například podle postaviček ze Simpsonových :) Ale upřímně, pořád bych ještě radši bral proměnné bart, lisa, homer... než a,b,c,d,e,f,g,h... :)
Jestli za pár měsíců budete potřebovat ten skript upravit, asi bude docela legrace.
venca12
Profil
Reaguji na Chamurapi:
A souhlasím, že většina petových rad je zcela zcestných. Přidám svou zkušenost, Text odkazu, kde jsem řešil problém s přesouváním elementu s position relative. Bohužel jediný kdo se rozhodl mi "pomoci", byl již zmíněný peta a to tím způsobem, že aniž by si přečetl jedinou řádku toho co jsem napsal, poslal mi jakýsi bezvýznamný link kamsi, kde se řešení mého problému vůbec nenacházelo. Když jsem ho na to upozornil, osočil se na mne a poslal mi další bezvýznamný odkaz s tím ať si tam najdu to co potřebuji. To co jsem potřeboval jsem samozřejmě nenašel, protože to tam nebylo.

Jak jsem již uvedl zde a uvedl jsem to několikrát v té předchozí dikusi, můj problém byl s position:relative a všechny petovy (absolutne všechny) příklady používaly position:absolute.

Připadá mi, že je peta tak trochu mimo. Že je to člověk, který víc chce, než dokáže a spoustu lidí tím a díky své, zřejmě vrozené, aroganci, včetně mě na této diskusi rozčiluje. Dokonce se ani nestydí, přesto že mu zde zcela konkrétně argumentujete jeho chyby, Vám napsat, že Vám něco při nejbližší příležitosti omlátí o hlavu.

Souhlasím, že peta by měl změnit přístup, nebo odejít.
venca12
Profil
Omlouvám se,

mrknul jsem na petuv web a ted se citím trapně, ze jsem se navážel do postiženýho kluka. To co jsem napsal předtím neberte vážně.
peta
Profil *
thingwath
ja tech 15 promennych plne vyuzivam. A podle pisemn to mam proto, ze v tom mam vetsi prehled. Globalni promenne nazvu treba: anicka, dusicka, ale promenne, ktere pouzivam jen uvnitr funkce nazyvam a,b,c,d(document),e, f(formular), i,j,k,l,m, o(object), x,y,z, t(text)

$a->b("SELECT COUNT(a) FROM p WHERE f = ".$g);
$d = $a->c();
$d = intval($d[0]);

1. $a je vysledek funkce "b()", ktera provede SQL dotaz: spocitej vsechny sloupce SQL "a" z tabulky "p", kde sloupec "f"= PHP promenne $g
Jenze takhle bych to ja nikdy nenapsal, v tom je dost rozdil, vis?
Ja funkce nepojmenovavam pisemnky, ani sloupce v tabulce. U mne by to vypadalo maximalne takto:
$a -> mysql_query("SELECT COUNT(fotoid) FROM fotky WHERE `uzivatel` = '$g'");

2. do $d prirad vysledek funkce c() v objektu $a
preved na cislo 0.tou hodnotu z pole v $d

venca12
S namyslenyma klukama ala ty a Chamurappi a dalsi si opravdu nemam, co rici. Kdyby sis prostudoval ty odkazy, co tam mam na Drag & Drop, tak tam je ten problem vyreseny :)
A proc ti tam nereagoval nikdo jiny? Protoze na tomto foru jsou jen 3 lide, co maji nejake zkusenosti s Drag & drop. To je velice specificka otazka.
Mrkni na forum Prace a zakazky, tam nejaka Ivetka chtela v tom cely program... A osobne ti muzu rici, ze to neni zadna legrace napsat to tak, aby to chodilo, jak chci a jeste,a by to chodilo v IE, FF, Opere
peta
Profil *
Mimochodem, diky Chamurappi mam problem vyresen. Cili toho uznavam jeste jakz takz, ikdyz mu amnestii nedam :)
Takze navrhuji toto tema uzavrit.
thingwath
Profil
peta
Problémy jsou tam dva základní:

Zaprvé, děláš neskutečně hloupou a zbytečnou práci, když udržuješ seznam těch proměnných zcela odděleně od jejich použití. Určitě se ti nikdy nestalo, žes tam nakonec měl nějaké navíc nebo ti nějaké chyběly? Určitě ano. Spíš bych řekl, že je zázrak, když se ti to nestává. Možná na to máš nějaký nástroj, ale pak je otázka, proč by ten nástroj nemohl být přímo interpret.

A zadruhé, to pojmenování je opravdu neuvěřitelně pitomé. Jak mám aspoň zhruba tušit, co je proměnná z? Navíc v dynamicky typovaném jazyce...
venca12
Profil
Peto, promiň
peta
Profil *
thingwath
"nějaké navíc nebo ti nějaké chyběly"
To se mi skutecne nikdy nestalo. Vzdycky si to po sobe zkontroluji a dam danou promennou vyhledat. Cili navic urcite ne; min, stat se to muze.
Je to vsak kratsi pri tomto zapisu napsat
var a,b,c;
nez
var a;
var b;
var c;

"Jak mám aspoň zhruba tušit, co je proměnná z?"
Ja za to nemuzu, ze te to ve skole nenaucili.
i,j,k - bezne promenne, ktere se pouzivaji nejcasteji pro cykly nebo oznaceni souradnicoveho systemu
a,b,c - bezne pomocne promenne
x,y,z - souradnicovy system nebo vysledky nejakych vyrazu
Vetsinou toto oznaceni pouzivaji vsichni. Ze pouzivam
t - text, string
s - string
d - document
f - form
,tak to uz je jako moje odlisnost.

Zapis moji funkce vypada treba takto:
var globus;
var poloha = 1;
var sourX = 1
var sourY = 1;
function rotuj(smer)
{
var a,b,c, x,y,z;
x = smer * Math.sin(sourX);
...
}

Ze se ti me znaceni nezda a neuznavas jej, to jeste neznamena, ze tve je lepsi. Ja ti tvoje take nekritizuji.
thingwath
Profil
peta
Myslím, že se tomu říká cargo-cult programming. Mně by přišlo mnohem srozumitelnější deklarovat proměnné až když je potřebuju, je to trochu přehlednější a hlavně je s tím mnohem méně práce. Ani to není tolik náchylné k chybám.

I pomocné proměnné by mohly mít název podle toho co v nich je... Fakt je, že děláš zbytečnou práci, to je doporučení co by šlo udělat lépe, ne samoúčelná kritika (byť skutečného nesmyslného) přístupu.
peta
Profil *
thingwath
Delej, jak myslis, ale u JS promenne deklarovat pres var stejne musi. A protoze jsem zvyklej deklarovat vetsinu na zacatku, tak to tak delam.
Ze jsi zvyklej z javy, ze se ti to dela samo, tak se pak nediv, kdyz ti nebude JS fungovat.
peta
Profil *
Chamurappi
Mimochodem, prave jsem zjistil, ze Opera, ano opet tento prohlizec, ma problemy s metodou Boolean()
Konkretne mam:
if (Boolean(window.parent.ramecek.location.href))
A musel jsem to napsat jako
if (window.parent.ramecek.location.href)
Co se mi osobne moc nelibi... ja mam radeji isstet a podobne veci, aby se vedelo hned od pohledu, ze mne zajima existence...
Chamurappi
Profil
Reaguji na petu:
Nekdy je daleko lepsi vedet postup, jak postupovat sam nez cekat nez ti poradi.
Jenže ty svým obětem neradíš postup, ty jim radíš nesouvisející nesmysly. Lomítka si escapuj, jak chceš, před podtržítky se klidně schovávej pod postel, ale nedoporučuj tyto své úchylky jiným.

Ano, to pisi proto, ze ja takovy problem neresil. Proc bych mlcel, kdyz mam dobry napad?
Máš mlčet právě proto, že problém tazatele vůbec nijak neřešíš. Meleš úplně o něčem jiném. Dobré nápady nesouvisející s problémem si piš na vlastní weblog a ne tam, kde tě žádají o radu. Navíc to, abys měl skutečně dobrý nápad, se ti zatím nepoštěstilo.

Ano, neni to vedene jako odkaz na stranku, protoze v tomto pripade to snad nema smysl.
Sám napadáš ostatní, i když uvedou kousek zdrojáku. Říkáš jim, že problém může být klidně někde jinde a bez kompletního zdrojáku nemůžeš sloužit, při čemž se tomu vždy děsně tlemíš.

Muj nazor je, ze bych se te kombinaci ID a lomitkam vyhnul.
Tak si tenhle názor nech pro sebe, je to čistokrevná ptákovina.

Proto se to tu jmenuje diskusni forum, aby se kazdy mohl vlozit do debaty
Tohle fórum (a každá jeho sekce) má jistá pravidla. Nedodržuješ je. A co víc -- ty tazatelům často přímo škodíš. Buď se naprav, nebo odtud laskavě vypadni.

nejmenuje se to FAQ, kde odpovidaji emancipovani lide z dane firmy na caste otazky ke svemu programu
Emancipovaní lidé = rovnoprávně postavení lidé. Pár takových tu také máme, i když se to nejmenuje FAQ.

thingwath: "Jak mám aspoň zhruba tušit, co je proměnná z?"
Ja za to nemuzu, ze te to ve skole nenaucili.

Tebe snad ve škole učili, k čemu je určená proměnná jménem z? „Tak děti, včera jsme probírali proměnnou y, dneska si probereme z.“ Evidentně nechápeš, co ti je vytýkáno. Proměnná nazvaná podle svého účelu usnadňuje orientaci v kódu, což se hodí obzvláště tehdy, má-li se na něm podílet někdo jiný. Ladit tvůj skript je otrava, když z názvů netuším, co k čemu slouží.

ale u JS promenne deklarovat pres var stejne musi
Nemusí. Prvním přiřazením se proměnná sama deklaruje v globálním kontextu.

Ze jsi zvyklej z javy, ze se ti to dela samo
Naopak právě v Javě se deklarovat musí. Pokud vím.

prave jsem zjistil, ze Opera, ano opet tento prohlizec, ma problemy s metodou Boolean()
Tak to zase hezky rychle zapomeň, než tímhle zjištěním nakazíš někoho nevinného. V Opeře Boolean() úplně normálně funguje. Pokud ne, dokaž. Omlať mi to o hlavu.

Co se mi osobne moc nelibi... ja mam radeji isstet a podobne veci, aby se vedelo hned od pohledu, ze mne zajima existence
Tak si tu funkci vyrob, ne? A proč se zdržovat s vypisováním isset(), určitě u sebe najdeš nějaké doposud neobsazené písmenko -- nazvi si dotyčnou funkci třeba d(), ať je to všem jasné :-)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0