Autor Zpráva
Jcas
Profil
Mám select, který volá JS událostí onchange.
Když se zvolí hodnota "jiná" (nová, přidat), tak by to mělo uvolnit input-text.

Funkci předávám 3 parametry:
1. 'this' - objekt select
2. hodnota selecktu, která uvolní input
3. id inputu.

function zmenaII(policko, vybrano, id) {
     var hodnota = policko.options[policko.selectedIndex].value;

     var prvek = document.getElementById(id);
     prvek.disabled=hodnota==vybrano?false:true;    
}

Nyní bych ale potřeboval uvolnit 3 inputy = 3 id naráz. Ale chtěl bych, aby FC fungovala i na jeden input (volám ji i v jiných případech). Nějak nevím, jak na to. Poradíte prosím.
Nevím, jestli lze třeba na onchange zavolat FC 3* pokaždé s jiným id.
juriad
Profil
Co něco takového:
http://kod.djpw.cz/awdb
Jcas
Profil
Dík - super.
Když jsem na to kouknul, tak jsem mi prolétlo hlavou - "ty ole, tomu vůbec nerozumím.
Ale když si to člověk projde řádek po řádku a koukne na net, co která metoda dělá, tak to lze pochopit.

Trochu nechápu, proč všem nastavuješ atribut "dependets". JS nemá něco jako isset? Jo a vposledním řádku jsem změnil all[i] na show[i].

Já to tu s dovolením opíšu pro ostatní a také jestli jsem vše správně pochopil. (také jsem viděl, že ty kódy ve zkoušečkách časem mizí a tak jsem už mockrát narazil na to, že na starém tématu už jsem kód neviděl.)

HTML
- Optionu, který má ovlivnit nějaký input předáme id inputu(ů) nastavením atributu "dependets" a dáme mu id inputu(ů)
- Voláme FC, když není vybrána žádná položka selectu, abychom zajistili disabled všem inputům, které může nějaké option ovlivnit.
(při více selectů na stránce bude potřeba identifikovat select. Asi místo select použít "name" selectu)
<form name="formular">
    <select onchange="updateDependencies(this)" name="selekt">
        <option value="a">A</option>
        <option value="b">B</option>
        <option value="c">C</option>
        <option value="d">D</option>
        <option value="_j" dependents="x,z">prvni-posledni</option>
        <option value="_d" dependents="y">prostredni</option>
        <option value="_o" dependents="x,y">prvni-druhy</option>
    </select>
    <br>
    <input id="x">
    <br>
    <input id="y">
    <br>
    <input id="z">
    <script>
        updateDependencies(document.formular.selekt);
    </script>
</form>

JS
function updateDependencies(selekt) {
    var all = [],
        show = [],
        i;
    
    for (i = 0; i < selekt.length; i++) {
        var dependents = selekt.item(i).getAttribute('dependents');
        if (dependents === null) {
            continue;
        }
        if (selekt.selectedIndex == i) {
            show = show.concat(dependents.split(/,/));
        }
        all = all.concat(dependents.split(/,/));
    }
    // disable all
    for (i = 0; i < all.length; i++) {
        document.getElementById(all[i]).disabled = true;
    }
    // (re)enable those for the selected item
    for (i = 0; i < show.length; i++) {
        document.getElementById(show[i]).disabled = false;
    }
}

Projdem všechny prvky (optiony) selectu
for (i = 0; i < selekt.length; i++)

Všem nastavíme atribut "dependets" a pokud je roven "null" (tedy nemá nastaveny id inputu(ů)), tak skočíme pomocí continue; na další průběh cyklu.
        var dependents = selekt.item(i).getAttribute('dependents');
        if (dependents === null) {
            continue;
        }

Do pole show nastrkáme prvky-id inputu(ů) vybrané položky selectu
        if (selekt.selectedIndex == i) { //položka selctu je vybrána
            show = show.concat(dependents.split(/,/));
        }
        all
dependents.split(/,/) funguje jako explode v php. rozdělí řetězec a udělá z toho pole.
V případě optionu _j: [0]=>'x' a [1]=>'z'
show.concat() zajistí přidání prvků pole do pole show. Budeme mít tedy show[0]=>'x' a show[1]=>'z'.
V případě vybrané položky _d bude mít show jeden prvek. show[0]=>'y'.

Totéž provedeme s polem all, ale tentokrát tam dáme všechny hodnoty "dependets" od všech optionů, které ho mají nastaveno.
(tady asi dochází k duplicitě, ale to asi ničemu nevadí)
all = all.concat(dependents.split(/,/));

Projdeme všechny prvky pole all a pro každý input, jehož id je uloženo v poli nastavíme disabled.
    for (i = 0; i < all.length; i++) {
        document.getElementById(all[i]).disabled = true;
    }

A na závěr projdeme pole naplněné vybranou položkou selectu a pro každý input, jehož id je uloženo v poli nastavíme disabled=false.
    for (i = 0; i < show.length; i++) {
        document.getElementById(show[i]).disabled = false;
    }
juriad
Profil
Jcas:
Žádný atribut javascriptem nenastavuji, používám getAttribute, nikoli setAttribute. Pouze se ptám na jeho hodnotu a ta bude buď string nebo null, pokud atribut neexistuje.
Jo tu chybu s show v posledním cyklu jsem si uvědomil až po odeslání.

Tady krásně vidíš ukázku kódu, který je dostatečně obecný, stará se o jedinou věc a je krátký, přehledný. Vidíš, že kód v HTML byl rozšířen jen decentně.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: