Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JS] Object.prototype werkt alleen in Firefox

Pagina: 1
Acties:

  • Blaise
  • Registratie: Juni 2001
  • Niet online
Ik ben bezig met XMLHTTPRequest, en gebruik daarbij XML als dataformat.

Voorbeeld van mijn XML:
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<login>
    <message>Het wachtwoord is niet correct.</message>
    <field>password</field>
    <action>retry</action>
    <newticket>c2Ntc2-12NHVw2t/e9TfAAYc0OE</newticket>
    <triesleft>U heeft nog 5 loginpogingen over.</triesleft>
</login>


Het irriteert mij dat ik een enorm lange constructie als xml.getElementsByTagName('action')[0].firstChild.nodeValue moet gebruiken om een simpele waarde te krijgen. Ik heb gekeken hoe dat korter kon, en ben toen hierop gekomen.

JavaScript:
1
2
3
4
5
6
7
8
Object.prototype.xmlValue = function(element, index) {
    if (!index) index = 0;
    if (this.getElementsByTagName(element).length) {
        return this.getElementsByTagName(element)[index].firstChild.nodeValue;
    } else {
        return false;
    }
}


Met mijn xmlValue kan ik dan het veel kortere xml.xmlValue('action') doen, en heb ik ook nog eens de mogelijkheid om xmlValue later te kunnen uitbreiden met bijv het strippen van whitespace, om het returnen van whitespace nodes te voorkomen.

Helaas werkt het nu alleen in Firefox. Ik dacht dat deze manier werd ondersteund door alle moderne browsers. Wat doe ik verkeerd?

  • coubertin119
  • Registratie: Augustus 2002
  • Laatst online: 10:34
Het kan misschien dom klinken, maar, als je nu die functie xmlValue als method op je xml-object zet. Je kan dan de tree toch ook doorlopen, omdat je getElementsByTagName daarop afroept. Het Object-object behandelen als een doodgewoon object is nogal complex gedrag neem ik aan, daarom dat het niet mogelijk is dat te extenden.

Als het echt nergens op slaat, gelieve het dan te negeren, maar ik denk echt dat het probleem te moeilijk wordt gemaakt :).

Skat! Skat! Skat!


  • Blaise
  • Registratie: Juni 2001
  • Niet online
Bedoel je dit? Ik dacht waarschijnlijk te ingewikkeld, want dit werkt nu. thanks :)

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
xmlValue = function(element, index) { 
    if (!index) index = 0; 
    if (this.getElementsByTagName(element).length) { 
        return this.getElementsByTagName(element)[index].firstChild.nodeValue; 
    } else { 
        return false; 
    } 
}

xml.xmlValue = xmlValue;
xml.xmlValue('action'); // = retry


Wat ik me nog wel afvraag is dit: is het mogelijk om regel 11 (en evt regel 1) zó aan te passen dat regel 10 weg kan? Of wil ik dan weer te ingewikkeld doen?

  • user109731
  • Registratie: Maart 2004
  • Niet online
Blaise schreef op zaterdag 08 september 2007 @ 18:13:

Wat ik me nog wel afvraag is dit: is het mogelijk om regel 11 (en evt regel 1) zó aan te passen dat regel 10 weg kan? Of wil ik dan weer te ingewikkeld doen?
Dit is al korter:
JavaScript:
1
2
3
4
5
6
7
8
9
xml.xmlValue = function(element, index) {
    if (!index) index = 0; 
    if (this.getElementsByTagName(element).length) { 
        return this.getElementsByTagName(element)[index].firstChild.nodeValue; 
    } else { 
        return false; 
    }  
}
xml.xmlValue('action'); // = retry

Als je 'm wilt prototypen kun je iets als XMLDocument.prototype.xmlValue = function() {} gebruiken...

Trouwens: Object.prototype is verboten :)

[ Voor 7% gewijzigd door user109731 op 08-09-2007 19:44 ]


  • Blaise
  • Registratie: Juni 2001
  • Niet online
JanDM schreef op zaterdag 08 september 2007 @ 19:30:
[...]

Dat is toch gewoon zo?
JavaScript:
1
2
3
4
5
6
7
8
9
xml.xmlValue = function(element, index) {
    if (!index) index = 0; 
    if (this.getElementsByTagName(element).length) { 
        return this.getElementsByTagName(element)[index].firstChild.nodeValue; 
    } else { 
        return false; 
    }  
}
xml.xmlValue('action'); // = retry

