dem document - Objekt eine Methode hinzufügen
zipdrive
- javascript
Hallo, ich bin gerade dabei dem IE die DOM - Methode getElementsByTagNameNS beizubringen. Wie ich so munter tippte:
if (!document.getElementsByTagNameNS) {
document.prototype.getElementsByTagNameNS = function(prefix,name) {
return this.getElementsByTagName(prefix + ":" + name);
};
}
und anschließened testete, bemerkte ich, dass das so nicht geht.
Hat eine andere einen Vorschlag, wie man denn nun dem document - Object diese Methode beibringt?
MfG
Hallo zipdrive.
Hallo, ich bin gerade dabei dem IE die DOM - Methode getElementsByTagNameNS beizubringen. Wie ich so munter tippte:
if (!document.getElementsByTagNameNS) {
document.prototype.getElementsByTagNameNS = function(prefix,name) {
return this.getElementsByTagName(prefix + ":" + name);
};
}und anschließened testete, bemerkte ich, dass das so nicht geht.
Faustregel: kannst du ein Objekt nicht per „new Objektname“ „instantiieren“, so verfügt es über keine prototype–Eigenschaft und kann auch nicht über diese Methode erweitert werden.
Hat eine andere einen Vorschlag, wie man denn nun dem document - Object diese Methode beibringt?
Wie wäre es folgendermaßen?
if (!document.getElementsByTagNameNS) {
document.getElementsByTagNameNS = function(prefix, name) {
return this.getElementsByTagName(prefix + ":" + name);
};
}
Einen schönen Montag noch.
Gruß, Mathias
Wie wäre es folgendermaßen?
if (!document.getElementsByTagNameNS) {
document.getElementsByTagNameNS = function(prefix, name) {
return this.getElementsByTagName(prefix + ":" + name);
};
}
Ich will nur nochmal nachfragen, geht das wirklich so einfach? Hast du das getestet und funktioniert das bei jedem Browser, der über die Methode nicht verfügt?
Hallo zipdrive.
if (!document.getElementsByTagNameNS) {
document.getElementsByTagNameNS = function(prefix, name) {
return this.getElementsByTagName(prefix + ":" + name);
};
}
>
> Ich will nur nochmal nachfragen, geht das wirklich so einfach?
Ja. Du kannst praktisch jedem Objekt beliebig Eigenschaften und natürlich auch Methoden anhängen.
> Hast du das getestet …
Ja.
> … und funktioniert das bei jedem Browser, der über die Methode nicht verfügt?
Das kann ich natürlich nicht garantieren, da ich weder jeden Browser kenne noch über ihn verfüge.
Einen schönen Montag noch.
Gruß, Mathias
--
sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
„It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
[[HTML Design Constraints: Logical Markup](http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/HTMLConstraints.html)]
Ok danke erstmal. Eine Problem habe ich aber noch. Da ich nur dem document die Methode mitteile sind sie für die ChildNodes des document leider nicht verfügbar.
Z.B. bei sowas hier:
if (!document.getAttributeNS) {
document.getAttributeNS = function(prefix,name) { return this.getAttribute(prefix + ":" + name); };
}
Wenn ich bei einem Node nach meinNode.getAttributeNS("ljjv","value") meckert er, dass der Node nicht über die Methode verfügt.
MfG
Hallo zipdrive.
Ok danke erstmal. Eine Problem habe ich aber noch. Da ich nur dem document die Methode mitteile sind sie für die ChildNodes des document leider nicht verfügbar.
Ja, das ist der Nachteil dieser Methodik. Die angehängte Methode steht ausschließlich für dieses eine Objekt zur Verfügung.
Z.B. bei sowas hier:
if (!document.getAttributeNS) {
document.getAttributeNS = function(prefix,name) { return this.getAttribute(prefix + ":" + name); };
}
>
> Wenn ich bei einem Node nach meinNode.getAttributeNS("ljjv","value") meckert er, dass der Node nicht über die Methode verfügt.
Ohne [Element](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-745549614).prototype kommst du an dieser Stelle nicht weiter. Beachte aber hierzu [Tims Anmerkung](http://forum.de.selfhtml.org/archiv/2006/4/t127730/#m825038). Neben Safari ist auch der IE hier störrisch.
Einen schönen Montag noch.
Gruß, Mathias
--
sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
„It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
[[HTML Design Constraints: Logical Markup](http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/HTMLConstraints.html)]
Also ich hab mich mal bemüht die Methode getElementsByTagNameNS() für den IE umzusetzten, bzw auch für andere Browser, die die Methode nicht kennen.
if (!thisDocument.getElementsByTagNameNS) {
thisDocument.getElementsByTagNameNS = function(namespaceURI,name) {
var getPrefix = function(selectedNode,namespace) {
var foundPrefix = null;
var i = 0;
var childs = selectedNode.childNodes;
do {
if (childs[i].nodeType == 1) {
var nodeAttributes = childs[i].attributes;
if (nodeAttributes.length > 0) {
for (var j = 0; j < nodeAttributes.length; j++) {
if (nodeAttributes.item(j).nodeName == new RegExp("^xmlns[:a-z]*","g").exec(nodeAttributes.item(j).nodeName)) {
if (nodeAttributes.item(j).nodeValue == namespace) {
foundPrefix = new RegExp("^.*:([a-z]+)","g").exec(nodeAttributes.item(j).nodeName).$1;
break;
}
}
}
}
if (foundPrefix != null) { break; }
if (childs[i].childNodes && childs[i].childNodes.length > 0) {
foundPrefix = getPrefix(childs[i],namespace);
if (foundPrefix != null) { break; }
}
i++;
}
} while(childs[i] != undefined);
return foundPrefix;
};
var prefix = getPrefix(thisDocument.documentElement,namespaceURI);
return prefix != null ? this.getElementsByTagName(prefix + ":" + name) : prefix;
};
}
Leider hab ich noch keine Idee, wie ich die Methode allen Nodes zur Verfügung stellen kann.
Helft mir bitte!
Hallo,
Faustregel: kannst du ein Objekt nicht per „new Objektname“ „instantiieren“, so verfügt es über keine prototype–Eigenschaft und kann auch nicht über diese Methode erweitert werden.
Objekte lassen sich instantiieren, wenn sie Funktionen (Funktionsobjekte) sind.
Alle Funktionen lassen sich mit new instantiieren (ganz gleich, ob sie dem neu erzeugten Objekt dann Member über this anhängen).
Alle Objekte sind durch gewisse Konstruktorfunktionen erzeugt. Diese Funktion lässt sich jeweils durch die constructor-Eigenschaft in Erfahrung bringen (zumindest theoretisch).
Alle DOM-Knotenobjekte stammen von Konstruktoren ab, die nach den jeweiligen DOM-(HTML-)Interfaces benannt sind, z.B. Document, HTMLDocument, Node, NodeList, Text, HTMLElement usw.
Nicht alle Browser erlauben den Zugriff auf diese Konstruktoren und zeigen die Abstammung korrekt über die constructor-Eigenschaft an.
Die Konstruktoren haben, wie alle Function-Objekte, eine prototype-Eigenschaft, über die die prototypische Erweiterung möglich ist, die sich sofort auf alle Instanzen auswirkt.
Der Konstruktor für document ist Document bzw. HTMLDocument, Document.prototype bzw. HTMLDocument.prototype sind also erweiterbar. document.constructor sollte sinnigerweise auf HTMLDocument zeigen, tuts aber nur im Firefox.
document.constructor.prototype.neueMethode = func; wäre dann theoretisch das Schema bzw. direkt HTMLDocument.prototype.neueMethode.
Wenn man konkret eine Instanz mit Methoden nachrüsten will, so ist die prototypische Erweiterung natürlich inpraktikabel, da sie nicht von allen Browsern unterstützt wird. Außerdem gibts normalerweise sowieso nur eine (HTML)Document-Instanz in einem Dokument, daher kommt es auf das Gleiche heraus. (Wie es mit Dokumenten aussieht, die mit XMLHttpRequest oder DOM Load & Save nachgeladen werden, weiß ich nicht.)
Grüße,
Mathias
hi,
ich bin gerade dabei dem IE die DOM - Methode getElementsByTagNameNS beizubringen.
Hat eine andere einen Vorschlag, wie man denn nun dem document - Object diese Methode beibringt?
Zuerst eine vorsichtige Nachfrage: bist du sicher, daß "getElementsByTagNameNS" definiert ist? getElementsByTagName ist das durchaus. Aber der IE kann - wie übrigens jeder andere Browser - nur diejenigen Methoden kennen, die in _seiner_ JS-Bibliothek beschrieben sind. Du kannst nicht einfach mal so irgendwas, was du gern haben möchtest, hinshreiben, und erwarten, daß dein Browser das genau in dieser Schreibweise bereits kennt. Der IE kennt zwar etwas "mehr" als Opera oder Konqueror, aber das liegt daran, daß er eben auch das microsoftspezifische JScript versteht.
Grüße aus Berlin
Christoph S.
Hallo Christoph.
Zuerst eine vorsichtige Nachfrage: bist du sicher, daß "getElementsByTagNameNS" definiert ist?
Er kann es sein, da es das ist. Seit DOM Level 2.
Einen schönen Montag noch.
Gruß, Mathias
h,
Zuerst eine vorsichtige Nachfrage: bist du sicher, daß "getElementsByTagNameNS" definiert ist?
Er kann es sein, da es das ist. Seit DOM Level 2.
Schon, aber im IE gehört es nicht zu dem, was "definiert" ist - nicht alles, was ein Standard beschreibt, ist bekanntlich auch den Browsern zugänglich. Wenn man es dem IE verklickern will, gehts eben nicht auf dem direkten Weg. Übrigens scheint es so zu sein, daß auch der IE7 damit noch nichts anfangen kann. Kommt vielleicht noch.
Grüße aus Berlin
Christoph S.
hi,
Zuerst eine vorsichtige Nachfrage: bist du sicher, daß "getElementsByTagNameNS" definiert ist?
Er kann es sein, da es das ist. Seit DOM Level 2.Schon, aber im IE gehört es nicht zu dem, was "definiert" ist - nicht alles, was ein Standard beschreibt, ist bekanntlich auch den Browsern zugänglich.
Immer wieder interessant, wie du dich rauszuwinden versuchst, wenn du fachlich daneben lagst.
Wenn man es dem IE verklickern will, gehts eben nicht auf dem direkten Weg.
Genau deshalb solltest du den allerersten Satz des Eingangspostings vielleicht noch mal langsam lesen.
gruß,
wahsaga
Hallo,
document.prototype.getElementsByTagNameNS
Siehe mein anders Posting: Konstruktorfunktionen haben die prototype-Eigenschaften, irgendwelche Instanzen nicht. Von der Instanz zum Konstruktor kommt man über die constructor-Eigenschaft (zumindest theoretisch).
Die prototypische Erweiterung des document-Objektes ginge über HTMLdocument.prototype. Da IE das aber nicht unterstützt, reicht es hier, document einfach eine neue Methode anzuhängen und nicht den Umweg über den Prototyp zu nehmen.
Mathias