Udskriv som html, ikke bare tekst - dumme xmlHttpRequest
Hej, jeg sidder lige nu i en situation et gruppe forskellige brugere skriver noget tekst der så bliver gemt i databasen. Bagefter bliver det hentet af xmlHttpRequest og vist for brugeren. Nu er problemet bare, at hvis personen skriver noget html (f.eks. <br />) i sin tekst, så skal den lave et mellemrum, og ikke bare udskrive det som tekst. Problemet er uden tvivl at jeg smider indholdet fra databasen i en textNode, men hvordan jeg ellers gør, ved jeg ikke... Hvordan?:D
Virksomheder er på vej fra store sprogmodeller, der svarer på spørgsmål, til AI-agenter, der kan udføre opgaver på egen hånd. Det gør teknologien mere nyttig – og langt mere risikabel.
Well, først og fremmest, burde der nok stå dumme DOM og ikke xmlHttpRequest i overskriften:P
var textObj = document.createTextNode('hej og velkommen,<br /><br />jeg hedder...');
Sådan kan jeg risikere at det kommer til at se ud, når jeg hiver noget tekst ud af databasen og oprette det som et child. Nu vil jeg så godt have at den i stedet for bare at skrive <br /><br />, så laver 2 mellemrum, altså at den behandler teksten som normal text/html... Skal jeg bruge noget andet end createTextNode eller skal jeg smide nogen funktioner på? Hvordan klare jeg den?
Ja. Det er nemlig problemet. Du kan ikke bruge HTML i en textnode. Og innerHTML er invalidt. Hvis man er god, kan man lave en DOM-parser, som løber teksten igennem og indsætter de rigtige DOM-elementer, når den når til dem. Men det er ikke sådan lige at lave.
Er <br /> det eneste HTML-tag, der kan være i teksten?
Nej, der kan i teorien være et hvilket somhelst tag... Jeg troede egentligt at DOM havde en function indbygget, for jeg tror da at det er en meget efterspurgt lille ting at kunne. Især nu hvor der er mange der bruge ajax til at implamentere indhold på hjemmesider:/
Ja. Hvis det var lavet som indbygget, gyldig funktion, ville folk holde op med at bruge innerHTML, der jo er meget invalidt. Men det er desværre ikke lavet endnu, så man må selv konstruere sådan en, hvis man vil bruge den.
Havde det nu kun været <br>-tags i din tekst, kunne vi opdele tekststrengen i et array ved hvert "<br />". Så kunne vi løbe arrayet igennem, og for hver post indsætte teksten efterfulgt af et korrekt DOM-indsat <br>.
Okay, så er det jeg sidder og tænker lidt ... Sikkerhed frem for alt, og når jeg bruger createTextNode, så går jeg ud fra at man ikke kan lave nogen form for injections eller scripts der laver ballade og sådan, så der er vi allerede sikret. Så det jeg egentligt bare skal gøre nu, er at bestemme mig for hvilke tags der faktisk kan bruges, og jeg tror det bliver <br />, <i>, <u>, <u> til at starte med. Så skal jeg vil egentligt bare lave en funktion der modtager hvilken streng den skal gøre noget på, og hvilket tag den skal gøre det med, og så ellers bare som du siger; dele strengen op i et array, når den møder de forskellige tags og så smide dem ind. Der hvor jeg tror jeg får lidt problemer, bliver med at få tingene smidt i en div, da det ikke bare er en form for tag der skal arbejdes med, men flere. Men, nu må vi se. Jeg vender tilbage når jeg er færdig eller løber ind i problemer:)
Okay, jeg har lavet denne funktion der løser problemet med br-tagget, men jeg ved sku ikke rigtigt hvordan jeg får den lavet så den virker med forskellige tags - altså så den tager og gør det ved f.eks. både <br />, <i> og <u> tags i samme streng (parent = det element teksten skal smides i, text = teksten der skal formatteres)
function encodeToHTML(parent, text) { var tag = ""; var tTmp = "";
// prevents the script from ignoring the last array-item // if it's a br-tag if(i<(text.length - 1) || text[i] == "") { tag = document.createElement('br'); parent.appendChild(tag); } } }
Ja, det er nok rigtig nok ... Men i sig selv, kræver det kun ét ekstra split, der leder efter </i>, hver gang <i> findes og så har du tilgang til teksten der skal være i i-tagget ... Men problemet er bare at jeg ikke ved hvordan jeg skal implamentere det.
Men hvis du har flere br-tags vil ovenstående jo heller ikke virke, for du indsætter jo ikke nogle br-tags, hvis der kun er et enkelt ?-)
-- jeg tror jeg selv ville gå efter et json- eller xml-format, der var til at gå til direkte, og så lave oversættelsen til dette før indsættelse i databasen !-)
var markup = [['hej og velkommen,'],[¤br],[¤br],['jeg hedder...']];
-- her har jeg tilfældigvis brugt ¤ til tegn for et unært markup-tag, markup-tags med indhold skal selvfølgelig skrives med indre arrays til indhold, men hvis du kun har/tillader simpelt indhold, er det jo ikke et problem !-)
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.