Autor Zpráva
pepa89
Profil *
prosím jak zkrátit tento script.
Děkuji

<script type="text/javascript"><!--
function validate(formular)
{var p;
p=formular.name_of;    if(p.value == ""){alert(" is empty");p.focus();return false;}
p=formular.email;    if(p.value == ""){alert("is empty");p.focus();return false;} 
p=formular.first_name;    if(p.value == ""){alert(" is empty");p.focus();return false;} 
..... až stovka těchto řádku
    return true;
}
// --></script>

Moderátor Davex: Titulek „delka scriptu“ nevystihuje podstatu dotazu. Příště zkus prosím vymyslet lepší.
Moderátor Davex: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
shaggy
Profil
pepa89:
prosím jak zkrátit tento script.
<script type="text/javascript"><!--
function validate(formular)
{
return true;
}
// --></script> 

akurát, že asi nebude robiť to, čo by si potreboval.
Kry5
Profil
pepa89:
A proč to potřebuješ zkracovat? Jestli chceš zkrátit a zachovat aktuální funkčnost tak s tim moc nenaděláš...

Edit: nevšiml jsem si "další sto řádků" :-)

shaggy:
:-D
spíš
return false;
to bude fungovat o trošku líp ;-)
pepa89
Profil *
děkuji return false by asi pomůže.
shaggy
Profil
pepa89:
Svojim príspevkom som ti chcel naznačiť, že z tvojej otázky moc rozumní nie sme.
Netušíme, čo je na tých sto riadkoch, možno tam kontroluješ iba inputy, možno je tam niečo iné.

Ale v stručnosti by som to urobil nejak takto:
- každému povinnému polu by som dal nejakú triedu (alebo iný identifikátor)
- vo funkcii validate by som si na začiatku definoval premennú, napr. isValid a dal by som jej hodnotu true
- v momente, keby niektorý z inputov bol prázdny, isValid by získal hodnotu false
- nakonci by som vrátil hodnotu isValid
ale dá sa to urobiť určite jednoduchšie, toto je časť môjho riešenia, ktoré používam.
Ak dáš viac informácií, možno poradíme lepšie
asdasd
Profil *
Třeba takhle:

<!doctype html>
<html>
    <head>
        <title>
            Rotace textů
        </title>
        <meta charset="utf-8">
        <script src="http://code.jquery.com/jquery-1.7.min.js"></script>
        <script>
            $.fn.validate = function() {
                var empty = '', $focus;
                $('[type=text][data-validate]', this).each(function() {
                    var $input = $(this);
                    if (!$.trim($input.val())) {
                        if (!empty)
                            $focus = $input;
                        empty += 'Pole ' + $input.data('validate') + ' je prázdné.' + '\n';
                    }
                });
                if (empty) {
                    alert(empty);
                    $focus.focus();
                }
                return !empty;
            };
            
            $(function() {
                $('form [type=submit]').click(function() {
                    return $(this).closest('form').validate();
                });
            });
         </script>
    </head>
    <body>
        <form>
            <input
                name="name"
                type="text"
                data-validate="Jméno"
            />
            <br />
            <input
                name="email"
                type="text"
                data-validate="E-mail"
            />
            <br />
            <input
                name="address"
                type="text"
                data-validate="Adresa"
            />
            <br />
            <input type="submit">
        </form>
    </body>
</html>


Všem polím která se mají validovat přiřaď atribut data-validate s popiskem, který se má zobrazit v alertu s upozorněním.
_es
Profil
pepa89:
prosím jak zkrátit tento script.
for alebo while.
Upresni rozumne svoj dotaz a možno dostaneš rozumnú radu.
Možno postačí:
function validate(formular){
  var elements = formular.elements, n = elements.length, e;
  for(var i = 0; i < n; i++)if((e = elements[i]).value){alert(e.name + " je prázdne"); e.focus(); return false};
  return true;
}

