[dHTML] Custom functie aan eigen DOMElement

Pagina: 1
Acties:

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-01 16:11
Uit pure wanhoop een post van mij. Ik heb een stukje uit het script gepakt wat volgens mij relevant is, mocht er iemand meer nodig hebben, dan geef ik dat wel op request.

Het probleem is dat mijn eigen functies en variabelen niet meer herkent worden, nadat de objecten geladen/renderd zijn. Ik heb het vermoeden dat het ermee te maken heeft dat ik in de recursieve functie de childobject niet met een 'new' operator aanmaak.

De relevante code:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
// ..
this.getHTML = function(bSelfOnly)
{   this.element = document.createElement('dt'); // Maak nieuw element aan
    this.element.parentObj = this; // Maak een pointer voor later naar het 
            //dataobject op het DOMElement

    this.element.appendChild(
        document.createElement('a').appendChild(
            document.createTextNode(
                this.titel
            )
        )
    ); // Voeg een link toe, zoals ingeladen

    // De controls eraan toevoegen
    this.element.appendChild(this.getControlHTML());

    // Als er subelement zijn, nu die gaan toevoegen
    if (!bSelfOnly && (this.items.length > 0))
    {   oList = this.element.appendChild(
                    document.createElement('dl')
                );
        for (iInd in this.items)
        {
            // De reference naar het element opnieuw aanmaken 
            // om hem in de tree te vinden. Hier gaat het waarschijnlijk fout???
            this.items[iInd].element = oList.appendChild(
                    this.items[iInd].getHTML(
                        bSelfOnly
                    )
                );
                // Onderstaand maakt geen zichtbaar verschil (met/zonder)
                //this.items[iInd].element.parentObj = this.items[iInd];
        }
    }
    // Returnen
    return this.element;
}
// ..


Wat ik zelf nog kan bedenken is, om het nieuwe element niet te returnen maar in de eigen scope al aan zijn parent te appenden. Dat is niet helemaal wat ik wil eigenlijk, maar dat zal ik in ieder geval nog uit gaan proberen. Intussen ben ik hier al een middag mee bezig, dus zou erg blij zijn als iemand me hiermee kan helpen.

[e: even uitlijning aangepast]
Nog even een extra stukje met de aanroep e.d.:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
this.getControlHTML = function()
{
    oCtrlDiv    = document.createElement('div');

    oCtrlDiv.appendChild(
        document.createElement('a')
    ).appendChild(
        document.createTextNode('omhoog')
    ).parentNode.setAttribute(
        'onmousedown','alert(getParent(getEvtSrc(event), \'dt\').parentObj);'
    );
    
    return oCtrlDiv;
}
// De setattribute methode kan evt. wel vervangen worden door een mooie 
// oplossing, maar het werkt zo iig nu wel.

Dit geeft dus een alert met 'undefined' als resultaat. Als ik parentObj weg laat, dan krijg ik wel netjes een alert van het DOMElement.

[ Voor 14% gewijzigd door r0bert op 22-08-2006 17:03 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:00

crisp

Devver

Pixelated

setAttribute is niet bedoelt voor het setten van eventhandlers, dus daar moet je sowieso de DOM eventmethods voor gebruiken. Ongeacht dat het "zo wel werkt" (iig niet in elke browser) is het gewoon fout.

straks even verder kijken ;)

edit:
JavaScript:
1
this.items[iInd].getHTML()

is getHTML wel een method van items? Heb je dat ergens geprototyped? En zo ja:
JavaScript:
1
for (iInd in this.items)

dan moet je daar ook rekening houden met het feit dat je zo ook over de prototyped methods itereerd.

[ Voor 67% gewijzigd door crisp op 22-08-2006 22:24 ]

Intentionally left blank


  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-01 16:11
Ok, de methodes vervangen door attachEvent en addEventListener. Maakt helaas geen verschil, maar dan is het in ieder geval correct.

getHTML is een method van het type van de constructor van 'this' (objNavItem). this.items is een array van dezelfde objecten als this (weer objNavItem). De functie wordt goed aangeroepen, maar het toevoegen van attributen aan het DOMElement wil niet lukken.

Het lukt me wel om een attribuut toe te voegen met een string als waarde, maar niet een Object of Function of wat dan ook. Dus:
this.element.test = 'var'; is gewoon op te roepen erna
this.element.test = myFunc; wil maar niet werken.

Ik kan het hele zooitje wel online zetten als dat het duidelijker maakt?

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

r0bert schreef op dinsdag 22 augustus 2006 @ 23:56:
[...]
Het lukt me wel om een attribuut toe te voegen met een string als waarde, maar niet een Object of Function of wat dan ook. Dus:
this.element.test = 'var'; is gewoon op te roepen erna
this.element.test = myFunc; wil maar niet werken.
wat gebeurt er dan als je this.element.test(); opvraagt? (de functie zou dan gewoon uitgevoerd moeten worden)
Ik kan het hele zooitje wel online zetten als dat het duidelijker maakt?
Lijkt me wel handig :)

oprecht vertrouwen wordt nooit geschaad


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:00

crisp

Devver

Pixelated

attachEvent? bah, kutmodel :P (zeker geen volwaardig alternatief voor addEventListener - je gaat hopeloos de mist in met je scope)

maar een online testcase zou wellicht inderdaad beter zijn. Iets meer versimpeld zou nog beter zijn.

Intentionally left blank