Childnodes van childnodes

Pagina: 1
Acties:

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 16:04
Ik heb een onbekend aantal elementen (met childnodes), deze worden gekloond en dan worden de namen aangepast.

Ik selecteer het 'gekloonde' element. En ga in een loopje de childnodes af en als ze een naam hebben verander ik die:

code:
1
2
3
4
5
6
    var newField = newFields.childNodes;
    for (var i=0;i<newField.length;i++) {
        var theName = newField[i].name
        if (theName)
            newField[i].name = theName + counter;
    }


Maar 'diepere' childnodes krijgen geen naamswijziging, hoe zorg ik er voor dat ook de childnodes van de childnodes de naam wordt veranderd?

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Recursief je functie gaan opzetten en aanroepen?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Dat klopt.
ChildNodes gaan altijd steeds 1 niveau diep.
Je zal dus een recursieve functie moeten schrijven die steeds een niveau dieper "graaft".

Zoiets als:

JavaScript:
1
2
3
4
5
6
7
8
function changeChildNames(obj) {
  if ( !obj.childNodes || !obj.childNodes.length ) return false;
  for ( var i = 0; i < obj.childNodes.length; i++ ) {
    obj.childNodes[i].name = 'nieuwenaam';
    changeChildNames(obj.childNodes[i]);
  }
  return true;
}


Zoiets denk ik. Is uit de losse pols ... dus gaat vast iets mee mis ... maar het idee zal duidelijk zijn.

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 16:04
Bedankt, ik zal kijken of ik hier iets mee kan. Het ziet er in ieder geval wel logisch uit.

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • ZpAz
  • Registratie: September 2005
  • Laatst online: 16:04
Bedankt, ik ben hierdoor een stuk verder gekomen. Maar zit nog met één klein probleempje.
Want mijn script komt zo in een oneindige loop terecht, en mijn browser reageert dan niet meer.

Met deze functie kloon ik een bestaand object:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    function CloneObject() {
        counter++;
        var Clone = document.getElementById('main').cloneNode(true);
        Clone.id = '';
        Clone.style.display = 'block';
        Clone.border = '1';

        //namen veranderen
        ChangeName(Clone);
        
        var InsertPoint = document.getElementById('InsertHere');
        InsertPoint.appendChild(Clone);     

}


En dit is de functie ChangeName

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function ChangeName(obj) {
    if(!obj.childNodes || !obj.childNodes.length) { //not
        return false; }
    else {
        for(i=1;i < obj.childNodes.length;i++) { //in een loop door de elementen
            var GetName = obj.childNodes[i].name;
            if(GetName)
                obj.childNodes[i].name = GetName + counter;
            var GetID = obj.childNodes[i].id;
            if(GetID)
                obj.childNodes[i].id = GetID + counter;
            /* ChangeName(obj.childNodes[i]); */

        }
        return true;
    }
}


In de bovenstaande gedeelte is een stukje (dat hij zichzelf weer aanroept) nu uitgecomment. Dan kom ik niet in een oneindige loop. Maar dan gaat hij ook maar één childNodes laag diep.

Wat is er fout?

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 28-11 08:35

curry684

left part of the evil twins

Gaat het in alle browsers fout?

Je kunt in ieder geval eens extreem basic gaan debuggen door aan het begin van de changename functie een alert te doen van de id en name van het te wijzigen element. Hoe dan ook ziet je functie er niet uit alsof ie eindeloos recursief kan, dus ik ben met name wel benieuwd naar cross-browser reproducability.

Professionele website nodig?


  • ZpAz
  • Registratie: September 2005
  • Laatst online: 16:04
Het was zo in IE en FF, ik zal eens kijken om de names en ids te alerten

[ Voor 53% gewijzigd door ZpAz op 04-01-2007 20:31 ]

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


Verwijderd

Standaardfout bij recursie in JavaScript: je hebt geen 'var' voor de i in je loop

JavaScript:
1
for(var i=1;i < obj.childNodes.length;i++) 


overigens heb je hier helemaal geen recursie nodig, je kunt ook gewoon alle descendants pakken en daar in één keer overheen itereren:
JavaScript:
1
2
3
4
5
6
var newField = newFields.getElementsByTagName('*');
for (var i=0;i<newField.length;i++) {
  var theName = newField[i].name
  if (theName)
    newField[i].name = theName + counter;
}

[ Voor 71% gewijzigd door Verwijderd op 04-01-2007 21:45 ]


Verwijderd

Je moet in iig in de for loop var zetten voor de i dus
JavaScript:
1
for(var i=1;i < obj.childNodes.length;i++)


Ik weet niet of dat je probleem oplost. Ik kan me herinneren dat dit hielp bij mijn recursive menu script ding ;)

Waarom begin je overigens niet bij 0??

//bah heb ik een keer de oplossing ben ik te laat :)

[ Voor 8% gewijzigd door Verwijderd op 04-01-2007 21:44 ]


  • ZpAz
  • Registratie: September 2005
  • Laatst online: 16:04
Verwijderd schreef op donderdag 04 januari 2007 @ 21:44:
Je moet in iig in de for loop var zetten voor de i dus
JavaScript:
1
for(var i=1;i < obj.childNodes.length;i++)


Ik weet niet of dat je probleem oplost. Ik kan me herinneren dat dit hielp bij mijn recursive menu script ding ;)

Waarom begin je overigens niet bij 0??

//bah heb ik een keer de oplossing ben ik te laat :)
var ervoor heeft mijn probleem opgelost :) Bedankt!

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:11

crisp

Devver

Pixelated

Recursie is traag en memory-expensive in scriptingtalen. Als het even kan probeer dan een iteratieve benadering met een stack.
In dit geval zou ik echter nog eens goed naar de tip van Blues kijken ;)

Intentionally left blank

Pagina: 1