[ Príspevkov: 4 ] 

Má to cenu?
 Áno 80% 80% [ 4 ]
 Nie 20% 20% [ 1 ]


Celkom hlasov : 5

AutorSpráva
Offline

Skúsený užívateľ
Skúsený užívateľ
Pohodlný výber zo <select> - vaše nápady, vylepše

Registrovaný: 30.05.06
Prihlásený: 08.10.14
Príspevky: 1756
Témy: 35 | 35
Bydlisko: BA - WESTSIDE

Pri práci na jednej webovej aplikácii mi zadávateľ spomenul rozšírené vyhľadávanie na Profesia.sk - chcel, aby sa pôvodné <input type="checkbox"> výbery nahradili týmto spôsobom, je už na to zvyknutý.

Pozrel som si teda ich kód, ale keďže kradnúť sa nemá a oni ho majú naozaj zložitý, povedal som si, že si napíšem vlastný, s mierne obmedzenou funkcionalitou. Nie všetko som totiž potreboval.

A tak sa (dnes, okolo tretej ráno) zrodil "Pohodlný výber".

Je to založené na tom, že z jedného multiple <select> prostredníctvom tlačidla prenesieme položky do druhého. Pri odoslaní formuláru sa tento druhý spracuje a odošlú sa všetky položky, ktoré obsahuje.

Má to niekoľko fíčŕz, ktoré teraz nejak vysvetlím:
- keďže predchádzajúca verzia formuláru pracovala s <input type="checkbox">, nechcel som meniť formát GET požiadavku na serverový skript (aby som nemusel meniť aj ten). Preto je to spracovanie také aké je a určite sa dá zlepšiť

- doubleclick funguje len vo Firefoxe a len jedným smerom, niekde tam bude malá chybka, malo by to fungovať v oboch smeroch

- možno sa vám zdá, že tie funkcie obsahujú veľa chaotických parametrov: robil som to fakt neskoro a navyše, vzniklo to z dôvodu rozšírenia a použitia viacerých pohodlných výberov v jednom formulári

- možnosti sa neradia podľa toho, ako boli vygenerované, ale podľa toho, aká bola posledná zmena (tj. keď premiestnim vpravo prvú položku, a potom vrátim späť vľavo, zaradí sa na posledné miesto, nie na prvé)

- treba definovať pole inData, ktoré obsahuje údaje o všetkých pohodlných výberoch v jednom formulári vo formáte "id_praveho_selectu,id_divu_so_spracovanymi_polozkami,nazov_vystupneho_pola". Toto pole sa použije pri spracovaní všetkých pohodlných výberov vo formulári.

Celý proces funguje tak, že človek si vyberie príslušné položky (na presun je funkcia move(smer[left/right], id_laveho_selectu, id_praveho_selectu)),
po kliknutí na odosielacie tlačítko sa formulár spracuje (všetky položky z pravého selectu sa zoberú a v dive pracovne nazvanom "inserter" sa vytvoria cez innerHTML skryté formulárové polia s patričnými názvami a hodnotami) a nakoniec sa odošlú len vytvorené skryté polia.

Ak by ste mali záujem niečo poopraviť (v JS nie som bohvieaký expert), alebo rozšíriť, kľudne to robte, budem rád, ak ma o tom budete informovať.
Ak by ste to chceli použiť, nech sa páči, na to som to sem dal. A ak by ste mali akékoľvek postrehy, nech sa páči, táto téma je tu na to.

