Moderní tvorba webových aplikací

O webu

JS akce po kliknutí na odkaz

Na co si dát pozor při obsluhování odkazu JavaScriptem.

4 minuty

Při vytváření webové aplikace, která funguje i bez podpory JavaScriptu, se často setkáme s tím, že odkaz má normální cíl, ale v případě zapnutého JS bude obsloužen skriptem.

Pro odkaz, který bude umět načítat obsah AJAXem to může vypadat následovně:

<a href="url-stranky" onclick="nacistAjaxem(this.href)">
  Odkaz
</a>

Při použití obrázkové galerie:

<a href="velky-obrazek.jpg" onclick="otevritGalerii(this.href)">
  <img src="maly-obrazek.jpg">
</a>

Funkce v onclick potom provede JS akci a stornuje standardní funkci odkazu, třeba pomocí „return false“.

Způsob otevření odkazu

Celé to ale není tak jednoduché, odkaz jde totiž typicky otevřít více způsoby:

  1. kliknutím levého tlačítka,
  2. otevřením prostředním tlačítkem (kolečkem), což typicky otevírá obsah na pozadí,
  3. otevřením přes kontextové menu vyvolané pravým tlačítkem,
  4. kliknutím levého tlačítka při stisknuté klávese Ctrl (otevře na pozadí) nebo Shift (otevře do nového okna)

Kromě otevření přes kontextové menu vyvolají všechny případy onclick, ač by bylo očekávávané chování pro kolečko nebo použití Shift/Ctrl otevření odkazu v nové záložce (na popředí/pozadí).

Kliknutí na následující odkaz je obslouženo JavaScriptem, i když to není zrovna ideální.

Řešení

Zajistit v určitých případech standardní chování jde pomocí využití objektu event, z kterého jde zjistit číslo stisknutého tlačítka (event.which – levé tlačítko má číslo 1) nebo stisknuté klávesy (event.shiftKey || event.metaKey || event.ctrlKey).

JS akce se vyvolá pouze při levém tlačítku

Samostatná živá ukázka

Akce bez URL

Problém nastane u JS akcí, které nemají URL. Při touze otevřít odkaz na pozadí zkrátka neexistuje URL, kterou by prohlížeč mohl nalistovat.

Pokud akce nemá URL, asi nejmenší zlo se mi zdá použít obyčejný onclick a jako cíl odkazu uvést alespoň nějakou URL, což bude lepší než prázdná stránkaabout:blank“, která se otevře u odkazů typu:

<a href="javascript:akce()">
  Odkaz
</a>

Případně přidat do JS aplikace fiktivní URL není s využitím pushState zase takový problém.

Související články

Má smysl měnit kursor tlačítek?

Tlačítka mají na webu po najetí jiný kursor než odkazy.

4 minuty

Detekce otevření DevTools

Jak zjistit, že se na stránce otevřely vývojářské nástroje.

13 minut

JavaScript null a undefined

Rozdíly mezi null a undefined v JavaScriptu, kdy je používat a jak se vyhnout běžným chybám.

12 minut

Sleep v JavaScriptu

Jak implementovat sleep/delay funkcionalitu v JavaScriptu pomocí Promise a async/await

6 minut

Web jecas.cz píše Bohumil Jahoda, kontakt
Seznam všech článků
2013–2025