Toon posts:

[js] problemen met parent element

Pagina: 1
Acties:

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
function findTag(selection, tag){

    var selection = document.selection.createRange();

    var tag = "B"; // voor het gemak een tag gegeven
        
        while(selection.parentElement().tagName != tag){// als het geen tag is die ik zoek..

            findTag(selection.parentElement); //..nog een keer zoeken inclusief de eerste parentElement
        
        }

}



Nu ziet ie van een selectie alleen <i> als parentElement. Ik probeer dus een "tag" te zoeken en het hoeft niet perse <i> te zijn. Dus heb ik een functie gemaakt om dat te doen. Het werkt alleen nog niet helemaal correct.Ik krijg een bericht: Stack overflow. Weet iemand wat er aan de hand is?

selectie :<b><u><i>Teksten</i></u></b>

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Het probleem zit in de while loop, de voorwaarde is dat hij gaat loopen als selection.parentElement().tagName != tag. Probleem is dat als hij hier aan voldoet, hij ook voor 'eeuwig' blijft loopen en dus een stack overflow veroorzaakt. Ik denk dat je hier geen while loop nodig hebt, maar een simpele if statement.

Het gaat nog gekker zelfs, want die oneindige loop roept iedere keer dezelfde functie aan die ook weer oneindig kan loopen etc. Dan is het gauw afgelopen. :)

[ Voor 25% gewijzigd door Amras op 18-10-2004 12:35 ]


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

de voorwaarde in de while verandert niet, dat stopt dus nooit

doe iets ala:
code:
1
2
3
4
5
var parent = selection.parentElement();

while(parent && parent.tagName != tag) {
    parent = parent.parentElement();
}


let wel dat het resultaat ook null kan zijn.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


Verwijderd

Topicstarter
al eens geprobeerd, zelfde bericht: stack overflow........

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Verwijderd schreef op 18 oktober 2004 @ 12:31:
al eens geprobeerd, zelfde bericht: stack overflow........
Dan doe je toch iets verkeerd: je kan of recursie gebruiken en je while loop vervangen door een if-statement. Of je kunt het, zoals Clay voorstelt, iteratief oplossen. Aan jou de keuze, maar beide voorstellen kunnen dit probleem oplossen. ;)

Verwijderd

Topicstarter
Heb nu wat anders maar het werkt nog steeds niet.

code:
1
2
3
4
5
6
7
8
9
10
11
function findparent(sel) {  

    if(sel.parentElement().tagName != "B" ){

        var sel = sel.parentElement();              

            findparent(sel);
    
    }

}



voorbeeld tekst:
<b><u>teksten</u></b>

ik ben nu wel wat verder gekomen maar het blijft een foutmelding geven. Deze actie wordt niet ondersteund door dit object..

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 10:58

crisp

Devver

Pixelated

parentElement is geen method maar een property (of ben ik nu in de war met de DOM property parentNode???). Daarbij zou ik ook de tagName expliciet lower of uppercase maken - afhankelijk van de DTD en de gebruikte browser kan hij namelijk ook lowercase teruggegeven worden.
Zorg ook voor een stopconditie in het geval er bijvoorbeeld geen B-tag gevonden wordt:

JavaScript:
1
2
3
4
5
6
7
function findparent(sel)
{
  sel = sel.parentElement;
  if (sel == document) return null; // of throw een error oid
  if (sel.tagName.toUpperCase() != 'B') findparent(sel);
  return sel;
}


Je kan dit natuurlijk ook makkelijk iteratief doen in een while-lus. Mijn motto is: als je geen recursie nodig hebt, gebruik het dan ook niet. Een iteratieve oplossing is vaak vele malen sneller en minder geheugenintensief:

JavaScript:
1
2
3
4
5
6
7
function findparent(sel)
{
  sel = sel.parentElement;
  while (sel != document && sel.tagName.toUpperCase() != 'B')
    sel = sel.parentElement;
  return (sel == document ? null : sel);
}


uiteindelijk is dit dus precies hetzelfde als Clay al heeft geschreven; ik snap dan ook niet waarom je het persé met recursie wilt gaan oplossen.

[ Voor 40% gewijzigd door crisp op 25-10-2004 09:46 ]

Intentionally left blank

Pagina: 1