Avatar billede michaelthomassen Nybegynder
21. august 2007 - 11:07 Der er 19 kommentarer og
2 løsninger

innerHTML i DOM nødvendigt?

Jeg er lige startet på Ajax/Json/DOM så jeg blander måske nogle begreber sammen.

Jeg har en php fil der returnerer indholdet af en række i en tabel til et Ajax objekt i Json format. Jeg sætter et javascript objekt her;

    eval("var myObj = " + dynamicContent_ajaxObjects[ajaxIndex].response);

Nu indeholder myObj.myText det som jeg gerne skal have vist. Det gør jeg således;

    var targetObj = document.getElementById(divId);
    while (targetObj.firstChild)
        targetObj.removeChild(targetObj.firstChild); 
    o = document.createElement("div");
    oo = document.createTextNode(myObj.myText);
    o.appendChild(oo);
    targetObj.appendChild(o);

Det virker også fint, bortset fra at indholdet i myText er formateret som html (kommer fra en wysiwyg javascript editor), men ikke bliver vist som sådan (< og > bliver oversat til &lt; / &gt;). Hvis jeg i stedet benytter mig af den grumme innerHTML virker det efter hensigten.

    o = document.createElement("div");
    o.innerHTML = myObj.myText;
    targetObj.appendChild(o);

Er der en måde til at slippe af med den innerHTML?
Avatar billede Slettet bruger
21. august 2007 - 11:29 #1
Skal du have vist HTML koden eller vil du have vist det resulterende layout?

Hvis det er koden, du er interesseret i, må der være noget galt med din input.
Hvis det er layout, skal du bruge innerHTML.
Avatar billede michaelthomassen Nybegynder
21. august 2007 - 11:45 #2
Det er det resulterende layout jeg skal have fat i. Jeg har bare flere steder læst at innerHTML er "a big no-no".
Avatar billede erikjacobsen Ekspert
21. august 2007 - 12:16 #3
innerHTML virker i de fleste browsere for tiden - er det godt nok til dig, så bruger det bare. Skal du være sikker på det virker i alle browsere nu og i fremtiden, så er det nok ikke så smart. Det er helt op til dig - det er ikke ulovligt som sådan ;)
Avatar billede erikjacobsen Ekspert
21. august 2007 - 12:21 #4
"Er der en måde til at slippe af med den innerHTML?" - ja, hvis du ikke sender HTML tilbage til klienten, eller hvis du parser den HTML du får, og opretter passende elementer.

Hvad der er bedst i sammenhængen kan jeg lige udtale mig om ud fra det skrevne.
Avatar billede michaelthomassen Nybegynder
21. august 2007 - 12:29 #5
Jeg prøver så vidt muligt, at lave korrekt kode, men hvis der ikke er en måde at få min kode til at virke uden at bruge den innerHTML, bliver jeg vel nødt til det.

Jeg ville bare vide om der var en smart måde at omdanne min HTML formaterede streng til noget jeg kunne bruge i den ovenstående kode.

Man kunne selvfølgelig begynde at skrive en HTML->DOM parser :)
Avatar billede michaelthomassen Nybegynder
21. august 2007 - 12:30 #6
Hehe, havde ikke set dit sidste indlæg inden jeg skrev ovenstående :)
Avatar billede olebole Juniormester
21. august 2007 - 12:32 #7
<ole>

I AJAX sender man ikke HTML retur til klienten, men data i XML- eller JSON-format.

innerHTML er et af de syge levn fra midten af 90'erne, hvor den var eneste mulighed for at ændre en sides indhold.
Den har aldrig været valid (og bliver det aldrig). Den ødelægger fremtidige muligheder for begavet scripting i dokumenter, hvor den anvendes. Den er absolut inkompatibel med XHTML.

Derudover gemmer man ikke HTML i databaser - så det er vel lidt vanskeligt at se, hvorfor man skulle sende HTML retur til klienten.
Eneste undtagelse er helt simpel HTML som b-, u- og i-elementer - som hurtigt kan sies fra, når DB indholdet skal bruges til andet end HTML-sider - og som er lette at parse og omdanne til DOM, når det skal bruges i HTML-dokumenter.