asdasd:
Třeba takhle:
On chcel skript skrátiť a nie pridať do stránky nepotrebný externý skript.
asdasd
Profil *
_es: Podle mě je zase lepší univerzální externí skript na pár řádků, než neudržovatelný nepřehledný kód na 100 řádků.
asdasd
Profil *
Je to jenom jedna z možností. Tvůj kód by samozřejmě taky šel použít, ale nemáš v něm ošetřené bílé znaky, kontroluješ úplně všechno(což asi není záměr), nevypisuješ názvy a nedáváš prvnímu z prázdných prvků focus.
Chamurappi
Profil
Reaguji na asdasda:
Ptal se, jak má zkrátit svých pár řádků a ty mu radíš přidat zbytečně celý framework. Krom toho mi nepřipadá uvedený skript moc hezký:
1) Proč zavádět na popis pole další atribut? Neelegantní. Má-li být někde v HTML, proč nepoužít text z <label>u?
2) Proč reaguješ na kliknutí na tlačítko s type="submit"? Proč nereaguješ raději na událost odeslání formuláře?
3) Proč spojuješ potenciálně větší množství řetězců plusem?
4) V JavaScriptu není zvykem začínat proměnnou dolarem (starší specifikace to explicitně vyhrazovala strojově generovaným skriptům), takže tím mateš zdejší zvýrazňovač kódu :-)

je zase lepší univerzální externí skript na pár řádků
Není univerzální, kontroluje jen neprázdnost textových polí. Není důvod, aby se věšel na globální $.fn. To je podobně neprozíravé, jako kdyby _es dal svoji kontrolu na Element.prototype.

nemáš v něm ošetřené bílé znaky
To není ani v původním skriptu. Pokud jsem to pepou dodané minimum informací dobře pochopil, požadovaná kontrola slouží jen k tomu, aby upozornila uživatele, že na nějakou kolonku zapomněl. Není řečeno, že by měla zkoumat něco víc. Jinak samozřejmě na oříznutí bílých znaků může použít .replace(/^\s+|\s+$/g, "").


Reaguji na pepu89:
function validate(formular)
{
  var nazvy = { "name_of": "Name of", "email": "E-mail", "first_name": "First name" };
  var chyby = [];
  for(var n in nazvy)
  {
    if(!formular[n].value)
    {
      if(!chyby.length) formular[n].focus();
      chyby.push(nazvy[n] + " is empty.");
    }
  }
  if(!chyby.length) return true;
  alert(chyby.join("\n"));
  return false;
};
asdasd
Profil *
Ptal se, jak má zkrátit svých pár řádků a ty mu radíš přidat zbytečně celý framework.

- Jak už jsem psal výš, je to jedna z mnoha možností.

Proč zavádět na popis pole další atribut? Neelegantní. Má-li být někde v HTML, proč nepoužít text z <label>u?

- Protože tady není link na stránku, takže neznám strukturu formuláře, proto jsem to napsal tak, aby to neybo na struktuře závislé.

Proč reaguješ na kliknutí na tlačítko s type="submit"? Proč nereaguješ raději na událost odeslání formuláře?

- To mi nedošlo, napsal jsem to nějak automaticky, nicméně výsledek je úplně stejný.

Proč spojuješ potenciálně větší množství řetězců plusem?

- Nechci polemizovat, co už je větší množství a co ještě ne nebo jestli by se to mělo spojovat například joinem polí, v tomhle případě mi to přijde jako neopodstatněná optimalizace.

V JavaScriptu není zvykem začínat proměnnou dolarem (starší specifikace to explicitně vyhrazovala strojově generovaným skriptům), takže tím mateš zdejší zvýrazňovač kódu :-)

- Ve skriptech používajících jQuery je poměrně rozšířená konvence označovat proměnné obsahující objekty prvků právě dolarem. Ale pokud to vadí zvýrazňovači, tak nemám problém psát to bez nich.

Není univerzální, kontroluje jen neprázdnost textových polí.

- Univerzální je v tom smyslu, že se nemusí upravovat při každé změně formuláře. Osobně používám vlastní opravdu univerzální skript založený na regulárních výrazech, ale kontrola na prázdná pole byla přesně to, co tazatel chtěl(soudím podle jeho původního skriptu).

Není důvod, aby se věšel na globální $.fn.

- Taky není zásádní důvod, aby se tam nevěšel :-D. Pokud s tím má někdo problém, tak si to může během chvilky přepsat normální funkci.

„nemáš v něm ošetřené bílé znaky“ To není ani v původním skriptu. Pokud jsem to pepou dodané minimum informací dobře pochopil, požadovaná kontrola slouží jen k tomu, aby upozornila uživatele, že na nějakou kolonku zapomněl. Není řečeno, že by měla zkoumat něco víc.

