Autor Zpráva
HomerJay
Profil
Neviem či, ale mám pocit že sa to robí cez JS.
Potrebujem spraviť niečo takéto
[ ] [ZAMKNUTÁ KOLÓNKA]
to prvé je checkbox, teda ten štvorček ktorý keď stlačím, označí sa. A teda chcem, aby sa po stlačení kolónka "odomkla", teda aby bolo do nej možné písať, no kým nebude checkbox označený, nech to nie je možné...
Snáď chápete, asi blbo vysvetľujem :D
Vďaka.
imploder
Profil
HomerJay:
řešení:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript">
  function nastavZamknuti() {
    if (document.getElementById('odemykac').checked)
      document.getElementById('kolonka').disabled = false;
    else
      document.getElementById('kolonka').disabled = true;
  }
</script>
</head>
<body>
  <input id="odemykac" type="checkbox" onchange="nastavZamknuti()">
  <input id="kolonka" type="text" disabled>
</body>
</html>
HomerJay
Profil
Vďaka, mám otázku - dá sa to nejako obísť? Teda povedzme že toto budem mať na webe, ale je to možné obísť tak, že ak sa nezaškrtne kolónka, aj tak bude nejaký text napísaný?
(napr. použitím linku nieco.com/nieco.php?text=text - hádam vieš ako to myslím :D)
Darker
Profil
Ano dá se to obejít. Prostě na dané stránce spustím skript, který elementu nastaví disabled=false
Veškeré ochrany pomocí JS se dají obejít.
imploder
Profil
HomerJay:
Vďaka, mám otázku - dá sa to nejako obísť? Teda povedzme že toto budem mať na webe, ale je to možné obísť tak, že ak sa nezaškrtne kolónka, aj tak bude nejaký text napísaný?
Odpověděl sis vlastně sám: ano, např. zapsáním do URL se to obejít dá. Dá se to jednoduše obejít i když použiješ metodu POST a tak se parametry nebudou předávat v URL, jenom to nejde udělat z prohlížeče. Taky to, že input označený disabled nejde měnit, záleží jenom na prohlížeči a klidně může někdo shválně používat prohlížeč, který na disabled nebere ohled.

Takže spoléhat na to, že input označený disabled se nebude měnit, se nedá. Pokud musí vstupy splňovat nějaké požadavky (např. že je prázdný, ale obecně cokoliv), je potřeba to kontrolovat na serveru (tj. v PHP skriptu). Všechno, co je udělané v javascriptu se dá obejít, javascript se dá vypnout nebo jakkoliv upravit.
HomerJay
Profil
Darker, imploder:
Vďaka, len som sa pýtal, aj keby to niekto obišiel, nejaký extra problém by to pre mňa neznamenal... len som sa chcel uistiť, vďaka za vysvetlenie :)
HomerJay
Profil
Jo ešte mám otázku - ako urobiť viac takýchto odomykačov bez toho, aby som musel každý definovať v JS samostatne? Keby chcem tých kolóniek napríklad 20...?
EDIT: ešte jednu:
Ak niekto zaznačí, do kolónky napíše hodnotu a potom odznačí, text nezmizne.
Pri odoslaní sa hodnota odošle alebo nie?
imploder
Profil
HomerJay:
Jo ešte mám otázku - ako urobiť viac takýchto odomykačov bez toho, aby som musel každý definovať v JS samostatne? Keby chcem tých kolóniek napríklad 20...?
V javascriptu se dá zapisovat do stránky pomocí document.write(). Takže třeba to zaškrtávátko se dá vypsat takhle:
document.write('<input id="odemykac" type="checkbox" onchange="nastavZamknuti()">');


Každý odemykač a kolonka musí mít vlastní id, takže je potřeba je očíslovat - příklad:
document.write('<input id="odemykac' + cislo + '" type="checkbox" onchange="nastavZamknuti()">');
Darker
Profil
No asi celkově úspornější řešení:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
  <input id="odemykac" type="checkbox" onchange="this.nextElementSibling.disabled=this.checked">
  <input id="kolonka" type="text">
</body>
</html>
imploder
Profil
HomerJay:
Pri odoslaní sa hodnota odošle alebo nie?
Co takhle vyzkoušet?

Darker:
Jo, to je šikovné řešení.
HomerJay
Profil
imploder:
Číslovanie chápem, lenže keď "odemykac" v inpute očíslujem, musím ho znova definovať očíslovaný aj v <head>, nie? Myslel som či sa nedá použiť niečo ako odemykac[0], odemykac[1], atď. s jednou jedinou definíciou v <head>.

Darker:
Sjúpr, čo to robí? Nefunguje mi to totiž :D
imploder
Profil
HomerJay:
Sjúpr, čo to robí? Nefunguje mi to totiž :D
Dělá to to samé, co potřebuješ, akorát opačně (když se checkbox zaškrtne, políčku se nastaví disabled a když se zruší zaškrtnutí, tak se odnastaví - ty to potřebuješ naopak). Nefunguje to kvůli tomu, že tagy nejsou přímo u sebe - jsou mezi nima nějaké bílé znaky (konec řádku, 2 mezery). Kvůli tomu nextElementSibling odkazuje na ty mezery a ne na druhý <input>. Bez mezery to funguje:
<body>
  <input type="checkbox" onchange="this.nextSibling.disabled=this.checked"><input id="kolonka" type="text">
</body>
HomerJay
Profil
imploder:
Aha... tak vďaka, je to pekné, ale ja potrebujem aby sa kolónka zviditeľnila keď je to zaznačené, nie odznačené...
Darker
Profil
A jak to udělat, aby to bralo až nějaký první objekt (div, input atd)?
Ukázka :)

HomerJay:
zaznačené, nie odznačené
this.nextSibling.disabled=!this.checked

Negace
HomerJay
Profil
Darker:
Tá negace mi neurobí nič, teraz je kolónka odomknutá aj pri zaznačenom aj odznačenom :D
imploder
Profil
Darker:
Zkus si to mimo zkoušečku normálně v <body>, mně to aspoň ve Firefoxu s mezerou nefunguje, jenom bez mezery.
imploder
Profil
Tak sem hodím svoji verzi, tohle funguje:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript">
  function nastavZamknuti(odemykac) {
    odemykac.nextSibling.disabled = !odemykac.checked;
  }
</script>
</head>
<body>
  <input type="checkbox" onchange="nastavZamknuti(this)"><input id="kolonka" type="text" disabled>
  <input type="checkbox" onchange="nastavZamknuti(this)"><input id="kolonka" type="text" disabled>
  <input type="checkbox" onchange="nastavZamknuti(this)"><input id="kolonka" type="text" disabled>
</body>
</html>

HTML element může předat sám sebe (tj. this) jako parametr funkci.

EDIT: dal jsem tam 3 inputy (aby bylo vidět, že to funguje i na víc než jeden) a u kolonky disabled, na které jsem zapomněl
HomerJay
Profil
imploder:
Funguje perfektne, vďaka :)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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