2 Stimmen

Was passiert, wenn IHTMLElement5/6 (für IE8/9) in IE6/7 verwendet wird? Wird es sich auf das Verhalten von IHTMLElement umleiten?

Grundsätzlich handelt es sich bei IHTMLElement5 und IHTMLElement6 um erweiterte Schnittstellen für das Haupt-IHTMLElement gemäß der folgenden Versionsregeln:

IHTMLElement    IE4
IHTMLElement2   IE5
IHTMLElement3   IE5.5
IHTMLElement4   IE6
IHTMLElement5   IE8
IHTMLElement6   IE9

Natürlich enthält jede neue erweiterte Schnittstelle die alten Elemente sowie ihre eigenen neuen Elemente, Eigenschaften usw. Einige der Elemente (zum Beispiel .getAttribute) haben jedoch den gleichen Namen, wurden jedoch aktualisiert. Also lautet meine Frage: Wenn ich (sagen wir) IHTMLElement6 verwende, um mein HTML-Element zu deklarieren und den Code auf einem Client ausführe, auf dem nur IE6 installiert ist, wann wird mein Objekt einfach scheitern und als Null/Nothing bleiben, wenn ich es setze, oder ist mshtml.dll schlau genug, um zu erkennen, was passiert, und wie im Verhalten von IHTMLElement4 (eigentlich IHTMLElement) standardmäßig umzuschalten?

Um die letzte Aussage in Klammern zu verdeutlichen, wurde .getAttribute in IHTMLElement hinzugefügt und in IHTMLElement5 und IHTMLElement6 aktualisiert - also, wenn jemand nur IE6 installiert hat, würde ich erwarten, dass sich das Verhalten auf IHTMLElement (nicht IHTMLElement4) zurücksetzt - und wenn das nicht der Fall ist, dann erwarte ich, dass mein Code abstürzt. Im Grunde genommen lautet meine Frage, was genau passieren wird?

Derzeit deklariere ich aus Angst wie verrückt alles als IHTMLElement, irgendwelche Ideen?

Danke.

Zusammenfassung der Frage (lesen, wenn notwendig, nur eine erneute Klarstellung für diejenigen, die sie benötigen): Ich möchte im Grunde genommen etwas als IHTMLElement6 deklarieren können, um die aktualisierten Methoden nutzen zu können, die denselben Namen zwischen IHTMLElement und IHTMLElement6 haben (wie z.B. .getAttribute). Auf diese Weise wird auf IE9-Benutzern die Version von .getAttribute von IHTMLElement6 genutzt, während gleichzeitig die Version von .getAttribute von IHTMLElement für (sagen wir) IE6-Benutzer funktioniert, ohne meinen Code zu brechen - hier kommt meine Frage ins Spiel: Wenn ich ein IHTMLElement6-Objekt verwende, auch wenn es eine IE9-Schnittstelle ist, wird dann die Version von .getAttribute von IHTMLElement (IE4-Schnittstelle) aktiviert/arbeiten oder erhalte ich eine Nullverweis-Ausnahme oder einen anderen Laufzeitfehler? Danke an alle.

Je mehr Antworten, desto besser, auch wenn es nur Ihre Meinung ist und Sie es nicht als Tatsache wissen, möchte ich Sie dennoch ermutigen, zu kommentieren und dabei mitzuteilen, ob Sie dies als Tatsache wissen oder ob es nur eine Meinung/Vermutung usw. ist. Danke.

4voto

Michael Liu Punkte 48128

Ich vermute, dass in älteren Versionen von IE, die IHTMLElement6 nicht unterstützen, das Umwandeln eines DOM-Elements in IHTMLElement6 mit einer InvalidCastException fehlschlagen wird. Sie werden keine Möglichkeit haben, IHTMLElement6.getAttribute() aufzurufen, da Sie erst gar keine gültige IHTMLElement6-Referenz erhalten werden.

Wenn dies korrekt ist, dann scheint das, was Sie bereits tun (die Verwendung von IHTMLElement), die richtige Vorgehensweise zu sein.

UPDATE: Meine Vermutung hat sich bestätigt. Ich habe eine WinForms-App geschrieben, die auf die Version der mshtml.dll verweist, die mit IE9 geliefert wird. Auf einem System mit IE9 kann die App erfolgreich ein -Element in IHTMLElement6 umwandeln. Aber auf einem System mit IE8 schlägt derselbe Cast fehl:

System.InvalidCastException: Konnte das COM-Objekt des Typs 'mshtml.HTMLImgClass' nicht in den Schnittstellentyp 'mshtml.IHTMLElement6' umwandeln. Dieser Vorgang schlug fehl, weil der QueryInterface-Aufruf an das COM-Objekt für die Schnittstelle mit IID '{305106F8-98B5-11CF-BB82-00AA00BDCE0B}' aufgrund des folgenden Fehlers fehlschlug: Keine derartige Schnittstelle unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE)).

0voto

Abhidev Punkte 6773

Wenn Sie ältere Browser wie den IE6 unterstützen, wird gemäß der Spezifikation .getAttribute fehlschlagen und im JS auf IE6 einen Fehler verursachen. Um dies zu vermeiden, müssen Sie so vorgehen, dass im Falle eines Fehlers der Code still fehlschlägt.

Überall dort, wo Sie .getAttribute verwendet haben, setzen Sie einfach eine If-Bedingung, ob diese Eigenschaft vorhanden ist. Wenn sie nicht vorhanden ist, verwenden Sie die ältere Eigenschaft, d.h. .getAttributeNode, andernfalls verwenden Sie .getAttribute

Zum Beispiel

if(obj.getAttribute){
   return obj.getAttribute;
}else{
   return obj.getAttributeNode;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X