18. januar 2008 - 10:49Der er
8 kommentarer og 1 løsning
OOP og events
Hej med jer. Jeg er igang med at lave en JS kalender som OOP, men er rendt ind i et problem. Når jeg opretter en dato, skal det være muligt at klikke på den, og have den som den valgte dato.
Mit problem er at finde ud af hvilken dato der er tale om. Når jeg opretter min tabel der viser kalenderen, gør jeg det med createElement, appendChild o.s.v:
var div = document.createElement("div"); div.id = "Div"+digit; div.innerHTML = digit; dateCell.appendChild(div);
hvor "digit" er dagen, fx 1.
Jeg skal gerne have en click listener på div objektet og jeg kan også godt lave det med addEventListener. Problemet er bare nu, at jeg kan kun se at jeg har klikket på en dato, men ikke hvilken (fordi jeg ikke kan finde ud af at sende argumenter med og er ikke 100% sikker på at det kan lade sig gøre)
Hvis jeg bruger: 1)addEventListener - kan jeg ikke få argumenter med 2)bruger jeg setAttribute("onclick","funcName('',''....)") - ryger min reference til objektet der er oprettet
Har i nogen gode ideer til hvordan det kan lade sig gøre, at fange hvilken div der er klikket på?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
DOM-events i OOP-kode er en ret kompliceret affære. Hvis man skal undgå memory leaks i IE, skal man være virkelig stærk i IE's særheder og analyse af komplekse reference sammenhænge i DOM/OOP.
I princippet kan du:
function MyObj(digit) { var div = document.createElement("div"); var me = this; var sClickVar_1 = "En variabel"; var sClickVar_2 = "En anden variabel"; div.id = "Div"+digit; div.appendChild( document.createTextNode(digit) ); dateCell.appendChild(div); if (div.attachEvent) div.attachEvent("onclick", function(){ me.myMethod(div, sClickVar_1, sClickVar_2) }); else if (div.addEventListener) div.addEventListener("click", function(){ me.myMethod(div, sClickVar_1, sClickVar_2) }); else div.onclick = function(){ me.myMethod(div, sClickVar_1, sClickVar_2) }; return this; } MyObj.prototype.myMethod = function(oDiv, sVar_1, sVar_2) { alert("Divets ID: " + oDiv.getAttribute("id")); alert("Første variabel: " + sVar_1); alert("Anden variabel: " + sVar_2); }
var oObj = dateCell = null; window.onload = function() { dateCell = document.getElementById("dateCell"); oObj = new MyObj(1); }
- men ... i teorien er der ikke forskel på teori og praksis. I praksis er det noget helt andet! Der er masser af faldgruber i DOM/OOP!
Husk dog altid at vente med at sætte event handlers, til elementet er indsat i dokumentet. Ellers opretter IE et lokalt script scope i hukommelsen. Når elementet indsættes i dokumentet, oprettes et scope i forhold til dokumentet - men det gamle fjernes ikke fra hukommelsen. Det resulterer i memory leaks, som kan bygge voldomt op over tid (gentagne handlinger).
Metoden, jeg viser ovenfor vil oprette en cirkulær DOM-reference, som også kan resultere i memory leaks - men at kode sig udenom, er lidt af en kunst. Her er erfaring og Windows Task Manager vigtige værktøjer :)
Åh... så meget for at lige bikse en kalender sammen... Jeg har fundet lidt forskelligt omkring mem. leaks som jeg lige skal have sat mig ind i, så jeg lader spørgsmålet stå åben et par dage, jeg er sikker på der kommer nogen spørgsmål i den forbindelse...
hvis nogen skulle være interesseret. Jeg må indrømme jeg overhovet ikke havde tænkt over mem. leaks i forbindelse med JS før, så tak for påpegelsen... (på den anden side, var verdenen lige lidt nemmere hvis du ikke havde nævnt det ;)) Ligger i et svar?
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.