nam: hasAttribute für IE mit prototype?

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

  1. 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. 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

      1. 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.

    2. 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

      1. 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

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. 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

    1. 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

      1. 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