Avatar billede athlon-pascal Juniormester
23. januar 2004 - 15:53 Der er 4 kommentarer og
2 løsninger

Slette node, bevare indholdet

Jeg vil gerne slette en node, men bevare indholdet. Det er nok bedre beskrevet ved kommentaren i koden:

var tags=document.getElementsByTagName("span");
for (ifor=0; ifor < tags.length; ifor++) {
  if (tags[ifor].className.toLowerCase().indexOf("jshighlightscriptex")==0) {
  // Her vil jeg have noget kode, der sletter noden, men bevarer alt indholdet. Jeg tror det er noget med, at kopiere indholdet over i en variabel, slette noden og så indsætte indholdet i nodens parentNode. Altså "en masse" javascript og DOM.
  }
}

Det skal virke i Mozilla (Firebird), IE gør ikke så meget, da det er til en bookmarklet (der i forvejen ikke virker i IE).

På forhånd tak :o)
Avatar billede athlon-pascal Juniormester
23. januar 2004 - 15:53 #1
Noden er tags[ifor], hvis nogen er i tvivl :o)
Avatar billede skovenborg Nybegynder
23. januar 2004 - 17:04 #2
tænker du på selve teksten der står inde i span-elementet eller er det hele span-noden du vil kopiere???

Med teksten burde det kunne gøres sådan (medmindre jeg har misforstået noget):
var tags=document.getElementsByTagName("span");
  for (ifor=0; ifor < tags.length; ifor++) {
    if (tags[ifor].className.toLowerCase().indexOf("jshighlightscriptex")==0) {
      var temp_node = tags[ifor].firstChild;
      tags[ifor].removeChild(tags[ifor].firstChild);
      tags[ifor].parentNode.appendChild(temp_node);
    }
  }
Avatar billede skovenborg Nybegynder
23. januar 2004 - 17:04 #3
av, det skulle ikke være et svar - sorry ;-)
Avatar billede athlon-pascal Juniormester
23. januar 2004 - 18:12 #4
skovenborg -> Jeg har løst problemet nu :o)
Det var ikke helt dit forslag der løste problemet, men det var med til det :-)

var temp_node, parent_node;
tags = document.getElementsByTagName("jshighlightscriptex");
for (ifor = tags.length - 1; ifor >= 0; ifor--) {
  parent_node = tags.item(ifor).parentNode;
  temp_node = tags.item(ifor).firstChild.cloneNode(true);
  parent_node.replaceChild(temp_node, tags.item(ifor));
}

Min bookmarklet (der er baseret på http://www.squarefree.com/bookmarklets/pagedata.html#highlight):

java script:(function(){var ifor=0, count=0, tags, temp_node, parent_node, report, text, dv, lines, colors=new Array("lime", "yellow", "aqua", "red");text=prompt("Search phrase:", "");if(text==null || text.length==0)return;window.status="Searching for \""+text.replace(/\|/g,"\", \"")+"\"...";lines=text.split("|");dv=document.defaultView;function searchWithinNode(node, te, len, color){var pos, skip, spannode, middlebit, endbit, middleclone;skip=0;if( node.nodeType==3 ){pos=node.data.toUpperCase().indexOf(te);if(pos>=0){spannode=document.createElement("jshighlightscriptex");spannode.style.backgroundColor=color;spannode.style.color="black";middlebit=node.splitText(pos);endbit=middlebit.splitText(len);middleclone=middlebit.cloneNode(true);spannode.appendChild(middleclone);middlebit.parentNode.replaceChild(spannode,middlebit);++count;skip=1;}}else if( node.nodeType==1&& node.childNodes && node.tagName.toUpperCase()!="SCRIPT" && node.tagName.toUpperCase!="STYLE" && node.tagName.toUpperCase()!="TEXTAREA"){for (var child=0; child < node.childNodes.length; ++child){child=child+searchWithinNode(node.childNodes[child], te, len, color);}}return skip;} tags=document.getElementsByTagName("jshighlightscriptex");for (ifor=tags.length-1;ifor>=0;ifor--){parent_node=tags.item(ifor).parentNode;temp_node=tags.item(ifor).firstChild.cloneNode(true);parent_node.replaceChild(temp_node,tags.item(ifor));} report="Report:";for (ifor=0; ifor<lines.length; ifor++) {if(lines[ifor]==null || lines[ifor].length==0)continue; count=0; searchWithinNode(document.body, lines[ifor].toUpperCase(), lines[ifor].length, colors[ifor%colors.length]); report=report+"  \""+lines[ifor]+"\" "+count+";"}window.status=report;})();

Det skal bruges i http://www.eksperten.dk/artikler/16 :o)
Avatar billede skovenborg Nybegynder
23. januar 2004 - 18:17 #5
ahh, tænkte nok det var noget med den artikel ;-)

Men takker for point selvom mit forslag jo ikke var helt som du måske ville ha' det.
Avatar billede athlon-pascal Juniormester
23. januar 2004 - 20:12 #6
Jeg kom i tanke om, at man med mit script godt kan fremhæve noget inde i en fremhævning (f.eks. "ma firebird|bird"), og dermed få flere childnodes til hver node, så her er en rettelse:

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]);
}
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