Ešte pridám nejaký ten kód rovno sem:
Kód:
<html>
  <head>
  <script>
    function move(dir, lft, rgt){
      if(dir == 'right'){
        var from = document.getElementById(lft);
        var to = document.getElementById(rgt);
        var reversed = 'left';
      } else if (dir == 'left') {
        var from = document.getElementById(rgt);
        var to = document.getElementById(lft);
        var reversed = 'right';
      } else {
        return false;
      }
      for (var i = 0; i < from.length; i++){
        var opt_from = from.options[i];
        if (opt_from.selected) {
          var isSet = false;
          for (var j = 0; j < to.length; j++){
            var opt_to = to.options[j];
            if(opt_from.value == opt_to.value){
              isSet = true;
            }
          }
          if (!isSet){
            var y=document.createElement('option');
            y.text= opt_from.text;
            y.value = opt_from.value;
            y.setAttribute("ondblclick", "move('"+reversed+"', '"+lft+"', '"+rgt+"');");
            try
            {
              to.add(y,null); // standards compliant
            }
            catch(ex)
            {
              to.add(y); // IE only
            }
            from.remove(i);
            i = i - 1;
          }                 
        }
      }
    }
    function analyzeForm(input){
      for (var i = 0; i < input.length; i++){
        var newarr = input[i].split(',');
        var rgt = newarr[0];
        var ins = newarr[1];
        var code = newarr[2];
        var sel = document.getElementById(rgt);
        var errStr = "";
        if (sel.length == 0){
          errStr = 'Prosím, vyberte aspoň jednu položku!';
        } else {
          var inputzz = "";
          for (var u = 0; u < sel.length; u++){
            var x = sel.options[u].value;
           
            inputzz = inputzz + "<input type='hidden' name='"+code+"["+x+"]' value='on'> ";
          }
          document.getElementById(ins).innerHTML = inputzz; 
        }
      }
      if(errStr == ""){
        return true; 
      } else {
        alert(errStr);
        return false;
      }       
    }
  </script>
  </head>
  <body>
    <script>
     
      var inData =new Array(2);
      inData[0]='n_right,n_inserter,n';
    </script>
    <form method="get" action="" onSubmit="return analyzeForm(inData);" name="switcher">
      <fieldset>
        <legend>Vyberte si svoje nápoje</legend> 
        <table>
          <thead>
            <tr>
              <th scope="col">Nápoje</th>
              <td></td>
              <th scope="col">Vybrané nápoje</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>
                <select multiple="multiple" size="15" id="n_left">
                  <option value="kava" ondblclick="move('right', 'n_left', 'n_right');">Káva</option>
                  <option value="caj" ondblclick="move('right', 'n_left', 'n_right');">Čaj</option>
                  <option value="cola" ondblclick="move('right', 'n_left', 'n_right');">Cola</option>
                  <option value="pivo" ondblclick="move('right', 'n_left', 'n_right');">Pivo</option>
                  <option value="vino" ondblclick="move('right', 'n_left', 'n_right');">Víno</option>
                  <option value="rum" ondblclick="move('right', 'n_left', 'n_right');">Rum</option>
                </select>
              </td>
              <td>
                <input type="button" value="&nbsp;&gt;&gt;&nbsp;" onclick="move('right', 'n_left', 'n_right');">
                <br>
                <input type="button" value="&nbsp;&lt;&lt;&nbsp;" onclick="move('left', 'n_left', 'n_right');">
              </td>
              <td>
                <select multiple="multiple" size="15" id="n_right">
                </select>
              </td>
            </tr>
            <tr>
              <td colspan="3" style="text-align: center;">
                <noscript>
                  Nemáte zapnutú podporu JavaScriptu.<br>Tento formulár nebude správne fungovať.
                  <br>
                </noscript>
                <div id="n_inserter">
                </div>
              </td>
            </tr>
          </tbody>
        </table>
      </fieldset>
      <input type="submit" value="Odoslať objednávku do baru a do kuchyne">
    </form>
  </body>
</html>


_________________
A. S. Tanenbaum píše:
The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice.
Offline

Užívateľ
Užívateľ
Pohodlný výber zo <select> - vaše nápady, vylepše

Registrovaný: 29.12.05
Prihlásený: 14.08.18
Príspevky: 539
Témy: 62 | 62
Bydlisko: 127.0.0.1 (...

kazdopadne je to prehladnejsie ako jeden multiple <select>


_________________
"Kde končí hiphop, začína IQ."
Offline

Užívateľ
Užívateľ
Pohodlný výber zo <select> - vaše nápady, vylepše

Registrovaný: 16.08.07
Prihlásený: 03.10.12
Príspevky: 139
Témy: 25 | 25
Bydlisko: Bratislava

noo, toto je super, ked to budem niekedy potrebovat, vylepsim to a nahram vylepsenu verziu :D


Offline

Užívateľ
Užívateľ
Pohodlný výber zo <select> - vaše nápady, vylepše

Registrovaný: 28.04.07
Prihlásený: 03.11.09
Príspevky: 133
Témy: 1 | 1

Zaujímavý skript :) Chválim...
Doubleclick mi funguje vo Firefoxe 2.x obojsmerne, Opera 9.23 vo mne vyvoláva dojem, že vôbec neimplementuje double click event na option-y (podrobne som to neskúmal, v specs však povolený je).


 [ Príspevkov: 4 ] 


Pohodlný výber zo <select> - vaše nápady, vylepše



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

formular: presun <option> zo <select> do <select>

v JavaScript, VBScript, Ajax

2

794

28.09.2009 15:27

tomast7

V tomto fóre nie sú ďalšie neprečítané témy.

výber aktualnej položky z <select>

v PHP, ASP

5

585

14.06.2009 22:04

mylan

V tomto fóre nie sú ďalšie neprečítané témy.

Automaticke doplnanie <select> po kliknuti , vyber z MySql

v JavaScript, VBScript, Ajax

1

486

22.05.2015 12:44

stenley

V tomto fóre nie sú ďalšie neprečítané témy.

Interpunkcia v elementoch <textarea> a <select>

v HTML, XHTML, XML, CSS

4

510

30.10.2016 12:01

alvar

V tomto fóre nie sú ďalšie neprečítané témy.

<select>

v HTML, XHTML, XML, CSS

6

711

02.11.2009 17:21

danielop

V tomto fóre nie sú ďalšie neprečítané témy.

textarea a <select>

v JavaScript, VBScript, Ajax

3

662

12.03.2009 9:59

myxall

V tomto fóre nie sú ďalšie neprečítané témy.

<select> v PHP

v PHP, ASP

5

1163

18.04.2007 18:16

Tominator

V tomto fóre nie sú ďalšie neprečítané témy.

Jak na <select>?

v HTML, XHTML, XML, CSS

16

893

13.12.2007 18:14

Ezekiell

V tomto fóre nie sú ďalšie neprečítané témy.

Z mySql do <select>

v PHP, ASP

13

636

02.05.2009 23:32

suchy

V tomto fóre nie sú ďalšie neprečítané témy.

<select> ulozenie do db

v PHP, ASP

2

474

04.12.2009 17:27

wronker

V tomto fóre nie sú ďalšie neprečítané témy.

Hrúbka <frame> a <rules> v <table>

v HTML, XHTML, XML, CSS

7

708

25.01.2009 22:10

Ďuri

V tomto fóre nie sú ďalšie neprečítané témy.

Pridat dalsi <select> pomocou js (alebo jQuery)

v JavaScript, VBScript, Ajax

1

467

01.03.2010 13:26

GoodWill

V tomto fóre nie sú ďalšie neprečítané témy.

PHP a zistenie oznaceneho policka v <select>

v PHP, ASP

14

491

07.10.2013 21:18

Unlink

V tomto fóre nie sú ďalšie neprečítané témy.

Ako na zabranenie zmeny moznosti v <select>e

v HTML, XHTML, XML, CSS

3

440

31.03.2010 18:42

stenley

V tomto fóre nie sú ďalšie neprečítané témy.

Ako nastavit velkost pisma vo volbach <select>u

v HTML, XHTML, XML, CSS

2

817

03.03.2011 21:12

johnny04501

V tomto fóre nie sú ďalšie neprečítané témy.

Ako automaticky presúvať políčka elementu <select> podľa obľúbenosti

v HTML, XHTML, XML, CSS

1

495

12.11.2016 9:58

BX



© 2005 - 2024 PCforum, edited by JanoF