hasAttribute für IE mit prototype?
nam
- javascript
Euch meinen Gruss
In einem Script benötige ich die hasAttribute()-Funktion gemäss DOM-Level-2, was der IE janicht unterstützt.
Deshalb habe ich mir folgende Krücke gebastelt:
var m=document.getElementsByTagName('foo');
for(var i=0; i<m.length; i++) {
if(!m[i].hasAttribute) { // we all love IE
m[i].hasAttribute=function(a) {
return (this.getAttribute(a)!='' && this.getAttribute(a)!=null)?true:false;
};
}
}
Meine Frage:
Kann ich das irgendwie auch so hinkriegen, dass ich am Anfang den Prototypen der DOM-Element-Instanzen um die Funktion hasAttribute() erweitere? Oder geht das nur bei Klassen wie Array und String?
Danke und Gruss,
Mathias
Hi,
Kann ich das irgendwie auch so hinkriegen, dass ich am Anfang den Prototypen der DOM-Element-Instanzen um die Funktion hasAttribute() erweitere?
das kann der IE (mal wieder) nicht. Du kannst Ersatz-Objekte wie z.B. DOM.Node erzeugen, die über diese Methode verfügen, und ihnen als erstes Argument die entsprechende Node übermitteln.
Cheatah
Hi,
Kann ich das irgendwie auch so hinkriegen, dass ich am Anfang den Prototypen der DOM-Element-Instanzen um die Funktion hasAttribute() erweitere?
das kann der IE (mal wieder) nicht.
Ueber HTC-Dateien kann man sich wohl einen Workaround basteln (analog zu http://www.browserland.org/scripts/eventtargetie/) - aber ob das "schoen" ist ...
MfG ChrisB
Hi
Ueber HTC-Dateien kann man sich wohl einen Workaround basteln (analog zu http://www.browserland.org/scripts/eventtargetie/) - aber ob das "schoen" ist ...
Das ist mir zu umständlich, zumal dann eine weitere Datei (.htc) geladen werden muss, was auch wieder Zeit braucht...
Danke für deine Antwort.
das kann der IE (mal wieder) nicht.
Hm, irgendwie wundert mich das auch nicht mehr.
Du kannst Ersatz-Objekte wie z.B. DOM.Node erzeugen, die über diese Methode verfügen, und ihnen als erstes Argument die entsprechende Node übermitteln.
Das hiesse dann wohl für jedes Element ein Ersatz-Objekt zu erstellen, also eine Schleife über alle Elemente laufen zu lassen.
Das produziert mir zu viel Overhead und den will ich ja genau vermeiden.
Cheatah
Danke für deine Antwort.
Gruss,
Mathias
Hi,
Du kannst Ersatz-Objekte wie z.B. DOM.Node erzeugen, die über diese Methode verfügen, und ihnen als erstes Argument die entsprechende Node übermitteln.
Das hiesse dann wohl für jedes Element ein Ersatz-Objekt zu erstellen, also eine Schleife über alle Elemente laufen zu lassen.
nein, ich dachte an ein Ausbrechen aus den bisherigen Design Patterns der Objektorientierung: Es existiert ein einziges ("statisches") Objekt, welches im Grunde nichts anderes tut, als die Funktionen zu kapseln, die Du statt der Methoden verwendest.
Cheatah
Hallo,
m[i].hasAttribute=function(a) {
return (this.getAttribute(a)!='' && this.getAttribute(a)!=null)?true:false;
};
Das kannst du einfacher ausdrücken:
~~~javascript
m[i].hasAttribute=function(a) {
return !!this.getAttribute(a);
};
Die doppelte Negation !! wandelt das Ergebnis von getAttribute() in einen entsprechenden booleschen Wert, der nur dann true ist, wenn dieses Ergebnis "truthy" ist, d.h. wenn das Attribut vorhanden und ihm auch ein Wert zugewiesen ist.
Gruß, Don P
Hi
Die doppelte Negation !! wandelt das Ergebnis von getAttribute() in einen entsprechenden booleschen Wert, der nur dann true ist, wenn dieses Ergebnis "truthy" ist
Cool, danke!
Damit kann ich ja gleich alle hasAttribute()s ersetzten und das Problem ist, wenn nicht gelöst, so mindestens umschifft.
Gruss,
Mathias
Hallo,
Cool, danke!
Damit kann ich ja gleich alle hasAttribute()s ersetzten und das Problem ist, wenn nicht gelöst, so mindestens umschifft.
Gern geschehen. Solche Probleme sind mir die liebsten, die sich bei näherem Hinsehen durch einen einfachen, geschickt gewählten Ausdruck umgehen oder gar lösen lassen :-).
Gruß, Don P