Ik heb hier een probleempje met eventhandlers in mn JScript code, op 1 of andere manier lekken ze geheugen.
Allereerst zal ik uitleggen wat ik gemaakt en geprobeerd heb. Waar het fout gaat is hier:
Voor de duidelijkheid zal ik ook nog een stuk van het object Div posten (zijn allemaal get's en set's maar het scheelt een hoop code):
Ik heb hier voor this.tilesCountHor en this.tilesCountVer beide de waarde 13 genomen en zo worden er 169 topTiles gemaakt. Als ik nu mn page refresh in
IE dan komt er 40kb bij aan geheugen en dat wil ik natuurlijk niet. Nu heb ik het een en ander geprobeerd, ik vervang hier de eventhandler in:
Resultaat: lekt 40kb per refresh
Resultaat: lekt niet
Resultaat: lekt niet
Het irriteert me vooral omdat ik nu op een andere manier moet coden en omdat ik niet begrijp waarom het nu fout gaat (doe het vaker op deze manier en
heb nooit problemen). Het is ook vervelend om 10 regels code in een new Function(..) te moeten gooien. Verder heeft een maat van me 1000 DIVs op het
scherm getoverd met handlers eraan en die had nergens last van.
Kan iemand me hiermee helpen? Ik ben al een aantal uur hiermee aan het tobben. Ik hoop dat het zo voldoende duidelijk is...
Allereerst zal ik uitleggen wat ik gemaakt en geprobeerd heb. Waar het fout gaat is hier:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| // this.tilesCountHor is het aantal tiles in horizontale richting for(var i = 0; i < this.tilesCountHor; i++) { for(var j = 0; j < this.tilesCountVer; j++) { // Maak een tile en positioneer hem var topTile = new Div(); topTile.setID(this.tilesTop.length); topTile.setBounds(i * 17 + 1, j * 17 + 1, 16, 16); topTile.setCursor("hand"); // Hier lekt ie geheugen! topTile.div.onclick = function() { alert("HOI"); } this.toplayer.add(topTile.div); } } |
Voor de duidelijkheid zal ik ook nog een stuk van het object Div posten (zijn allemaal get's en set's maar het scheelt een hoop code):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| function Div() { this.div = document.createElement("DIV"); this.div.style.position = "absolute"; } Div.prototype.setBounds = function(x, y, w, h) { with(this.div.style) { left = x; top = y; width = w; height = h; } } ... etc ... |
Ik heb hier voor this.tilesCountHor en this.tilesCountVer beide de waarde 13 genomen en zo worden er 169 topTiles gemaakt. Als ik nu mn page refresh in
IE dan komt er 40kb bij aan geheugen en dat wil ik natuurlijk niet. Nu heb ik het een en ander geprobeerd, ik vervang hier de eventhandler in:
JavaScript:
1
2
3
| topTile.div.onclick = function() { // alert("HOI"); } |
Resultaat: lekt 40kb per refresh
JavaScript:
1
| topTile.div.onclick = alert; |
Resultaat: lekt niet
JavaScript:
1
2
| var mouseClickFunc = new Function("alert('hoi')"); topTile.div.onclick = mouseClickFunc; |
Resultaat: lekt niet
Het irriteert me vooral omdat ik nu op een andere manier moet coden en omdat ik niet begrijp waarom het nu fout gaat (doe het vaker op deze manier en
heb nooit problemen). Het is ook vervelend om 10 regels code in een new Function(..) te moeten gooien. Verder heeft een maat van me 1000 DIVs op het
scherm getoverd met handlers eraan en die had nergens last van.
Kan iemand me hiermee helpen? Ik ben al een aantal uur hiermee aan het tobben. Ik hoop dat het zo voldoende duidelijk is...
[ Voor 4% gewijzigd door Amras op 18-08-2003 17:15 ]