Odkazy — atribut onclick a přístupnost stránek
Pod tímto trochu neštastným nadpisem se budu snažit ukázat korektní způsob jak správně ošetřit
otevření nového okna za využití klientského skriptování. Pro dokreslení dodám, že se jedná o případy, kde
není možno využít atribut target, který není například v
XHTML povolen.
Mnohdy nastane potřeba otevírat odkaz do nového okna, dúvodů k tomuto kroku je několik a není cílem tohoto
příspěvku obhajovat jednu či druhou stranu brojící pro a proti. Cílem je ukázat postup korektní registrace
a zpracování události onclick odkazu. Většinou se uvádí následující zápis.
<a href="foo.html" title="popis odkazu" onclick="bar(this.href);return false;" hreflang="cz" lang="cz" xml:lang="cz">Výše uvedený zápis je předepisován jako ukázkový pro použití. Ve stručnosti si můžeme schrnout to nejdůležitější.
Události onclick jsme zaregistrovali ovladač ve funkci bar, které jsem v argumentu dali obsah
atributu href a jako návratovou hodnotu jsme vrátili false.
Co skrývá kliknutí na odkaz
Při kliknutí na daný odkaz se nejprve předá řízení registrovanému ovladači události(ten otevírá nové okno)
a po jeho vykonání se vrátí hodnota false. Tím je zaručeno, že se neprovede vlastní odkaz v těle
atributu href. Pokud někdo nemá zapnuté klientské skriptování nebo ho má v určité míře omezené provede se
vlastní href a ovladač registrovaný na onclick se nevykoná.
Problémy na obzoru
Zda se, že je všechno ošetřené. Uživatelé bez nebo s omezeným klientským skriptováním jsou obslouženi
standardně atributem href. Zdání klame, v naší konstrukci jsme úplně pozapomněli na případ kdy není možno
okno otevřít nebo jeho otevření selže. Tato situace může nastat vlivem několika faktorů: blokovač nových oken,
hlidač instancí prohlížeče, nefunkčnost skriptu, prohlížeč vůbec nemusí podporovat nové okna(alternativní zařízení).
Pokud nastane jedna z výše uvedených variant, ovladač události se sice provede nicméně požadované otevření
stránky v novém okně se neuskuteční a uživatel tak nemá stránku na níž vede odkaz dostupnou. Po ovladači se ihned
provede vrácení hodnoty false, které zamezí provedení atributu href ikdyž bychom v takovémto
případě jeho vykonání uvítali.
Možnosti řešení
Ač se to na první pohled nezdá řešení neleží nijak daleko od původního. Při otevření nového okna, je třeba toto
okno otestovat a pokud je okno korektně vytvořeno a reference na něj platná, nemusí se již vykonávat href. V případě
potíží vrátíme hodnotu true, která zaručí provedení atributu href.
Modelový příklad pak vypadá takto
<a href="foo.html" title="popis odkazu" onclick="return !bar(this.href);" hreflang="cz" lang="cz" xml:lang="cz" >
<script type="text/javascript" >
.
.
.
function bar(url){
wasOpen = false;
win = window.open(url);
return (typeof(win)=='object')?true:false;
}
Odkaz na nové okno jsme si uložili do proměnné win, tu posléze
otestujeme a pokud se povedlo otevření, vrátíme jako návratovu hodnotu funkce true.
V ovladači se pak negací vrátí hodnota false, která zamezí provedení atributu href.
Pokud by se okno nepovedlo otevřít je vrácena hodnota false a ve výsledku se provede
atribut href.
Pro lepší otestování, můžeme pro kontrolu například otestovat URL nově otevřeného okna apod. a nemusíme
se jen spoléhat na kontrolu datového typu. Pro pořádek a na obranu prohlížečů jako je Mozilla 1.0 a
Internet Explorer je třeba dodat, že při vnitřní chybě běhu klientského skriptu se provádí href standardně.
Verze na Medium · Archiv původní stránky
Související články
Související epizody CZ Podcastu
- #217 · Ivo Lukačovič
O Windy, JavaScriptu a budování firem.
- #3 · Java 6 SE, Vývoj webových aplikací
Dagi a Filemon o novinkách v Javě 6 a webových frameworcích.