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:
  1. var kulonbseg = most - dbkell;  
  2.   
  3. alert(kulonbseg);  
  4.   
  5. var element = document.getElementById('kepek');  
  6.   
  7. for (i = 0; i < kulonbseg; i++) {  
  8.   
  9.     element.removeChild(element.lastChild);  
  10.           
  11. }  
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
  1. if (!window.Node)   
  2. {  
  3.     var Node = {              
  4.         ELEMENT_NODE: 1,      
  5.         ATTRIBUTE_NODE: 2, .  
  6.         TEXT_NODE: 3,         
  7.         COMMENT_NODE: 8,     
  8.         DOCUMENT_NODE: 9,  
  9.         DOCUMENT_FRAGMENT_NODE: 11  
  10.     };  
  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.