Interval.cz
CD menu a vyhledßvßnφ v JavaScriptu

Pou₧itφ JavaScriptu nenφ striktn∞ omezeno pouze na strßnky vystavenΘ na internetu. Jednou z u₧iteΦn²ch aplikacφ m∙₧e b²t jeho pou₧itφ v mφstech, kde nelze poΦφtat se serverov²mi skripty, nap°φklad na demonstraΦnφch CD. Podφvejme se, jak lze JavaScriptem zvlßdnout jednoduchou strukturu HTML menu cΘdΘΦka a p°edevÜφm äfulltextovΘô vyhledßvßnφ v zobrazen²ch textech.

Chceme-li mφt mo₧nost vyhledßvat v textu strßnek, zobrazen²ch na CD jako HTML menu, mßme nejmΘn∞ t°i mo₧nosti:

  • Pou₧φt samostatn² obslu₧n² program.
  • Pou₧φt windows scripting host a metody objektu FileSystemObject.
  • Ulo₧it texty strßnek do n∞jakΘ struktury a tu zobrazovat a prohledßvat pomocφ JavaScriptu.

Ka₧d² z t∞chto zp∙sob∙ mß svΘ v²hody a nev²hody. My si v tomto Φlßnku popφÜeme zp∙sob t°etφ, kter² vy₧aduje pouze prohlφ₧eΦ se zapnut²m JavaScriptem, co₧ je v souΦasnΘ dob∞ u v∞tÜiny u₧ivatel∙ tΘm∞° standardnφ vybavenφ (pro puristy dodßvßm, ₧e u₧ivatele bez JavaScriptu lze vcelku jednoduÜe detekovat a v∞novat jim specißlnφ verzi HTML menu, bez mo₧nosti vyhledßvßnφ).

Podφvejme se na ukßzku fiktivnφho CD fiktivnφ firmy, plnΘ fiktivnφch produkt∙ a fotografiφ (odkazy na spustitelnΘ soubory jsou nefunkΦnφ, fotografie v ukßzce zahrnuty jsou). VyzkouÜejte si prochßzenφ celΘ ·rovn∞ menu, p°φpadn∞ vyhledßvßnφ n∞kter²ch klφΦov²ch slov (nap°φklad äfotoô, äprogramô apod.)

Pou₧it² JavaScript

HTML soubor, uveden² v p°φkladu, se jmenuje sample_cdmenu.htm. VeÜkerΘ odkazy v pou₧it²ch skriptech jsou sm∞°ovßny na tento soubor. P°i p°ejmenovßnφ je tedy pot°eba p°φsluÜnΘ odkazy upravit nebo modifikovat skript, nap°φklad s pou₧itφm location.pathname.

Jßdrem celΘho °eÜenφ je objekt Menu, kter² slou₧φ p°edevÜφm jako ·lo₧iÜt∞ text∙ a odkaz∙. Pokud mßme veÜkerΘ zobrazenΘ texty ulo₧eny na jednom mφst∞, lze je pozd∞ji snadno prohledßvat. Zde si ukß₧eme zßklad k≤du objektu Menu, tedy jeho metody a vlastnosti pou₧itΘ p°i uklßdßnφ dat. K≤d dalÜφch metod objektu Menu, slou₧φcφ k prohledßvßnφ a dalÜφm funkcφm, uvedeme nφ₧e. Pomocnß prom∞nnß lastid je pou₧ita ke generovßnφ unikßtnφho id pro ka₧dΘ vytvo°enΘ menu. Zbytek k≤du je trivißlnφ:

var lastid=0;

function Menu( title, txt ) {
    this.title = title;
    this.txt = txt;
    this.id = lastid++;

    this.submenuscount = 0;
    this.submenus = new Array()

    this.linkscount = 0;
    this.linkurls = new Array()
    this.linktexts = new Array()

    this.AddMenu = function( mnu ) {
        this.submenus[this.submenuscount] = mnu
        this.submenuscount++;
    }

    this.AddLink = function( txt, url ) {
        this.linktexts[this.linkscount] = txt;
        this.linkurls[this.linkscount] = url;
        this.linkscount++;
    }
}