Of bedoel je wat anders?
Ik twijfelde even aan de efficientie van mijn eigen code (ben nog onwennig met javascript). Ik bedacht dat het toekennen van de method aan een object, en het gebruiken van de method, misschien wel in één regel kon.

De voorwaarde is dat ik xmlValue op alle HTML/XML objecten kan toepassen als een soort van mini framework, niet specifiek op alleen mijn xml object.
Oei! Dat zullen we niet meer doen.

[ Voor 18% gewijzigd door Blaise op 08-09-2007 19:49 ]


  • user109731
  • Registratie: Maart 2004
  • Niet online
Blaise schreef op zaterdag 08 september 2007 @ 19:47:
[...]

Ik twijfelde even aan de efficientie van mijn eigen code (ben nog onwennig met javascript). Ik bedacht dat het toekennen van de method aan een object, en het gebruiken van de method, misschien wel in één regel kon.
Kan, maar is niet echt leesbaar (en niet/verwaarloosbaar efficienter):
JavaScript:
1
2
3
4
(HTMLBodyElement.prototype.test = function(s) {
    alert(s);
})('joo');
document.body.test('joow');
De voorwaarde is dat ik xmlValue op alle HTML/XML objecten kan toepassen als een soort van mini framework, niet specifiek op alleen mijn xml object.
Doe even alert(xml). Dan zie je het type staan (XMLDocument ofzo?), en dat object kun je dan prototypen (zoals ik hierboven met HTMLBodyElement doe, en in de edit van de vorige post :)

Moet dit ook in IE gaan werken? Ik vraag me af of je deze objecten daar kan prototypen, dacht het niet...

  • Blaise
  • Registratie: Juni 2001
  • Niet online
Firefox zegt "[Object XMLDocument]", IE7 zegt "object" (maar DOM functies werken wel) en Opera zegt "[object document]". Het moet in al deze moderne browsers werken :)

Ik zie net dat de oplossing van [url=#28698217]mijn tweede post[/url] toch niet werkt in IE omdat mijn testcase niet overeenkwam met de realiteit. In de testcase testte ik op de gewone DOM i.p.v. een XML DOM. In Opera/Firefox werkt het wel. Is mijn conclusie dan juist als ik zeg dat die twee verschillen en dat IE problemen heeft met het toevoegen van methods op een XML DOM?
Kan, maar is niet echt leesbaar (en niet/verwaarloosbaar efficienter):
Volgens mij heb ik je in de war gebracht bij mijn tweede post door op die plek de functie xmlValue te definiëren. Die staat bij mij in een ander bestand, niet in de onreadystate callback functie. Als je wil bekijken hoe de hele constructie in elkaar zit kan dat hier: http://83.98.245.150/SPCMS/cms/

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Blaise schreef op zaterdag 08 september 2007 @ 21:03:
Firefox zegt "[Object XMLDocument]", IE7 zegt "object" (maar DOM functies werken wel) en Opera zegt "[object document]". Het moet in al deze moderne browsers werken :)
IE7 is technisch gezien dan ook geen moderne browser ;)
Ik zie net dat de oplossing van [url=#28698217]mijn tweede post[/url] toch niet werkt in IE omdat mijn testcase niet overeenkwam met de realiteit. In de testcase testte ik op de gewone DOM i.p.v. een XML DOM. In Opera/Firefox werkt het wel. Is mijn conclusie dan juist als ik zeg dat die twee verschillen en dat IE problemen heeft met het toevoegen van methods op een XML DOM?
IE ondersteund inderdaad niet de native ECMAScript-bindings zoals gedefinieerd in de DOM specificaties. In fact: de meeste interfaces zijn in IE COM-implementaties en die ondersteunen geen expando's - zo kan je het 'native' XMLHttpRequest object ook niet prototypen net zo min als andere interface objecten zoals ActiveX objecten...

Uiteindelijk kan je natuurlijk wel alle Elementen zelf extenden, iets dat prototype bijvoorbeeld doet voor bepaalde handige methods, maar de kosten qua performance en memory wegen vaak niet op tegen de 'lelijkheid' (is ook maar een perceptie) van een ordinaire functiecall.

Intentionally left blank

Pagina: 1