- Že podobnou elementární věc neošetřil už tazatel znamená, že jí neošetřím ani já? Promiň, ale to mi nedává smysl.
shaggy
Profil
asdasd:
- To mi nedošlo, napsal jsem to nějak automaticky, nicméně výsledek je úplně stejný.
A čo ak nekliknem na button, ale odošlem formulár enterom?
asdasd
Profil *
shaggy: Uznávám chybu, nedošlo mi to.
Chamurappi
Profil
Reaguji na asdasda:
nicméně výsledek je úplně stejný
Jen pokud je ve formuláři tlačítko. Neobrázkové.

v tomhle případě mi to přijde jako neopodstatněná optimalizace
Čím je opodstatněná neoptimalizace?

Taky není zásádní důvod, aby se tam nevěšel :-D
Je. Logicky tam nepatří.

Že podobnou elementární věc neošetřil už tazatel znamená, že jí neošetřím ani já? Promiň, ale to mi nedává smysl.
To přeci není elementární věc, není důvod ji ošetřovat. Pokud chci kontrolovat jen to, jestli uživatel na kolonku nezapomněl, nedává žádný smysl ověřovat, jestli do ní nenapsal mezeru. Pokud chci kontrolovat obsah, pak bych měl kontrolovat něco víc, než bílé znaky. Ve vzácných případech může být mezera i zcela legitimní hodnota.


Reaguji na shaggyho:
Tak se vyvolá prokliknutí prvního odesílacího tlačítka.
asdasd
Profil *
Jen pokud je ve formuláři tlačítko. Neobrázkové.

Viz odpověď Shaggymu: uznávám chybu, v tu chvíli mi to nedocvaklo.

Čím je opodstatněná neoptimalizace?

Schválně si udělej test na spojení tisíce řetězců(pro formulář by to myslím mohlo stačit ;-)) - netrvá to ani jednu milisekundu. Můžeš mi prosím říct jediný rozumný důvod, proč optimalizovat operaci, která sama o sobě probíhá v řádu mikrosekund? Nezlob se na mě, ale tohle je typický případ antipatternu "premature optimalization".

V dalších dvou bodech se zřejmě neshodneme a po pravdě už ani nemám moc náladu tady dál slovíčkařit.
Chamurappi
Profil
Reaguji na asdasda:
Nezlob se na mě, ale tohle je typický případ antipatternu "premature optimalization".
Tohle je zase případ antipatternu „falešně označím optimalizaci za předčasnou, protože počítače jsou ďábelsky rychlé“, kterým můžeš hájit libovolnou koninu.

netrvá to ani jednu milisekundu
Spojování polí místo sčítání řetězců se dělá zejména kvůli paměti, která může narůstat exponenciálně.
asdasd
Profil *
Tohle je zase případ antipatternu „falešně označím optimalizaci za předčasnou, protože počítače jsou ďábelsky rychlé“, kterým můžeš hájit libovolnou koninu.

Naprosto průhledný a ve všech jazycích standardní postup je "libovolná konina"?

Spojování polí místo sčítání řetězců se dělá zejména kvůli paměti, která může narůstat exponenciálně.

Tohle platí jenom v IE7 a starších, novější enginy tenhle problém nemají. Pokud tě baví používat kvůli dosluhujícímu šrotu se 4% uživatelů nějaké magické postupy, tak ti to neberu, ale nedělej z toho prosím nějakou "best practice".
Chamurappi
Profil
Reaguji na asdasda:
Naprosto průhledný a ve všech jazycích standardní postup je "libovolná konina"?
Nenazval jsem koninou tenhle konkrétní postup, jen jsem upozornil, že je tvůj pseudoargument přenositelný i na Bogosort, protože se současným hardwarem je všechno rychlé.

Naprosto průhledný a ve všech jazycích standardní postup
Spojování řetězců není zase tak průhledné, když nemáš nastudováno, jak jazyk pracuje. Standardní postup v Javě, C#, Pythonu a kdovíkdeještě je používat na skládání řetězců StringBuffer, StringBuilder, MutableString a kdovícoještě, protože obyčejné spojování vytváří kopie.

