Toon posts:

[JScript] recursie probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een project waar ik nu aan werk moet ik een template editor bouwen in DHTML. Ik wil er uiteindelijk voor zorgen dat alleen bepaalde span elementen in de uiteindelijke tekst voor komen. Dus
code:
1
<b>tekst</b><span>tekst</span>

moet worden
code:
1
tekst<span>tekst</span>

Nou had ik het idee om dit met recursie op te lossen. Een element kan namelijk ook sub-elementen hebben, en ik wil alles binnen de span behouden.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    function cleanHTML(content){
      var cleanerHTML = "";
      for (i = 0; i < content.length; i++){
        if (content[i].nodeType == 1){
          if (content[i].nodeName != "SPAN"){
            var subContent = content[i].childNodes;
            cleanerHTML += cleanHTML(subContent);
          }
        }else if( content[i].nodeType == 3){
          cleanerHTML += content[i].data;
        } else {
          alert("Unknown node type: "+content[i].nodeType)
        }
      }
      return cleanerHTML;
    }

Helaas gaat het op regel 7 mis, door deze regel loopt mijn browser vast. (waarschijnlijk komt het script in een oneindige loop terecht.)
Nou is mijn kennis van JScript op zich niet zo heel goed, dus mijn vraag is: wat gaat er nou mis?
Ik hoop dat mijn vraag een beetje duidelijk is...

  • André
  • Registratie: Maart 2002
  • Laatst online: 23-04 12:47

André

Analytics dude

Kun je niet gewoon beter alle tags behalve span er uit strippen?

Verwijderd

Topicstarter
Dat is uiteindelijk wel de bedoeling ja. Maar hoe?

Voor alle duidelijkheid, de complete tekst wordt dus door de gebruiker in een DIV element gezet. Inclusief opmaak, die ik er dus weer uit moet gooien. Die span elementen zijn bedoeld om variabele velden in de template aan te geven.

[ Voor 71% gewijzigd door Verwijderd op 16-11-2005 16:59 ]


Verwijderd

Je vergeet 'var' in je for-loop:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    function cleanHTML(content){
      var cleanerHTML = "";
      for (var i = 0; i < content.length; i++){
        if (content[i].nodeType == 1){
          if (content[i].nodeName != "SPAN"){
            var subContent = content[i].childNodes;
            cleanerHTML += cleanHTML(subContent);
          }
        }else if( content[i].nodeType == 3){
          cleanerHTML += content[i].data;
        } else {
          alert("Unknown node type: "+content[i].nodeType)
        }
      }
      return cleanerHTML;
    }

Daardoor wordt je counter i als global gedeclareert waardoor je recursie met één globale counter werkt, i.p.v. met verschillende locale counters.

[ Voor 16% gewijzigd door Verwijderd op 16-11-2005 17:14 ]


Verwijderd

Topicstarter
Zo simpel, en ik zou er zelf nooit opgekomen zijn. Dank je wel!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Echt simpel is het trouwens niet, de toegang tot variabelen javascript/jscript/ECMAScript/whatever is vrij ingewikkeld. Als je eens precies wil lezen hoe het werkt, lees dan ook eens Javascript Closures.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

chris schreef op donderdag 17 november 2005 @ 18:59:
Echt simpel is het trouwens niet, de toegang tot variabelen javascript/jscript/ECMAScript/whatever is vrij ingewikkeld. Als je eens precies wil lezen hoe het werkt, lees dan ook eens Javascript Closures.
Mwa, dit is gewoon een klassiek scope-probleem. Als je in de developer toolbar in Firefox strict javascript warnings aanzet wordt je er ook gewoon voor gewaarschuwd als je niet expliciet binnen een functie gebruikte variabelen declareerd.
En mocht je een global willen maken, declareer die dan ook gewoon in de global scope; dat is gewoon nette programmeer-stijl.

Intentionally left blank

Pagina: 1