Toon posts:

[JS] "samengestelde" onclick i.c.m. createElement

Pagina: 1
Acties:

Verwijderd

Topicstarter
In navolging van mijn eerdere topic over prototyping (ik snap het nu :P) het volgende. Ik heb deze code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function MozDatePicker( _htmlElement ) {
    this.htmlElement = _htmlElement;
    this.writeDatePicker();
}

MozDatePicker.prototype = {
    writeDatePicker:function() {
        var x = document.createElement( 'img' );
        x.setAttribute( 'src' , 'img/datepicker.gif' );
        x.onclick = new Function( this.htmlElement + '.popUp()' );
        document.body.appendChild( x );
    },
    popUp:function() {
        alert( 'blaat' );
    }
}

Wat de bedoeling is: ik maak ergens in de pagina een "datePicker1 = new MozDatePicker( 'datePicker1' );". Deze zet een plaatje neer ("writeDatePicker()") wat als erop geklikt wordt de functie popUp() uit zou moeten voeren. Hij moet dan dus "datePicker1.popUp()" uitvoeren, vandaar "this.htmlElement + '.popUp()'" in de code.

Dit werkt prima in Firefox, maar wil voor geen meter in IE, wat ik ook probeer. Het gaat in zoverre goed dat 'ie de onclick wel goed zet; als ik er "x.onclick = new Function( 'alert(\'blaat\')' );" van maak geeft 'ie gewoon een alert, maar de "samengestelde" functie heeft er dus geen zin in.

Wat ik wil moet kunnen zou je denken, aangezien het in Firefox prima werkt. In principe kan ik geen andere manier vinden om dit te bereiken dan zo, want het geheel moet wel dynamisch zijn enzo uiteraard.

[ Voor 44% gewijzigd door Verwijderd op 14-04-2005 19:08 ]


  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Dat komt omdat je nu .popUp() roept tegen het htmlElement attribuut van een MozDatePicker object ipv tegen het object zelf. In de onclick methode zul je dus een referentie naar het juiste object moeten zien te krijgen en daar .popUp() tegen roepen (note dat this in de onclick functie niet naar het MozDatePicker object wijst, maar naar het html element waar je op klikt). Je zou het als volgt op kunnen lossen:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var datePickers = new Array();

function MozDatePicker( _htmlElement ) {
    this.htmlElement = _htmlElement;
    datePickers[_htmlElement] = this;

    this.writeDatePicker();
}

MozDatePicker.prototype = {
    writeDatePicker:function() {
        var x = document.createElement( 'img' );
        x.setAttribute( 'src' , 'img/datepicker.gif' );

        var id = this.htmlElement;
        x.onclick = function()
        {
            datePickers[id].popUp();
        }

        document.body.appendChild( x );
    },
    popUp:function() {
        alert( 'blaat' );
    }
}



Alle dataPickers worden nu in een array opgeslagen, en kunnen opgehaald worden met hun id (uniek id naar html element).

Zo krijg ik in zowel IE als FF netjes "blaat" op mn scherm. ;)

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

Doe de onclick bv zo:
code:
1
2
3
4
var self = this;
x.onclick = function() {
   self.popUp();
}


In de onclick handler verwijst "this" helaas naar window, maar door de scope te "vangen" en die zo te gebruiken binnen die inline handler (closure) kan je er toch bijkomen. Dan heb je this.htmlElement ook niet meer nodig. Oo wordt namelijk weer stukken leuker als je niet met bergen variabelenamen of arrays met pointers hoeft te werken :)

[edit]

@Amras; dat kan idd ook. Maar dan heb je dus wel die globale array. Is maar net wat je wil.

[ Voor 14% gewijzigd door Clay op 14-04-2005 19:31 ]

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Clay schreef op donderdag 14 april 2005 @ 19:29:
Doe de onclick bv zo:
code:
1
2
3
4
var self = this;
x.onclick = function() {
   self.popUp();
}


In de onclick handler verwijst "this" helaas naar window, maar door de scope te "vangen" en die zo te gebruiken binnen die inline handler (closure) kan je er toch bijkomen. Dan heb je this.htmlElement ook niet meer nodig. Oo wordt namelijk weer stukken leuker als je niet met bergen variabelenamen of arrays met pointers hoeft te werken :)

[edit]

@Amras; dat kan idd ook. Maar dan heb je dus wel die globale array. Is maar net wat je wil.
Ow, das ook een nette. :)

Ik doe eigenlijk precies hetzelfde alleen dan met het id en heb dus een extra array nodig. Ach ja, kan de TS kiezen. :)

Verwijderd

Topicstarter
Ik denk dat ik voor optie twee ga (beide bedankt voor de moeite), al moet ik alles eerst nog eens goed doorlezen. Ik ben alles behalve een goeroe op dit gebied en wil wel graag weten wat ik doe voordat ik ga copy/pasten. :)