Tohle platí jenom v IE7 a starších, novější enginy tenhle problém nemají.
Vskutku. Zajímavé. Díky za informaci.

Pokud tě baví používat kvůli dosluhujícímu šrotu se 4% uživatelů nějaké magické postupy
Vážím si každého návštěvníka, nehledě na to, jakým šrotem zrovna brouzdá. Optimalizace ocení víc uživatelé s pomalejším prohlížečem, takže i kdyby jich bylo jen 1 %, je to best practice.
asdasd
Profil *
Nenazval jsem koninou tenhle konkrétní postup, jen jsem upozornil, že je tvůj pseudoargument přenositelný i na Bogosort, protože se současným hardwarem je všechno rychlé.

Tohle beru, ale v kontextu to tak na první pohled nevypadalo.

Standardní postup v Javě, C#, Pythonu a kdovíkdeještě je používat na skládání řetězců StringBuffer, StringBuilder, MutableString a kdovícoještě

Jasně, ale zároveň je ve jmenovaných jazycích naprosto legitimní postup použít pro spojení řetězců operátor +. Jestli je vhodné ho používat v cyklu jsem nerozebíral.

Vážím si každého návštěvníka, nehledě na to, jakým šrotem zrovna brouzdá. Optimalizace ocení víc uživatelé s pomalejším prohlížečem, takže i kdyby jich bylo jen 1 %, je to best practice.

Omlouvám se, že jsem to napsal trochu víc zostra, ta debata už mě trochu unavovala. Tenhle přístup je chvályhodný, ale pro mě osobně prohlížeče starší, než dvě verze zpátky přestávají existovat. Díky nekonečné snaze o přizpůsobování stránek a kódu pro prehistorické prohlížeče(které stojí spoustu času a nervů), tady přežíval IE6 neuvěřitelných devět let, aniž by měli jeho uživatelé potřebu obětovat pět minut pro instalaci novější verze. Tím vznikl začarovaný kruh, který bránil rozvoji moderních technologií. Jsem rád, že se podobná situace neopakuje i s IE7 a není v mojem zájmu to nějak měnit.
Chamurappi
Profil
Reaguji na asdasda:
Díky nekonečné snaze o přizpůsobování stránek a kódu pro prehistorické prohlížeče, tady přežíval IE6 neuvěřitelných devět let
Nesmyslné zdůvodnění. Tvůrci stránek sami sebe pořád nechutně přeceňují. Tolerance k vybavení návštěvníků je nedělitelnou součástí téhle práce a vychází z principů, na kterých World Wide Web stojí — prakticky celá civilizovaná část lidstva vnímá web jako univerzální médium, ke kterému můžou bez problémů přistupovat odkudkoliv, jen hrstka kodérů si myslí, že jejich vlastní názory mají nějaký hlubší význam na tržní podíly. Obměna prohlížečů je přirozený proces, téměř neovlivnitelný. Viděl jsi někdy nějakou statistiku reálné účinnosti nátlaku na upgrade na normálním webu?

Jsem rád, že se podobná situace neopakuje i s IE7 a není v mojem zájmu to nějak měnit.
V mém zájmu zase není jakkoliv ovlivňovat názory návštěvníků na prohlížeč — je to jejich svobodná volba. Mým cílem je, aby byli maximálně spokojení, nehledě na to, jak si vybrali. Sám používám sedmičku právě teď a i při tvorbě nových stránek beru ohledy na Explorer 6.

pro mě osobně prohlížeče starší, než dvě verze zpátky přestávají existovat
Ono snad záleží uživatelům na verzích? Proč by na nich mělo záležet výrobcům stránek? Kde se ta hranice „dvě a víc už nic“ vzala? Proč je právě tam? Lidi s Explorerem 6 a Firefoxem 5 jsou snad retardovaní?

Debata o starších prohlížečích je tu mimo téma mnohem víc než debata o spojování řetězců. (Krom toho se dost opakuji, takže doporučuji najít si starší vlákna a v tichosti se smířit s tím, že říkám to, co říkám :-))
asdasd
Profil *
Už jsme opravdu trochu offtopic, takže to nebudu dál rozpitvávat. Svůj názor nikomu nenutím, jen jsem napsal, jak to vidím zase já - taky doporučuji se s tím smířit :-D. Tím bych to za mě ukončil.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0