Avatar billede athlon-pascal Juniormester
25. januar 2004 - 20:01 Der er 2 kommentarer og
1 løsning

Slette element, bevare indhold

I http://www.eksperten.dk/spm/455956 fandt jeg frem til, hvordan man sletter et element, men bevarer indholdet:

var ifor = 0, jfor = 0, tags, tmpnode, parnode;
tags=document.getElementsByTagName("mozjshlightex");
for (ifor = tags.length-1; ifor >= 0; ifor--) {
  parnode = tags[ifor].parentNode;
  for (jfor = 0; jfor < tags[ifor].childNodes.length; jfor++) {
    tmpnode = tags[ifor].childNodes[jfor].cloneNode(true);
    parnode.insertBefore(tmpnode, tags[ifor]);
  }
  parnode.removeChild(tags[ifor]);
}

Problemet er bare, at teksten i elementet der bliver slettet, bliver indsat i et/flere nye element(er) i parentNode.
Det ønsker jeg ikke, da det bookmarklet-highlight-script jeg skal bruge det i, ikke kan søge på tværs af elementer.

Hvordan gør jeg det, så elementet bliver slettet, men indholdet bevaret, mens elementets tekst-indhold ikke bliver oprette som et nyt element i parentNode?

Det er måske lidt tåget, derfor vil jeg prøve at illustrere det; jeg har f.eks. følgende struktur:

<div>
  En masse tekst, og lidt til...<br />
  Der kan stå meget...
  <mozjshlightex style="background-color: green;">
    <mozjshlightex style="background-color: yellow;">
      Fremhævet
    </mozjshlightex>
    tekst...
  </mozjshlightex>
</div>

Med min nuværende kode, vil det blive til:

<div>
  En masse tekst, og lidt til...<br />
  Der kan stå meget...
  <>
    <>
      Fremhævet
    </>
    tekst...
  </>
</div>

Som du kan se, er teksten stadigvæk i elementer :-(

Jeg vil have det sådan, efter scriptet:

<div>
  En masse tekst, og lidt til...<br />
  Der kan stå meget...
  Fremhævet tekst...
</div>

Det skal virker i Mozilla (Firebird), IE er lige meget.

Jeg skal bruge det i http://www.eksperten.dk/artikler/16 :o)

På forhånd tak :o)
Avatar billede roenving Novice
26. januar 2004 - 00:48 #1
Nu er en textnode jo også en node, uanset om den har en tag ...

-- og så bruger du cloneNode, som opretter en ny node, måske var det innerhtml, du har brug for i stedet ?-)
Avatar billede athlon-pascal Juniormester
26. januar 2004 - 12:01 #2
roenving -> Hvordan ville du da gøre det?
Avatar billede athlon-pascal Juniormester
27. januar 2004 - 19:21 #3
Jeg har fundet en løsning! :o)

var ifor = 0, jfor = 0, tags, tmpnode, parnode;
tags = document.getElementsByTagName("mozjshlightex");
for(ifor = tags.length - 1; ifor >= 0; ifor--) {
  parnode = tags[ifor].parentNode;
  for(jfor = 0; jfor < tags[ifor].childNodes.length; jfor++) {
    tmpnode = tags[ifor].childNodes[jfor].cloneNode(true);
    parnode.insertBefore(tmpnode, tags[ifor]);
  }
  parnode.removeChild(tags[ifor]);
  parnode.normalize();
}

"Tricket" er brugen af parnode.normalize(); :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester