Avatar billede idiotbarn Nybegynder
18. januar 2008 - 10:49 Der 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å?
Avatar billede w13 Novice
18. januar 2008 - 17:31 #1
Hvad med:

elementet.onclick=function(){
funcName('',''...)
}
Avatar billede olebole Juniormester
18. januar 2008 - 20:15 #2
<ole>

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  :)

/mvh
</bole>
Avatar billede idiotbarn Nybegynder
22. januar 2008 - 09:13 #3
Å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...
Avatar billede olebole Juniormester
22. januar 2008 - 10:34 #4
En god webkode er cirka ligeså let at bikse sammen som en god sportsvogn. Webkode er et fag  ;o)
Avatar billede idiotbarn Nybegynder
29. januar 2008 - 13:23 #5
He ja... men "ham her har kun programmeret 1/4 af den tid du har, hvorfor kan han blive hurtigere færdig end du kan?" ;)

Jeg har kigget en del rundt og har fundet flg:
http://joshdavis.wordpress.com/2007/04/23/more-javascript-event-listener-memory-leak-prevention/
http://www.outofhanwell.com/ieleak/index.php?title=Main_Page

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?
Avatar billede w13 Novice
29. januar 2008 - 13:44 #6
Okidoke!
Avatar billede w13 Novice
29. januar 2008 - 13:47 #7
=)
Avatar billede idiotbarn Nybegynder
18. juli 2008 - 12:22 #8
Ole har ikke givet et svar endnu, så han må gå glip af hele 15 point (gisp!)  ;)
Ihvertfald mange tak for hjælpen
Avatar billede w13 Novice
18. juli 2008 - 12:43 #9
Tak for point! :)
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