Strukturu konkrΘtnφho menu vytvo°φme opakovan²m vytvß°enφm nov²ch objekt∙ t°φdy Menu a jejich spojovßnφm pomocφ metody AddMenu. K vytvo°enφ äfinßlnφchô odkaz∙ na externφ strßnky, obrßzky Φi produkty slou₧φ metoda AddLink. KonkrΘtnφ k≤d pak m∙₧e vypadat nap°φklad takto:

var Menus = new Menu( "Vφtejte na CD firmy XYZ", "Na tomto CD najdete fotografie naÜich zam∞stanc∙ a n∞jak² software." );
Menus.AddMenu( m1 = new Menu( "Fotografie", "Vyberte si kategorii fotografiφ.") );
    m1.AddMenu( m2 = new Menu( "Vedenφ", "Toto jsou naÜi hlavouni:" ) );
        m2.AddLink( "Pepa, °editel", "pepa.jpg" );
        m2.AddLink( "Franta, nßm∞stek", "franta.jpg" );
    m1.AddMenu( m2 = new Menu( "Kancelß°", "Sekretß°ky a jinΘ:" ) );
        m2.AddLink( "JaniΦka", "jana.jpg" );
        m2.AddLink( "Lucinka", "lucie.jpg" );
        m2.AddLink( "MartiΦka", "marta.jpg" );
    m1.AddMenu( m2 = new Menu( "D∞lnφci", "Tito lidΘ nßs vÜechny ₧ivφ:" ) );
        m2.AddLink( "Zden∞k, v²roba software", "zdenek.jpg" );
        m2.AddLink( "TomßÜ, odhßn∞nφ dot∞rn²ch zßkaznφk∙", "tomas.jpg" );
Menus.AddMenu( m1 = new Menu( "Software", "Vyberte si typ software." ));
    m1.AddMenu( m2 = new Menu( "NaÜe programy", "NaÜe skv∞lΘ produkty:" ) );
        m2.AddLink( "OperaΦnφ systΘm Krach 2001", "krach/krach.exe" );
        m2.AddLink( "Prohlφ₧eΦ obrßzk∙", "imgview/setup32.exe" );
    m1.AddMenu( m2 = new Menu( "Service packy", "Tyto programy napravujφ chyby, kterΘ jsme ud∞lali ve starÜφch verzφch naÜich program∙:") );
        m2.AddLink( "Service pack 1 k operaΦnφmu systΘmu Krach 2001", "sp/sp1setup.exe" );
        m2.AddLink( "Service pack 1a k service packu 1", "sp/sp1asetup.exe" );
        m2.AddLink( "Service pack 1aB k service packu 1a k service packu 1", "sp/sp1aBsetup.exe" );

DalÜφm ·kolem je zjistit, kterΘ konkrΘtnφ menu mßme prßv∞ zobrazit (ID tohoto menu je p°edßvßno v URL adrese). K tomu slou₧φ nßsledujφcφ k≤d, kter² zßrove≥ v p°φpad∞, ₧e bylo ₧ßdßno vyhledßvßnφ, zφskß z URL hledan² °et∞zec. Menu, kterΘ se mß zobrazit, je ulo₧eno do pomocnΘ prom∞nnΘ aMenu. Pokud byl hledßn °et∞zec, je tento ulo₧en do prom∞nnΘ strtofind:

var id = 0;
var strtofind="";
if((index = location.search.indexOf("?"))!=-1) {
    if((i2 = location.search.indexOf("find="))!=-1) {
        var pomstr = location.search.slice(i2+5);
        if((i2 = pomstr.indexOf("&"))!=-1) pomstr = pomstr.slice(0,i2);
        strtofind = unescape(pomstr);
    } else {
        var pomstr = location.search.slice(index+4)
        if( pomstr.length > 0 )  id = Math.ceil(pomstr);
    }
}
var aMenu = Menus.GetMenuByID(id);

V poslednφm °ßdku p°edchozφho k≤du je pou₧ita metoda GetMenuByID objektu Menu. Tato metoda hledß rekurzivn∞ ve struktu°e menu to jedno jedinΘ s odpovφdajφcφm ID a jejφ k≤d vypadß nßsledovn∞:

this.GetMenuByID = function( theId ) {
    var x,i;
    if ( theId==this.id ) return this;
    for( i=0; i<this.submenuscount; i++ ) {
        x = this.submenus[i].GetMenuByID(theId);
        if ( x != null ) return x;
    }
    return null;
}

V mφst∞ strßnky, ve kterΘm si p°ejeme vypsat texty prßv∞ zvolenΘho menu a odkazy na dalÜφ ·rovn∞ menu, pou₧ijeme k≤d, kter² m∙₧e vypadat t°eba takto (konkrΘtnφ formßtovßnφ lze samoz°ejm∞ upravit dle pot°eby):

if(strtofind=="") {
    document.write("<h1>"+aMenu.title+"</h1>");
    document.write(aMenu.txt+"<br><br>");

    var i;
    for(i=0;i<aMenu.submenuscount;i++) {
        document.write('<a href="sample_cdmenu.htm?id='+aMenu.submenus[i].id+'">'+aMenu.submenus[i].title+'</a><br>');
    }

    for(i=0;i<aMenu.linkscount;i++) {
        document.write('<a href="'+aMenu.linkurls[i]+'">'+aMenu.linktexts[i]+'</a><br>');
    }
}

K vyhledßvßnφ pou₧ijeme ve vhodnΘm mφst∞ strßnky formulß° s nßsledujφcφm HTML k≤dem (äpodivnΘô odesφlßnφ v²sledk∙ p°es handler udßlosti onSubmit je zde proto, aby bylo zachovßno sprßvnΘ k≤dovßnφ Φesk²ch znak∙):

<form action="" onSubmit="location.href='sample_cdmenu.htm?find='+escape(this.find.value);return false;">
    Vyhledßvßnφ:<br>
    <input type="text" value="" name="find" size="10"> <input type="submit" name="s" value="Najdi">
</form>

PotΘ, co u₧ivatel odeÜle formulß°, je do prom∞nnΘ strtofind ulo₧en hledan² text (viz k≤d uveden² v²Üe). Zb²vß prohledat ulo₧enß data a v²sledky zobrazit ve form∞ jednoduchΘ tabulky s odkazy na nalezenΘ dokumenty. V²pis v²sledk∙ zajistφ nßsledujφcφ k≤d...

if(strtofind!="") {
    document.write("<h1>V²sledky vyhledßvßnφ</h1>");
    Menus.WriteFindResults(strtofind);
    if(found)
        document.write("<p>Hledan² text byl nalezen "+found+" x</p>");
    else
        document.write("<p>Hledan² text nebyl nalezen.</p>");
}

...v kombinaci s pomocnou prom∞nnou found, uchovßvajφcφ poΦet nalezen²ch v²sledk∙, a novou metodou (op∞t pou₧ijeme rekurzi) WriteFindResults objektu Menu:


// v hlaviΦce strßnky
var found=0;


// v k≤du objektu Menu
this.WriteFindResults = function( strfind ) {
    var i,s1;
    s1=this.title.toLowerCase() + this.txt.toLowerCase();
    if( s1.indexOf(strfind.toLowerCase())!=-1) {
        document.write('<a href="sample_cdmenu.htm?id='+this.id + '">' + this.title + '</a><br>');
        found++;
    }
    for( i=0; i<this.submenuscount; i++ ) {
        this.submenus[i].WriteFindResults(strfind);
    }
}

Uveden² k≤d lze samoz°ejm∞ pou₧φt vÜude tam, kde chceme nßvÜt∞vnφk∙m nabφdnout vyhledßvßnφ a nemßme mo₧nost pou₧φt serverovΘ skripty. Danφ za to je vÜak slo₧it∞jÜφ editace strßnek ne₧ v p°φpad∞ äobyΦejnΘhoô HTML û musφme ävyprogramovatô vφce v∞cφ ne₧ obvykle.



Jarmil HalamφΦek (23.11. 2002)

Redakce Interval.cz |  Inzerce na Interval.cz |  Hledßme novΘ autory ISSN 1212-8651 
 ⌐ Zoner software, s.r.o., vÜechna prßva vyhrazena, tento server dodr₧uje prßvnφ p°edpisy o ochran∞ osobnφch ·daj∙.