Oppure

Loading
18/12/11 15:52
Maury91
//sono scritto in javascript ! non in delphi .-.
function aj_check(check,father,sons) {
	if ((father != '')&&(!check.checked)) document.getElementById(father).checked = false;
	if ((sons != '')&&(check.checked)) {
		x = document.getElementById(sons);
		for (i=0;i<x.childElementCount;i++) {
			if (x.children[i].nodeName == 'INPUT') {
				x.children[i].checked=true;
				ckid = x.children[i].id;
				if (ckid!='')  aj_check(x.children[i],'',ckid.substr(0,ckid.length-1));
			}
		}
	}
}


ho fatto questo script che ha lo scopo di gestire i checkbox in una "directory di checkbox"
in pratica facciamo che ho questo albero di checks
o
o
o
o
o
o
o
la funzione si comporta in modo anomalo e premendo il primo li attiva cosi
x
x
x
x
o
o
o

se premo quello sopra tutti tutti quelli sotto devono essere attivi, e se premo uno di quelli sotto disattivandolo mi disattiva quello sopra
il problema è questo, il browser chrome (su FF non ho provato) per qualche oscuro motivo quando richiamo la funzione facendo la ricorsione, la funzione richiamata può modificare le variabili locali della funzione che la chiama... e in questo modo lo script arriva al nodo più infondo fa il for li li attiva tutti e poi finisce senza poter attivare gli altri nodi

allego un htm di prova

EDIT :
usando un setTimeout per richiamare funziona
lo allego, è il file 2
Ultima modifica effettuata da Maury91 18/12/11 16:49
aaa
18/12/11 18:39
lavoro92
Il problema del tuo codice è che ogni volta si appoggia sugli stessi nomi di variabile quindi x e i .
Se tu metti un var davanti a i e a x, ogni volta che richiama la funzione ed effettua il " var " utilizzerà un altra porzione di memoria e non la stessa la quale verrà eliminata quando la funzione avrà finito il suo compito .
Indi per cui il codice corretto è :
function aj_check(check,father,sons) {
	if ((father != '')&&(!check.checked)) document.getElementById(father).checked = false;
	if ((sons != '')&&(check.checked)) {
		var x = document.getElementById(sons);		
		for (var i = 0;i<x.childElementCount;i++){
			if (x.children[i].nodeName == 'INPUT') {
				x.children[i].checked=true;
				ckid = x.children[i].id;
				if (ckid!='') {
				aj_check(x.children[i],'',ckid.substr(0,ckid.length-1));
				}
			}
		}
	}
}
Ultima modifica effettuata da lavoro92 18/12/11 18:41
aaa