/mvh
</bole>
Avatar billede michaelthomassen Nybegynder
21. august 2007 - 12:40 #8
Ole: HTML'en stammer fra en javascript wysiwyg editor (http://www.unverse.net) hvor mine brugere kan oprette artikler som de selv sætter formatet op på (laver punktopstilling, links, indsætter billeder osv.). Hvordan skal jeg gemme disse data, hvis man efter din mening ikke må gemme HTML direkte i databasen?
Avatar billede michaelthomassen Nybegynder
21. august 2007 - 12:43 #9
Og i øvrigt bliver HTML'en heller ikke sendt direkte til klienten, men sat fint ind i et json objekt (bruger i øvrigt din kode fra http://www.eksperten.dk/spm/742127). Ved godt at det er det samme, men prøver da i det mindste at skrive bare lidt korrekt kode ;)
Avatar billede olebole Juniormester
21. august 2007 - 12:52 #10
Du bør nok indrette din backend helt anderledes - og måske begrænse brugerens muligheder. Det bør aldrig være nødvendigt at opbevare så meget HTML i ét DB-felt.

Til sitet om din Piphans betyder det ikke så meget - men hvad nu, hvis dit site f.eks. bliver en kæmpe success og du skal til at syndikere dit indhold via RSS?
Så vil al din HTML måske være skyld i, at du må fortsætte med at sælge pølser på det lokale gadehjørne i stedet for at blive web-mogul med privatjet i Hummer'ens bagagerum  ;o)
Avatar billede erikjacobsen Ekspert
21. august 2007 - 12:59 #11
Og det Ole siger: Hvis du vil have det gjort "ordentligt" så skal du ikke bruge AJAX til udskiftning af teksten fra din wysiwyg-editor, hvis den tillader vilkårlige HTML-ting.

Ja, det ville være rart, hvis man kunne, men det kan man ikke. Jeg kunne også godt for tiden tænke mig at myg aldrig var opfundet. Men det er nu i begge tilfælde sådan verden er.

"piphans" eller ej: Hvis din kunde er tilfreds med "virker i de fleste browsere for tiden" skal du bare ignorere Olebole. Men du skal kontraktmæssigt nok lige fortælle ret præcist hvad du står inde for, og hvad du ikke gør. Og så gad jeg nok se den kunde, der vil acceptere det ;)
Avatar billede olebole Juniormester
21. august 2007 - 13:05 #12
Lidt perspektiv: Det er væsentlig mere uskadeligt at lave dit layout i et stort tabel-helvede med hundredevis af spacer-giffer, end det er at bruge innerHTML.

- men som Erik ganske fornuftigt anfører: Det er helt op til dig og kunden, sålænge du er ærlig  ;o)
Avatar billede olebole Juniormester
21. august 2007 - 13:09 #13
En helt anden ting: Er du opmærksom på, at alt det indhold, du henter med AJAX har Google ikke kinamands chance for at indeksere?
Sammenholdt med, at 80-90% af al trafik til et site kommer fra søgemaskiner, så er det en 'detalje', det er værd at overveje!
Avatar billede michaelthomassen Nybegynder
21. august 2007 - 13:19 #14
Nu er min kunde heldigvis mig selv, så jeg kan lave det som jeg vil :) Men når det så er sagt, så prøver jeg at skrive korrekt kode der kan bruges i de fleste browsere på markedet (tester alt af i IE, Opera og Firefox og hvis det virker i de tre er man vel sikker på at det virker hos mindst 99% af brugerne).

Omkring HTML i databaser er det jo et helt andet spørgsmål, som jeg måske vil oprette herinde en dag.

I sidste ende får jeg rent faktisk næppe brug for at hente min HTML via AJAX. Som nævnt i oprindelig spørgsmål, er jeg lige startet på AJAX, JSON og DOM og var lige i gang med at teste lidt og prøvede at hente min HTML formaterede tekst via AJAX. Da det ikke virkede optimalt, oprettede jeg spørgsmålet for at høre om det var muligt uden innerHTML.

