SVG oraz removeChild

w dziale Strony WWW w Operze
Zajec napisał(a):

Próbuję zrobić sobie lekko oskryptowany obrazek SVG i natknąłem się na problem z usuwaniem potomków wybranego elementu. Ładnie to przedstawiłem w zminimalizowanym przykładzie: http://files.zajec.net/remove.child.test.svg

Czy ktoś widzi w kodzie jakiś błąd, który popełniłem? Czy to raczej Opera i Firefox coś źle obsługują?

ja_szczur napisał(a):

usuwaj dzieci "od tyłu":

  for(var i=child.length-1; i>=0; i--) {
     child[i].parentNode.removeChild(child[i]);
  }

Zajec napisał(a):

A owszem, można w ten sposób i jeszcze 5 innych smile Tylko czemu to moje nie działa? Zmienna "child" jest przecież generowana raz i jej elementy powinny na stałe być wskaźnikami do elementów "rect". Usuwanie kolejnych "rect" nie powinno chyba przesuwać wskaźników tablicy?

ja_szczur napisał(a):

ale jak usuniesz element z tej tablicy, zmieni się przecież child.length ;-)

Zajec napisał(a):

Originally posted by ja_szczur:

ale jak usuniesz element z tej tablicy, zmieni się przecież child.length ;-)


Czemu? Wg mojego rozumowania linia kodu
var child = document.getElementById("box").getElementsByTagName("rect");
tworzy n-elementową tablicę wskaźników do obiektów "rect". W każdym normalnym języku programowania usunięcie elementu, na który wskazuje jeden ze wskaźników nie powoduje takich zmian, jakie tu zachodzą. Co najwyżej ponowne posłużenie się wskaźnikiem, który nie ma na co wskazywać powinno rzucić błędem, ale tego nie robię. Sama tablica IMO powinna zostać nienaruszona.

ja_szczur napisał(a):

IMO Ty nie tworzysz tablicy wskaźników, tylko tworzysz wskaźnik na tą tablicę

odpal sobie i zobacz:

for(var i=0; i<child.length; i++) {
   alert(" -> child["+ i +"] / child length:"+ child.length);
   child[i].parentNode.removeChild(child[i]);
}


Zajec napisał(a):

Hm, faktycznie, załapałem w czym rzecz. To jest wskaźnik do tablicy (takiej wewnętrznej, Operowej), która w każdej chwili reprezentuje _aktualny_ stan elementów. To do mnie przemówiło i zachowanie też się zgadza. Dzięki za wyjaśnienie smile