Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Slettet bruger
02. april 2008 - 17:27#1
hvad er det du sender tilbage og hvordan forsøger du at sætte det ind i din div?
man kan bruge lave hele tabellen serverside og indsætte den via innerHTML (og få olebole på nakken), eller man kan lave JSON data serverside og så lave genskabe tabellen i browseren via DOM.
Begge metoder har sine fordele og ulemper. I det lange løb er DOM nok bedst.
Du bør absolut _ikke_ benytte den teknik, hvilket du jo så også har opdaget !-)
-- du _kan_ bruge innerHTML, men da den aldrig har været eller vil være en del af den officielle binding mellem javascript og html, er det som daleif påpeger, uheldigt at bruge den (og så op i numsen med hvem man får på nakken, det vigtigste er, at man ikke skal lave hele sin grundlæggende kode om, hvergang der kommer en browser !-)
-- du bør derfor i stedet lave et json-objekt, som du kan indsætte elementerne via DOM fra ...
-- kender du den færdige struktur i svaret er det rasende simpelt, er strukturen nogenlunde fast, f.eks. altid 3 (eller måske 6 !-) kolonner i hver række, er det også rimeligt simpelt ...
-- hvis det er mere kompliceret, kan det blive vanskeligt !o]
En ting, man også bør tænke på (det er nævnt i en bisætning i slutningen af min artikel om innerHTML) er, at det ofte tager 5-10.000 gange længere tid at skrive HTML ud på serveren i forhold til at skrive samme data i JSON! ;o)
Men som roenving skriver, kan man ikke angive alternativer uden at kende den nøjagtige kode
Der er ikke noget specielt kompliceret i det jeg skal lave det er lige ud af landevejen en tabel med f.eks 6 kolonner hvor der vises noget tekst, nogle links og nogle submit buttons.
Links og buttons i bruges så til at behandle hver record fra databasen.
Findes der ikke nogle brugbare eksempler jeg kan se lidt på ?
Som Roenving og Olebole nævner, kan man ikke angive en fast formel for, hvordan du bør gøre, når vi ikke ved præcis, hvad du skal have produceret. Der er nemlig mange faldgruber og ting, der skal tages højde for, som afhænger 100% af detaljer i den kode, der skal opstå.
Synes godt om
Slettet bruger
03. april 2008 - 10:44#11
i den henseende har jeg et bi-spørgsmål:
hvis man har en tekst som hentes via AJAX/JSON og denne tekst indeholder links, hvad er så den "rigtige" måde at ordne sin tekst i JSON således at man kan få teksten overført, for vi kan jo ikke bare skrive <a href...>...</a> inden i teksten i JSON.
Så kan det sammensættes ordentligt med DOM. Første tekst indsættes som tekstnode, en A-node oprettes og linkteksten indsættes i dens HREF-attribut, og den anden tekst indsættes som tekstnode herefter.
Synes godt om
Slettet bruger
03. april 2008 - 11:14#13
Det er også den metode jeg anvendte i de indledende tests jeg har lavet med JSON, en smule bøvlet når ULR og URL tekst er forskellige, men det kan nemt fikses ved at opdele ved alle links i teksten.
Spurgte bare for at høre om der var andre (smartere) metoder.
Skal jeg så forstå det sådan at jeg fra mit c# kode kan lave noget i stil med dette :
StringBuilder sb = new StringBuilder(); sb.Append("{"users":["); foreach (BrugerGruppe grp in MinGenericList) { sb.Append("["); sb.Append(grp.Id.ToString()); sb.Append(grp.Admin.ToString()); sb.Append(grp.Description.ToString()); sb.Append(grp.Dato.ToString()); sb.Append("]"); } sb.Append("]}");
Det var lige hurtigt fra hoften, mener endda der er lavet en JSON.net version jeg kan bruge til dette på server siden.
03/04-2008 11:42:00 >>
Der hvor det så kniber lidt på javascript siden, er hvordan jeg får min JSON data smidt i en tabel.
Synes godt om
Slettet bruger
03. april 2008 - 12:37#20
du skal bruge din JSON data til at loope igenenm om via dette genererer du din tabel via DOM metoder, altså laver element noder og fylder dem med andre element og tekst noder
JavaScript-delen, når du har hentet JSON-data, kunne være noget i stil med:
var cntr=document.getElementById("beholder"); //elementet, som tabellen bliver lagt i if(json.users.length){ var newElement=document.createElement("table"); newElement.style.width="100%"; newElement.setAttribute("cellspacing","2"); newElement.setAttribute("cellpadding","2"); newElement.appendChild(document.createElement("tbody")); newElement.getElementsByTagName("tbody").appendChild(document.createElement("tr")); var newElementTr=newElement.getElementsByTagName("tr"); newElementTr.style.fontWeight="bold"; newElementTr.appendChild(document.createElement("td")); newElementTr.lastChild.appendChild(document.createTextNode("Id")); newElementTr.appendChild(document.createElement("td")); newElementTr.lastChild.appendChild(document.createTextNode("Bruger gruppe")); newElementTr.appendChild(document.createElement("td")); newElementTr.lastChild.appendChild(document.createTextNode("Beskrivelse")); newElementTr.appendChild(document.createElement("td")); newElementTr.lastChild.appendChild(document.createTextNode("Oprettet")); newElementTr.appendChild(document.createElement("td")); newElementTr.lastChild.appendChild(document.createTextNode("Handling")); for(var i=0;i<json.users.length;i++){ newElement.appendChild(document.createElement("tr")); newElementTr=newElement.getElementsByTagName("tbody").lastChild;
Hvis man havde lavet tabellens grundstruktur i HTML først (og evt. skjult den med style="display:none") kunne en hel del kode spares væk i ovenstående eksempel.
w13 >> Mange tak for det, så er der lidt at arbejde videre med. Jeg kan godt se at hvis min tabel bliver noget mere kompliceret så bliver javascriptet meget langt i forhold til brugen af .innerHTML
Flere af jer har advaret mod faldgrupper og ting jeg skal passe på, kan i komme med nogle af dem her ?
Ja, koden bliver længere, men du har til gengæld fuld kontrol over det hele, i og med du selv opbygger det fra bunden. innerHTML arbejder med objekter i string-format, hvilket er helt misforstået.
En af faldgruberne er jeg faktisk selv røget i i ovenstående eksempel, der hvor jeg sætter:
I virkeligheden bør eventhandlers (såsom onclick, onmouseover, osv.) først sættes på elementet, når elementet er indsat i dokumentet. Og det er det jo endnu ikke i min kode.
Hvad angår C# så glem det. Det jeg ville frem til med det var at jeg i min serverside kode skal generere den streng du viste længere oppe {"users":[[.....]]} forstået på den måde at : 1. jeg skal lave et kald til databasen for at hente data 2. disse skal løbes igennem for at danne ovenstående streng 3. strengen med data sendes retur via mit ajax kald.
Og så spørger jeg sikkert dumt, men som jeg læser koden så indsætter du først i dokumentet når loopen er kørt med denne cntr.appendChild(newElement); skal jeg så lave en function til at indsætte det med ?
Det er korrekt: loopen køres igennem (og konstruerer tabelrækkerne og -cellerne) og derefter indsættes tabellen i elementet med id="beholder". Dette kan selvfølgelig ændres efter behov.
Lige nu mener jeg godt, du bare kan gøre det, som jeg viser - jeg ved ikke så meget om det, Olebole er eksperten på det område, men ulempen ved f.eks. at sætte onclick på noget, der endnu ikke er indsat i dokumentet, er at _når_ det indsættes, ryddes der ikke ordentligt op i hukommelsen i Internet Explorer, og hvis AJAX kaldes mange gange, har man derved et hukommelsesproblem. Dvs. at det er en regulær bug!
Synes godt om
Slettet bruger
03. april 2008 - 14:25#27
Hvis det kun er tekst man indsætter, altså ingen eventhandlers, skal man så vente med at sætte den ind indtil man er færdig med at lave alle noder?
Jeg har før prøvet at bygge en liste af overskrifter, tekst og links ved at appende noder lide så snart jeg har lavet dem. Er der nogen problemer med denne metode?
Ideen er den at jeg har en div der skal være container for diverse ajax kald og det med nodeValue er noget fra et andet javascript, men jeg ved ikke hvad jeg skal skrive istedet for.
{"users":[ [1,"Administrator","La la la la","11-11-2007 00:00:00"], [2,"Super bruger","En super bruger har adgang til næsten alt på siden.","15-01-2008 12:41:20"], [5,"Bruger","En bruger har adgang til egne data","19-01-2008 21:53:50"], [7,"Besøgende","Besøgende har kun adgang til gennemlæsning og tilføjelse.","20-01-2008 02:13:18"] ]}
roenving >> Dit script i (03/04-2008 17:05:26) holder ikke. I IE returnerer 'document.getElementById("medlemstabel").firstChild' et TBODY-element, men i FF en textNode - nemlig linjebrudet efter <table ......> ;o)
Brug i stedet: document.getElementById("medlemstabel").getElementsByTagName("tbody")[0]
karl-koder >> De faldgruber, jeg omtalte tidligere, handler om et interface, hvor du gentagne gange skal oprette og nedlægge mange tabelrækker - og hvor disse har tilknyttet event handlers. I sådanne tilfælde skal de enkelte event handlers fjernes og null'es, inden elementerne fjernes og null'es.
Den slags løsninger vil jeg absolut ikke anbefale dig at kaste dig ud i, med mindre du er _meget_ stærk i objekt orienteret JavaScript og IE's elendige garbage collection. Så hellere bruge 'gammeldags' navigation med alm. sideskift :)
"Vil du mene at jeg skal droppe brugen af ajax og json til at vise data med" >> Det kommer helt anpå, hvad du vil. Til små ting, hvor du ikke skal oprette og nedlægge rigtig mange elementer, kan du roligt bruge Ajax - men komplekse applikationer bliver _meget_ komplekse med Ajax!
Derudover skal du jo tænke på, at indhold, du er interesseret i, at søgemaskinerne skal indeksere, ikke må vises med Ajax - for så finder søgemaskinerne det aldrig
Nej, så skal koden bygges op på en væsentlig anderledes måde. En forklaring på det kræver flere laaaange tutorials - og er derfor ikke egnet til en Eksperten-tråd
Det var så lidt, du hjalp mig jo en god del af vejen ;o)
Synes godt om
Ny brugerNybegynder
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.