For at få dette spørgsmål afsluttet, sætter jeg 15 point mere af, så kan Ole og Kvadratrodenaf1 dele (så vidt jeg husker samler Erik ikke på point?). Så smid lige et svar i to. Tak til jer alle tre!
Avatar billede olebole Juniormester
21. august 2007 - 13:32 #15
- det er hermed lagt ... og selvtak  =)
Avatar billede erikjacobsen Ekspert
21. august 2007 - 13:46 #16
"99% af brugerne" - mnjah. Du har så testet på 3 fede browsere på kæmpePC-ere. Når jeg kigger mig omkring sidder flere og flere og kæmper med at ramme taster eller skærm på små, mobile enheder som ganske vist har en browser, der måske endda har et navn der minder om navnet på een af de fede, men som naturnødvendigt ikke kan det samme.

Mit kendskab til dem er såre begrænset, men det ville undre mig om ikke de er vil overholde standarder i højere grad, og i mindre grad vil implementere tidligere tiders undtagelser.

Nej tak, ingen point.
Avatar billede Slettet bruger
21. august 2007 - 14:04 #17
Hvad blev din løsning, hvis det ikke blev AJAX? Serverside hentning af designet?

/1
Avatar billede michaelthomassen Nybegynder
21. august 2007 - 14:54 #18
Løsningen blev at jeg slet ikke henter det :) Jeg er kommet frem til at jeg ikke har brug for at hente HTML'en fra databasen via AJAX, men sætter det ind på server siden de steder jeg har brug for det.
Avatar billede olebole Juniormester
21. august 2007 - 15:29 #19
Tak for points  ;o)

Min gamle underbo sagde altid (jaja, han sagde selvfølgelig også andre ting, men ...):

    For en mand med en ny hammer kommer alt til at ligne søm!

Sådan er det også, når en ny teknik/teknologi rammer WWW. Man skal skam heller ikke kimse ad, at det har været en væsentlig drivkraft bag udviklingen af nettet (og desværre også indviklingen af det!).
Efterhånden svinger pendulet dog somregel ind mod midten igen og man vælger at bruge 'nyheden' på hensigtsmæssige måder - i stedet for at bruge den til alt.

Jeg tillader at tolke dit valg som udtryk for, at du er ved at finde derhen med hensyn til AJAX. Det kan jo kun glæde mig på dine vegne  ;o)
Avatar billede michaelthomassen Nybegynder
21. august 2007 - 15:52 #20
Ole:
Ja, det var også på tide at jeg fandt derhen, efter at have arbejdet med AJAX i hele to dage ;)

Har du i øvrigt en opdateret version af din jsonEncode.php fra http://www.eksperten.dk/spm/742127? Jeg synes der er et par småbugs i den (understøttelse af multidimension arrays og hvis variabler indeholder " går den i udu).
Er der en let måde at komme fra XML dataene indeholdende JSON objektet over til det som du kan lave eval på i JavaScriptet?
Avatar billede olebole Juniormester
21. august 2007 - 17:08 #21
I know ... det er en halvgammel ting, jeg lavede i en snæver vending - på et tidspunkt, jeg ikke selv havde fået helt styr på XMLHttpRequests og tegnsæt.

Idag bruger jeg ren JSON - uden XML 'omkring'. Til gengæld sørger jeg for korrekt tegnsæt i alle led. Dvs, at jeg sørger for at vælge et tegnsæt og bruger så det helt gennemført - hvilket jeg naturligvis også burde have gjort dengang [lyden-af-blafrende-røde-ører]  ;o)

Idag bruger jeg enten Zend's eller Pear's JSON-klasse - alt efter PHP-version:
    http://framework.zend.com/ - PHP5-only
    http://pear.php.net/pepr/pepr-proposal-show.php?id=198 - PHP4 (kan også bruges under V.5)

Efterhånden har man fået rettet de første (memory-leak) bugs i PHP5's egen JSON-funktioner - så hvis det er en ny PHP5-version, jeg skriver til, bruger jeg de indbyggede.

Læs i øvrigt windscape's lille JSON-artikel:
    http://www.eksperten.dk/artikler/1053
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