Avatar billede mikmakmuk Nybegynder
17. juli 2008 - 08:46 Der er 9 kommentarer og
1 løsning

undgå innerhtml (linebreak)

Jeg vil gerne undgå innerhtml, men det giver mig nogle problemer i forbindelse med linebreaks. Hvis jeg gør dette:

var errortext="dengang jeg drog afsted <br /> ladida";

document.getElementById("bla").appendChild(document.createTextNode(errorText));

Får jeg <br /> ud som tekst. Hvordan får jeg den til at sætte et linebreak ind?
Avatar billede fbisen Nybegynder
17. juli 2008 - 09:48 #1
Jeg er overhovedet ikke sikker. Kan man måske gøre det med \n istedet?
Avatar billede w13 Novice
17. juli 2008 - 09:50 #2
Du bliver nødt til at gøre det med lidt flere linjer, men til gengæld bliver din kode helt valid:

function insertText(o,s){
  s=s.split("<br />");
  for(var i=0;i<s.length;i++){
    o.appendChild(document.createTextNode(s[i]);
    o.appendChild(document.createElement("br"));
  }
}

var errortext="dengang jeg drog afsted <br /> ladida";

insertText(document.getElementById("bla"),errorText);
Avatar billede w13 Novice
17. juli 2008 - 09:51 #3
fbisen>> \n vil aldrig blive vist som linjeskift i andet end koden. Og med koden document.createTextNode er det ikke muligt at indsætte HTML-koder - kun tekst.

Min kode skulle i øvrigt have været:

function insertText(o,s){
  s=s.split("<br />");
  for(var i=0;i<s.length;i++){
    o.appendChild(document.createTextNode(s[i]);
    o.appendChild(document.createElement("br"));
  }
}

var errortext="dengang jeg drog afsted <br /> ladida";

insertText(document.getElementById("bla"),errorText);
Avatar billede w13 Novice
17. juli 2008 - 09:51 #4
Hov, sådan her:

function insertText(o,s){
  s=s.split("<br />");
  for(var i=0;i<s.length;i++){
    o.appendChild(document.createTextNode(s[i]));
    o.appendChild(document.createElement("br"));
  }
}

var errortext="dengang jeg drog afsted <br /> ladida";

insertText(document.getElementById("bla"),errorText);
Avatar billede fbisen Nybegynder
17. juli 2008 - 09:55 #5
w13-> Bare iorden. Jeg forstod heller ikke helt præcis spørgsmålet kan jeg se -> Det var et gæt i tågen. Så det er jo godt du er ekspert :)
Avatar billede olebole Juniormester
18. juli 2008 - 00:44 #6
<ole>

Nu er der nok en eller anden (mindst - høhø!), der har læst mig skrive noget om, at man aldrig har markup i en database - og/eller at man aldrig formaterer returdata som HTML i Ajax. I enkelte tilfælde vil jeg dog gerne indrømme, man kan have databaseindhold, hvor det kan være grænsende til en nødvendighed at have simpel formatering liggende i DB ... et online nyhedssite, forfattersite, o.lign.

Det betyder dog ikke, at jeg går ind for at udskrive tabeller, lister og div med f.eks. PHP, inden data returneres til klienten/browseren. Det beslaglægger alt for mange af serverens resourcer! Her taler jeg om f.eks. lidt b-, i- og br-tags  ;o)

Til det formål har jeg lige hugget en ligge konverter sammen:

-------------------- snip --------------------
<script type="text/javascript">
function str2dom(sHtml) {
    var oXmlDoc = null;
    sHtml = "<z>"+sHtml.replace(/<br>/gi, "<br />").replace(/(^|>)(.*?)(<|$)/g, "$1<![CDATA[$2]]>$3")+"</z>";
    if (window.DOMParser) {
        var oParser = new DOMParser();
        oXmlDoc = oParser.parseFromString(sHtml, "text/xml");
    } else {
        oXmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
        oXmlDoc.async = false;
        oXmlDoc.loadXML(sHtml);
    }
    return cloneNodes(oXmlDoc.firstChild, document.createDocumentFragment());
   
    function cloneNodes(oXML, oDOM) {
        var aCh = oXML.childNodes;
        for (var i=0,j=aCh.length; i<j; i++) {
            if (aCh[i].nodeType==1) {
                var o = document.createElement(aCh[i].nodeName);
                oDOM.appendChild(o);
                arguments.callee(aCh[i], o);
            }
            else if (aCh[i].nodeType==4) oDOM.appendChild(document.createTextNode(aCh[i].nodeValue));
        }
        return oDOM;
    }
}

function fooBar(sHtml) {
    var oTo = document.getElementById("foo");
    oTo.appendChild( str2dom(sHtml) );
}

var sHtml = "Abla <b>bla</b> blabla. <i>Noget kursiv <br> skrift</i> bla. <b>En fed skrift <i>- og noget kursiv</i>, samt noget fed igen</b> ... og til slut noget normalt";
</script>

<button onclick="fooBar(sHtml)">TEST</button>
<div id="foo"></div>
------------------- /snip --------------------

Denne version virker ligesom:
    ELEMENT.innerHTML += sHtml;

- altså en tilføjelse til elementets DOM-træ. Skal man bruge:
    ELEMENT.innerHTML = sHtml;

- skal funktionen fooBar se sådan ud:

function fooBar(sHtml) {
    var oTo = document.getElementById("foo");
    while (oTo.firstChild) oTo.removeChild(oTo.firstChild);
    oTo.appendChild( str2dom(sHtml) );
}

Det er ikke nogen effektiv måde at gøre tingene på, men det kan som sagt bruges i visse specielle tilfælde  =)

/mvh
</bole>
Avatar billede olebole Juniormester
18. juli 2008 - 00:55 #7
- vær opmærksom på, at der ikke må findes ulovlige, 'skæve' nestninger ... altså ikke noget à la:
    <b>noget fed <i>og noget kursiv</b></i>

Der er heller ikke taget højde for evt. (parser-) fejl eller opsnapning af disse - eller for browsere, der ikke understøtter de to implemneteringer af en XML-parser (har f.eks. ikke testet i Opera). Der er blot tale om et udkast til inspiration og videre udvikling  ;o)
Avatar billede olebole Juniormester
18. juli 2008 - 01:19 #8
- og tegnene '<' og '>' vil heller ikke være gode i teksten - udenfor tags  =)
Avatar billede mikmakmuk Nybegynder
22. juli 2008 - 13:03 #9
Jeg må erkende at jeg ikke fattede så meget af det :-( Er i en situation hvor jeg vælger at holde mig til innerhtml
Avatar billede w13 Novice
22. juli 2008 - 13:04 #10
mikmakmuk>> Så du kunne ikke bruge:

function insertText(o,s){
  s=s.split("<br />");
  for(var i=0;i<s.length;i++){
    o.appendChild(document.createTextNode(s[i]));
    o.appendChild(document.createElement("br"));
  }
}

var errortext="dengang jeg drog afsted <br /> ladida";

insertText(document.getElementById("bla"),errorText);
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