ugrás a tartalomhoz

RemoveChild() bug

Marcell · 2007. Ápr. 29. (V), 10.58
Sziasztok!

Egy FORM-hoz szeretnék dinamikusan elemeket hozzáadni/elvenni, ehhez írtam is egy JS kódot, ami egy változó szerint ad hozzá vagy vesz el inputokat.

A hozzáadás gond nélkül működik, de az elvétel számomra érthetetlenül működik (a kódban elkülönítve vannak egy if-else ággal). A kódnak csak egy kis része érdekes:
var kulonbseg = most - dbkell;

alert(kulonbseg);

var element = document.getElementById('kepek');

for (i = 0; i < kulonbseg; i++) {

	element.removeChild(element.lastChild);
		
}
Tehát van két változóm, egyikben az inputok mostani darabszáma, a másikban a kívánt darabszám. Az alert() egyértelműen kiírja, hogy mennyit kell elvenni, tehát a változók jó, de utánna a for ciklus nem fut le csak mondjuk félig (életből vett példa: most = 10, dbkell = 5, akkor a kulonbseg = 5 lesz helyesen, mégis csak 2-t vesz el).

Az eredmények mind FireFoxban, mind Operában rosszak, IE alatt viszont jó.

Mit rontok el?
 
1

*1

s_volenszki · 2007. Ápr. 29. (V), 13.26
Pontosan miben tárolod az értékeket? Nekem volt egyszer ilyen (az egy input text típusú változóval fordult elő) és automatikus típusváltással állt helyre a rend!
Megszoroztam 1-el!

s_volenszki

szerk.:

Más utasítással végigmegy a ciklus? Mondjuk ha a removeChild utasítást kicseréld egy alert(i);-re
2

lastChild != utolsó elem

attlad · 2007. Ápr. 29. (V), 14.55
A gondot az okozza hogy a lastChild nem az utolsó elemet jelenti, hanem az utolsó node-ot, ami lehet pl. TEXT_NODE is. A HTML elemek közé rakott whitespace karakterek böngészőkben ilyen szöveges node-ok, Exporerben meg nem.

Ha nem formáznád azt a HTML kódrészt, mindent egy sorba írnál, akkor máris jó lenne, de ennél nyilván vannak sokkal jobb megoldások is. A nodeType-pal tudod lekérdezni a típust.

Whitespace in the DOM
3

re

toxin · 2007. Ápr. 29. (V), 15.38
összehasonlításnál figyeljünk arra, hogy az IE6 böngésző DOM LEVEL 1, Node interfész implementációjából kimaradtak a node-típus konstansok (node-type constants), az-az érdemes a betenni a következő kódot

	if (!window.Node) 
	{
	    var Node = {            
	        ELEMENT_NODE: 1,    
	        ATTRIBUTE_NODE: 2, .
	        TEXT_NODE: 3,       
	        COMMENT_NODE: 8,   
	        DOCUMENT_NODE: 9,
	        DOCUMENT_FRAGMENT_NODE: 11
	    };
	}
vmint fentit bővíteni az XML specifikus node típusokkal, ha szükség lenne rá

üdv t

ui : IE + removeChild-nál pedig a ciklikus referenciáknál fellépő memória szivárgásra : http://javascript.crockford.com/memory/leak.html ügyeljünk
4

köszi

Marcell · 2007. Május. 3. (Cs), 14.53
Igen, köszönöm, így már sokkal érthetőbb a működés. Mivel úgyis volt az elemeknek ID-je, ezért inkább úgy oldottam meg a problémát, hogy getElementById() alapján veszem ki az elemeket a DOM fából.