2 Stimmen

Was passiert, wenn man IHTMLElement5/6 (für IE8/9) in IE6/7 verwendet? Wechselt es zum Verhalten von IHTMLElement?

Grundsätzlich sind IHTMLElement5 und IHTMLElement6 alle erweiterten Schnittstellen für das Haupt-IHTMLElement gemäß den untenstehenden 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 + ihre eigenen neuen Elemente, Eigenschaften usw. Einige der Elemente (zum Beispiel .getAttribute) haben jedoch denselben Namen, wurden aber aktualisiert. Meine Frage ist also, 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 fehlschlagen und als Null/Nothing bleiben, wenn ich es setze, oder ist mshtml.dll intelligent genug, um zu erkennen, was passiert, und wechselt standardmäßig zum Verhalten von IHTMLElement4 (eigentlich IHTMLElement)?

Nur zur Klarstellung des letzten Satzes in Klammern, .getAttribute wurde in IHTMLElement hinzugefügt und in IHTMLElement5 und IHTMLElement6 aktualisiert - daher würde ich erwarten, dass das Verhalten für jemanden, der nur IE6 installiert hat, auf IHTMLElement (nicht IHTMLElement4) zurückfällt - und falls dies nicht geschieht, erwarte ich, dass mein Code abstürzt. Kurz gesagt, meine Frage ist, was genau passieren wird?

Gerade jetzt, weil ich verrückte Angst habe, deklariere ich alles einfach 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 etwas als IHTMLElement6 deklarieren können, damit ich die aktualisierten Methoden nutzen kann, die zwischen IHTMLElement und IHTMLElement6 denselben Namen haben (wie z.B. .getAttribute). Auf diese Weise wird bei IE9-Benutzern die Version von .getAttribute von IHTMLElement6 genutzt, während gleichzeitig die Version von .getAttribute von IHTMLElement für (sagen wir mal) IE6-Benutzer ohne Unterbrechung meines Codes funktioniert - hier kommt meine Frage ins Spiel, wenn ein IHTMLElement6-Objekt verwendet wird, obwohl es eine IE9-Schnittstelle ist, wird die Version von .getAttribute von IHTMLElement (IE4-Schnittstelle) eintreten/funktionieren oder erhalte ich eine Nullverweis-Ausnahme oder einen anderen Laufzeitfehler? Danke an alle.

Je mehr Antworten, desto besser, auch wenn es nur eine Meinung oder ein Rätsel ist, möchte ich Sie trotzdem ermutigen zu kommentieren und uns wissen zu lassen, 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 haben keine Chance, IHTMLElement6.getAttribute() aufzurufen, da Sie nicht in der Lage sein werden, eine gültige IHTMLElement6-Referenz zu erhalten.

Wenn das zutrifft, dann scheint das, was Sie bereits tun (die Verwendung von IHTMLElement), der richtige Weg zu sein.

UPDATE: Meine Vermutung war richtig. Ich habe eine WinForms-App geschrieben, die die Version von mshtml.dll verwendet, 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 die gleiche Umwandlung fehl:

System.InvalidCastException: COM-Objekt vom Typ 'mshtml.HTMLImgClass' konnte nicht in den Schnittstellentyp 'mshtml.IHTMLElement6' umgewandelt werden. Dieser Vorgang ist fehlgeschlagen, weil der Aufruf von QueryInterface auf dem COM-Komponent für die Schnittstelle mit der IID '{305106F8-98B5-11CF-BB82-00AA00BDCE0B}' aufgrund des folgenden Fehlers fehlgeschlagen ist: Keine derartige Schnittstelle unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE)).

0voto

Abhidev Punkte 6773

Wenn Sie ältere Browser wie IE6 unterstützen, wird .getAttribute gemäß der Spezifikation fehlschlagen und im JS auf IE6 einen Fehler auslösen. Um dies zu verhindern, müssen Sie so vorgehen, dass, wenn der Code fehlschlägt, er still fehlschlägt.

Also, überall dort, wo Sie .getAttribute verwendet haben, setzen Sie einfach eine if-Bedingung, um zu überprüfen, ob diese Eigenschaft vorhanden ist. Falls 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