Autor Zpráva
Silencer
Profil
Mám menší problém s odchytením udalosti nad checkboxom.
Použil som onclick a vsetko fungovalo v pohode.
Nakoľko je však tých checkboxov viac, chcel by som užívateľom umožniť zaškrtnúť všetky políčka naraz.

Problém je však v tom, že síce sa políčka zaškrtnú, ale nevyvolá to požadovanú udalosť.

Možno sa bude dať aj zmeniť priamo funkcia, ktorá sa zavolá po kliknutí na políčko, takže prikladám aj kódy:
function ukazsa(form,meno,ktoreid)
{
if (form[meno].value=="ano") {
document.getElementById(ktoreid).style.display="inline";
form[meno].disabled="true";
form[meno].style.display="none"
  }
}

Táto funkcia spôsobí to, že po kliknutí na zaškrtávacie políčko sa ukáže dovtedy skrytá vec:
...
style="display:inline" onclick="ukazsa(this.form,this.name,'idnaceste'
...
Zároveň sa však políčko aj vypne (aby sa neodosielalo formulárom a zmizne.

No a tu je funkcia, ktorá zaškrtáva všetky políčka:
function OznacVsetko(){
temp = document.formular.elements.length ;
    for (i=0; i < temp; i++) {
    if(document.formular.elements[i].checked == 1)
    	{document.formular.elements[i].checked = 0;
    	 document.formular.btn.value = "Select All"; }
    else {document.formular.elements[i].checked = 1; 
   	 document.formular.btn.value = "Deselect All"; }
	}
}


Vie niekto, či sa s tým dá niečo robiť?
Joker
Profil
Silencer
onclick to logicky nevezme, protože to je událost kliknutí na políčko a při změně políčka skriptem na něj nikdo nekliká.
Zkusil bych událost onchange.
Silencer
Profil
Joker
Zkusil bych událost onchange.

To som skúšal samozrejme, aj onselect a mnohé dalšie.

Väčšina z nich neurobí nič aj pri manuálnom kliknutí.
Konkrétne onchange reaguje až vtedy, keď manuálne zaškrtnem políčko a následne kliknem na niečo iné.
Takže onchange nerieši problém.
los
Profil *
Pri zmene hodnoty JavaScriptom sa udalosti onclick, onchange a pod. nevolajú - keď to v skripte meníš, tak môžeš rovno zavolať tú funkciu, ktorú voláš v onclick.
jelc
Profil *
No nestaci kdyz se v tom cyklu, ktery je zaskrtava vsechny zavola ukazsa(...) tak aby se chovala stejne jako pri kliknuti na checkbox?
Silencer
Profil
jelc

Super nápad, myslím, že by to tak mohlo fungovať.
Bude však problém zavolať vstupné premenné.
function ukazsa(form,meno,ktoreid)
{
document.getElementById(ktoreid).style.display="inline";
form[meno].disabled="true";
form[meno].style.display="none"
}
Do premennej form viem vložiť meno formulára, lebo to je rovnaké. Ako však na premenné meno a ktoreid?
Silencer
Profil
Vie mi niekto pomôcť, ako zavolať tú funkciu OznacVsetko?
function OznacVsetko(){
temp = document.formular.elements.length ;
    for (i=0; i < temp; i++) {
    if(document.formular.elements[i].checked == 1)
    	{document.formular.elements[i].checked = 0;
    	 document.formular.btn.value = "Select All"; }
    else {document.formular.elements[i].checked = 1; 
   	 document.formular.btn.value = "Deselect All"; }
	}
}
Táto funkcia totiž označí všetky chcekboxy, ale neviem ako zavolať funkciu ukazsa, ktorá ukáže skryté polia:
function ukazsa(form,meno,ktoreid)
{
document.getElementById(ktoreid).style.display="inline";
form[meno].disabled="true";
form[meno].style.display="none"
}
Nedokážem totiž správne analyzovať to elements[i].
jelc
Profil *
tech zpusobu muze byt spousta, zalezi take na to jak je to ve strance umistene, pokud tomu rozumim prochazite vsechny checkboxy ve urcitem formulari
<pre>
var formular = document.getElementsById('id_meho_formulare');
var boxes = formular.getElementsByTagName('checkbox');
var ids = ['ktoreid_1','ktoreid_2',.....'ktoreid_n']

// zaskrtne vsechny chekboxy a v pripade tech co nebyly zaskrtnute zavola funkci ukazsa
function OznacVse(){
for(var i = 0; i < boxes.length;i++){
if(boxes[i].checked){
continue;
} else {
boxes[i].checked = true;
ukazsa(formular,boxes[i],i)

}

}
}
// odkryje skryty prvek disabluje a skryje checkbox
function ukazsa(my_form,my_box,id_or_number){
var ktoreid = isNaN(id_or_number) ? id_or_number : ids[id_or_number];
document.getElementById(ktoreid).style.display = 'inline';
box.disabled = true;
box.style.display = 'none'
}

</pre>


Samozrejmne ze id odkryvanych prvku se muze zjistovat jinak, napriklad muze byt ulozene v id checkboxu
<input type="checbox" name="neco" id="chb_ktoreid" />
funkci ukazsa se bude predavat pouze formular a element na ktery se kliklo a spravne id se vyparsuje z id checkoxu:
var id = box.id.split('_')[1]
nebo nejak jinak ;)
Silencer
Profil
jelc
Z toho, čo si napísal a čo som skúšal ja som zistil, že nemám problém odkryť všetky elementy formulára.
Problémom je to, že to čo chcem odkrývať je ako <div id="nejakeid"> .... </div>.
Dá sa teda nejako to boxes.length nadefinovať, aby to zistilo všetky IDčka na stránke?
jelc
Profil *
v me ukazce jsou v boxes ulozene vsechny checkboxy v danem formulari (jako pole elementu), v poli ids jsou potom vsechna id odkryvanych prvku ve stejnem poradi v jakem jsou checkboxy, (pokud se generuji nejakym serverovym skriptem, nemel by byt problem vytvorit si odpovidajici pole), pokud to nelze, pouzil bych tu variantu, ze si checkbox ponese v sobe informaci o id prvku, ke kteremu se vztahuje, napriklad jeho id se bude skladat z nejakeho retezce a id pozadovaneho prvku a oddelene budou jednoznacnym identifikatorem, v ukazce dole je podtrzitko, zjistovat vsechna id ve strance je zbytecne komplikovane a myslim ze neni jednoduchy zpusob jak to zjistit.
takze funkce ukazsa by mohla vypadat takto:
<div id="ktoreid"></div>
<input type="checbox" name="neco" id="chb_ktoreid" onclick="ukazsa(this)"/>
function ukazsa(checkbox){
 mojeId = checkbox.id.split('_')[0]; // vrati 'ktoreid'
 document.getElementById(mojeId).style.display = 'inline'; 
 checkbox.disebled = true;
 checkbox.style.display = 'none';
}

ve funkci oznacVse se preda funkci ukazsa odpovidajic checkbox z pole boxes,
jelc
Profil *
Jeste bych dodal ze ve funkci oznacVse bych v podmince testoval spise nez checked vlastnost disabled, (myslim ze nekde byl problem se ctenim vlastnosti skrytych disablovanych formularovych prvku)
jelc
Profil *
Oprava:
mojeId = checkbox.id.split('_')[1]; // vrati 'ktoreid'
Silencer
Profil
jelc
Ďakujem, pomohlo mi to. Keďže som nechcel premenovávať všetky DIVy, na začiatku som nadefinoval DIVy, ktoré sa majú zobraziť do premennej.
Výsledkom je táto funkcia:
function OznacVsetko(){
  temp = document.mhformular.elements.length ;
  var ids = ["idname","idoc","iddept_num2","iddept_num","iddept_name","idcompany", "idvek",
	  "idden","iddatum","idcas","idmiesto","idusek","idvozidlo","idnaceste", "idspolucestujuci",
		"idpocasie","idvozovka","idexterne_faktory","idvnutorne_faktory","id vyhnut_nehode",
		"idvina","idpricina","idzdravie","idskoda","idpc_nehody","idnajazden e","idukoncenie",
		"idpolicia","idpokuta","idrozhodnutie","idvp"] 
  for (i=0; i < 31; i++) 
	  { document.getElementById(ids[i]).style.display="inline";	
		}
  for (i=0; i < temp; i++) 
		  { if (document.mhformular.elements[i].type=="checkbox")
			    { document.mhformular.elements[i].disabled="true";
            document.mhformular.elements[i].style.display="none";
					}
			}
  document.getElementById("idbtn").style.display="none";
}

Funkcia zobrazí všetky skryté DIVy, skryje checkboxy (keďže nechcem, aby ich opäť zaškrtávali) a ešte aj skryje tlačidlo, ktoré volá celú funkciu.
Vrelá vďaka za pomoc!

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: