![]() |
![]()
![]()
![]() ![]() ![]() ![]() ![]()
![]()
![]() ![]()
![]() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
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φ:
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:
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 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∞:
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):
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∙):
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...
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.