digitální Citron

Jednoduché potvrzování akce v jQuery a HTML5

Občas je potřeba na nějaký odkaz ve vaší webaplikaci nalepit potvrzovací dialog. Jde například o odkaz, který něco smaže nebo udělá jinou nenávratnou operaci.

Nejjednodušší bylo vždy použít javasccriptové okénko confirm(), ale pořád to nebylo dost jednoduché na to, abych nebyl líný to psát všude, kde by to mělo být. Navíc jste museli část javascriptového kódu psát přímo do HTML, takže to nebylo tzv. unobtrusive. No naprd.

Naštěstí přišlo HTML5 a jQuery, díky nimž si lze napsat jednoduchou událost, tu si hodit do každého vašeho projektu a vesele a jednoduše ji používat na jakémkoli odkazu díky parametru data-.

Já jsem se právě přistihl, že už ji používám docela často a všude, a proto jsem se rozhodl o ní blognout. Někdo to už možná máte a lépe, někomu to přijde vhod. Dost řečí, tady to je:

Tento kód si dáte do externího .js souboru, který všude používáte (více o použítí jQuery pro začátečníky jsem psal dříve)

$(document).ready( function() {

        // confirmator

        $('a[data-confirm], button[data-confirm], input[data-confirm]').live('click', function (e) {
                 if (!confirm($(this).attr('data-confirm'))) {
                         e.preventDefault();
                         e.stopImmediatePropagation();
                         return false;
                 }
         });
});

A takhle se to potom použije přímo na vašem odkazu, který chcete od uživatele potvrdit:

<a href="/?smazat=1" data-confirm="Opravdu smazat položku?">Smazat</a>

Po kliknutí na odkaz nejdříve vyskočí okénko s dotazem. Kliknutím na OK se odkaz proklikne, kliknutím na Zrušit se nestane nic. Bystřejší vidí, že se to umí nalepit nejen na odkazy, ale také na tlačítka.

PS: je dost možné, že nejsem vůbec autorem tohoto kousku kódu.

Publikováno 4. 10. 2011 | #

Relevantní články

  • 7 samozřejmostí dnešního webhostingu | Jako majitel hostingu sleduji trh a nestačím se divit, co vše jsou zákazníci schopni zkousnout a za co jsou ochotni zaplatit.…
  • jQuery pro začátečníky: AJAX | Pozdě, ale přece. Poslední díl seriálu o jQuery je zde. Tématem se vracím k článku, který jsem napsal téměř přesně před třemi lety. S jQuery…
  • Uvidíme se na WebExpo? | Jsme s Tomášem Randou přihlášeni na WebExpo a hodláme se tam ukázat, jak v sobotu, tak v neděli. Těším se na některé přednášky a…
  • jQuery pro začátečníky: Události | Událost je nějaká akce, která se na HTML stránce stane. Může to být třeba vaše kliknutí na cokoli, pohyb myší na…
  • jQuery pro začátečníky: metody a efekty | V minulém díle jsme se naučili vybrat si prvek v HTML stránce, jaký se nám zamane. Ukázali jsme si už i jednu…

Komentáře

1. Patrik Votoček patrik.votocek.cz | 4. 10. 2011 | 17:50 | #

Hezké, používám něco podobného. Jen mě poslední dobou trochu hlodá http://www.slideshare.net/?ps-tricks/20 jde o rychlost selektoru.

2. Jiří Zralý | 4. 10. 2011 | 17:56 | #

Patrik Votoček [1]: Pomalost by se mohla asi projevit, pokud by se na stránce objevily desítky a stovky takových odkazů. Zkoušel jsi to?

Případně existuje nějaké stejně elegantní řešení, které je rychlé?

3. Jakub Jarabica www.jam3son.sk | 4. 10. 2011 | 18:53 | #

Jiří Zralý [2]: AFAIK to musí prejsť všetky anchory(nielen ?takové?, ak Vás dobre chápem) a na každom z nich hľadať daný atribút ab vedelo, či patrí do kolekcie matched elements, čo nie je natívne a anchorov býva na webe všeobecne dosť. Sám to však analogicky používam pri data-history(či daný anchor pushState-ne alebo nie danú URL), lebo mi to príde ako najčistejšie riešenie a najelegantjenšie riešenie, hoc s performance penalty.

4. Petr Václavek fotobanky.cz | 4. 10. 2011 | 21:41 | #

Hmm, bacha ale na veřejně přístupné stránky ? zejména pokud jde o mazání. Co by s takovým odkazem provedl například Google bot? Ten asi neřeší Javascript a prostě přejde na tu adresu a tedy provede smazání.

5. paranoiq | 5. 10. 2011 | 10:10 | #

Petr Václavek [4]: google bot k tomu nemá práva. a na jaké veřejně přístupné stránce se vlastně může vyskytnout odkaz smazat?

6. Martin Michálek www.vzhurudolu.cz | 5. 10. 2011 | 10:30 | #

Petr Václavek [4]: Googlebota bych se tady nebál ? mazání si neumím představit na veřejných stránkách. Tohle je věc uzavřených aplikací.

I tak mě ale tohle řešení připadá vachrlaté ve své závislosti na centrálním JS. Co když budeš mít v centrálním JS souboru chybu? Prohlížeč pak tenhle kus JS nezpracuje a uživatel pak maže bez dotazu.

V případě fatálních operací jako je mazání jsem pro jistější ? obtrusive ? javascript.

7. Michal Sänger | 5. 10. 2011 | 10:38 | #

Pokud by nevadilo probublání až na body, bylo by rychlejší použití delegate:

$('body').delegate('a[data-confirm], button[data-confirm], input[data-confirm]', 'click', function (e) {
        // confirm action
});
8. Ondřej Mirtes twitter.com/OndrejMirtes | 5. 10. 2011 | 11:39 | #

Pokud jde o zabezpečenou administraci, tak se Google bota sice není třeba bát, ale je to ukázkový případ CSRF :) Takže potvrzení je potřeba spojit ještě s nějakým ověřovacím tokenem. Dělá to např. Nette komponenta ConfirmationDialog nebo Gridito.

9. Jan Panschab | 6. 10. 2011 | 12:31 | #

Jakub Jarabica [3]: Ale .live se binduje na document, ne? Rychlost selectoru tady nehraje roli? nebo se pletu?

10. Jan Panschab | 6. 10. 2011 | 12:35 | #

Resp. by zafungovalo delegate na body či $(document) jak psal Michal Sänger [7]:

11. Václav | 24. 11. 2011 | 22:55 | #

Díky, za zajímavý tip. V IE v pořádku běží, ale je možné, že toto potvrzovací okno nefunguje v Google Chrome?

12. Václav | 24. 11. 2011 | 22:57 | #

Moje chyba, už funguje:)

Přidat komentář

Jak psát

  • Pište s diakritikou
  • Flame [?] bude smazán
  • URLnení povinné
  • na jiné komentáře odkazujte číslem v hranatých závorkách [1]
  • odstavce se dělí dvojím odřádkováním
  • odkaz začínající na http:// se sám převede na odkaz
  • Prostě tu funguje Texy!
Komentář
Zapamatovat si údaje pro příště
© 2005 - 2010 Jiří Zralý | Design a CMS: Jiří Zralý | Běží na Hosting Blueboard.cz |