dagblog.
← Archiv

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