Anketa na webu je ze své podstaty typický formulář. Přesto mnoho lidí používá k její tvorbě odkazy. To s sebou však nese riziko, že vyhledávácí roboti budou následovat hlasovací odkazy a tím znehodnocovat výsledky hlasování.
Důvod, proč lidé nepoužívají raději formuláře může být ten, že anketa tvořená odkazy vypadá lépe a hlasovat v ní je snadnější - přesně o jeden klik. Na této stránce se pokusím nastínit, jak:
Všechny ankety jsou tvořeny formulářem odesílaným metodou POST, takže ani ten nejdrzejší robot by si neměl dovolit v anketě hlasovat. Každý formulář bude:
Zde myslím není co vysvětlovat. Text možností je obalen elementem label.
Labelům je nastaven atribut for, který vždy odpovídá atributu id elementu input,
pro který je určen.
1:<form action="anketa-formularem.php" method="post"> 2: <fieldset> 3: <legend>Máte se dobře?</legend> 4: <p> 5: <label for="option1.1">Ano</label> 6: <input type="radio" name="poll1" id="option1.1" value="1" /> 7: </p> 8: <p> 9: <label for="option1.2">Ne</label> 10: <input type="radio" name="poll1" id="option1.2" value="2" /> 11: </p> 12: <p> 13: <label for="option1.3">Nevím</label> 14: <input type="radio" name="poll1" id="option1.3" value="3" /> 15: </p> 16: <p> 17: <input type="submit" value="Hlasovat" /> 18: </p> 19: </fieldset> 20:</form>
Tato anketa je tvořena téměř stejným kódem. Jediné, co přibylo, je element noscript,
který obaluje odesílací tlačítko. Díky tomu bude odesílací tlačítko skryto před uživately, kteří mají
k dispozici JavaScript.
1:<form action="anketa-formularem.php" method="post" id="poll2"> 2: <fieldset> 3: <legend>Máte se dobře?</legend> 4: <p> 5: <label for="option2.1">Ano</label> 6: <input type="radio" name="poll2" id="option2.1" value="1" /> 7: </p> 8: <p> 9: <label for="option2.2">Ne</label> 10: <input type="radio" name="poll2" id="option2.2" value="2" /> 11: </p> 12: <p> 13: <label for="option2.3">Nevím</label> 14: <input type="radio" name="poll2" id="option2.3" value="3" /> 15: </p> 16: <noscript> 17: <p> 18: <input type="submit" value="Hlasovat" /> 19: </p> 20: </noscript> 21: </fieldset> 22:</form>
1:function voteByClick(id) { 2: var i, form, options; 3: // najdeme formular 4: form = document.getElementById(id); 5: // najdeme radia pro odpovedi 6: options = document.getElementsByName(id); 7: // budeme pokracovat jedine, pokud jsme 8: // nasli formular 9: if (form) { 10: // projdeme vsechny moznosti 11: for (i = 0; i < options.length; i++) { 12: // kazde navesime na onclick funkci, 13: options[i].onclick = function () { 14: // ktera nejprve zkontroluje, jestli ma 15: // form prirazenou nejakou funkci na onsubmit, 16: // pokud ano, tak ji nejprve zavolame 17: // a pokud vrati false, tak neudelame nic 18: if (form.onsubmit instanceof Function && false === form.onsubmit()) { 19: return; 20: } 21: // jinak odesleme formular 22: form.submit(); 23: } 24: } 25: } 26:}
HTML kód vypadá naprosto stejně, jako u předchozí ankety (kromě id a name).
JavaScript je také podobný, rozdíl je pouze ten, že funkce
přiřadí formuláři třídu voteByLabelClick, přes kterou jsou v CSS nastavené vlastnosti, které upraví vzhled formuláře.
1:function voteByLabelClick(id) { 2: var labels, form; 3: // najdeme formular 4: form = document.getElementById(id); 5: // budeme pokracovat jedine, pokud jsme 6: // nasli formular 7: if (form) { 8: // formulari priradime tridu "voteByLabel", 9: // pres kterou je v CSS definovano skryti 10: // radiobuttonu a obarveni labelu tak, aby 11: // vypadaly jako odkazy 12: form.className += ' voteByLabelClick'; 13: // najdeme labely 14: labels = form.getElementsByTagName('label'); 15: for (i = 0; i < labels.length; i++) { 16: // kazdemu opet priradime na onclick 17: // funkci, ktera odesle formular 18: labels[i].onclick = function () { 19: if (form.onsubmit instanceof Function && false === form.onsubmit()) { 20: return false; 21: } 22: // nastaveni radiu pro tuto volbu checked na true 23: document.getElementById(this.htmlFor).checked = true; 24: form.submit(); 25: } 26: } 27: } 28:}
1:form.voteByLabelClick label { 2: color: blue; 3: text-decoration: underline; 4: cursor: pointer; 5: cursor: hand; 6: float: none 7:} 8:form.voteByLabelClick input { 9: display: none; 10:}
id formuláře,
funkce voteByClick očekává, že radio buttony ve formuláři budou mít stejné name, jako je id formuláře.window.onload.JavaScript pro inicializaci formulářů na této stránce vypadá takto:
1:<script type="text/javascript"> 2: voteByClick('poll2'); 3: voteByLabelClick('poll3'); 4:</script>
a tento kód je umístěn před koncovou značkou pro body.
Plánujete vyrazit na dovolenou? Potom by se Vám mohl hodit anglicko-český slovník nebo překladač vět.
Napsáno 18. 1. 2006 . Veškerý zde uvedený kód můžete volně používat.