Avatar billede fidius Nybegynder
20. november 2007 - 12:54 Der er 19 kommentarer

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
Avatar billede fidius Nybegynder
20. november 2007 - 12:55 #1
<br /> skal selvfølgelig ikke lave et mellemrum, men derimod gå til en ny linie:)
Avatar billede w13 Novice
20. november 2007 - 13:28 #2
Du må vise, hvordan du gør.
Avatar billede fidius Nybegynder
20. november 2007 - 13:46 #3
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?
Avatar billede w13 Novice
20. november 2007 - 14:30 #4
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?
Avatar billede fidius Nybegynder
20. november 2007 - 14:35 #5
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:/
Avatar billede w13 Novice
20. november 2007 - 14:40 #6
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>.
Avatar billede fidius Nybegynder
20. november 2007 - 20:16 #7
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:)
Avatar billede w13 Novice
20. november 2007 - 21:55 #8
Okidoke! :)
Avatar billede fidius Nybegynder
20. november 2007 - 21:55 #9
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 = "";

text = text.split("<br />");
   
for(var i=0; i<text.length; i++) {
  tTmp = document.createTextNode(text[i]);   
   
  parent.appendChild(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);
  }
}
}

...
Avatar billede w13 Novice
20. november 2007 - 21:58 #10
Hmmm.. Jaeh.. =) Nu har du opdelt efter <br>. Hvad så med at opdele efter <i> inde i forløkken?
Avatar billede fidius Nybegynder
20. november 2007 - 22:06 #11
Somsagt ved jeg ikke helt hvordan jeg skal gribe det an:/
Måske du kunne forklare det lidt mere detaljeret?
Avatar billede w13 Novice
20. november 2007 - 22:25 #12
Det bli'r ikke helt let, og kan jo nok gøres meget bedre. F.eks. hvis man nu havde sådan en DOM-funktion, vi snakkede om.

Jeg ved det faktisk ikke helt.. Det bli'r jo lidt kompliceret, når det både er med <i> og </i> f.eks..
Avatar billede fidius Nybegynder
20. november 2007 - 22:28 #13
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.
Avatar billede roenving Novice
20. november 2007 - 22:32 #14
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 !-)
Avatar billede fidius Nybegynder
20. november 2007 - 22:57 #15
Jeg er ikke sikker på jeg forstår dig ret, Roenving ... kan du forklare dig lidt anderledes, måske?
Avatar billede roenving Novice
20. november 2007 - 23:13 #16
Et json format kunne f.eks. være:

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 !-)
Avatar billede roenving Novice
20. november 2007 - 23:16 #17
Hrm, det skal selvfølgelig være tekst:

var markup = [['hej og velkommen,'],['¤br'],['¤br'],['jeg hedder...']];
Avatar billede fidius Nybegynder
20. november 2007 - 23:35 #18
Det var nu ikke så meget det, men derimod det du siger med at der ikke indsættes nogen br-tags hvis der kun er ét enkelt, hvilket der gør...:)

Jeg må dog igen erkende jeg ikke kan følge dig, men det kan selvfølgelig også være pga. min manglede json erfaring.
Avatar billede w13 Novice
29. juli 2008 - 10:50 #19
Lukketid?
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