webentwicklung-frage-antwort-db.com.de

Emulieren Sie IE7 für IE8, aber nicht für IE9 mit "X-UA-kompatibel".

Ich habe eine Website, die von der Vektorzeichnung abhängig ist. Für Internet Explorer verwende ich VML und für andere Browser verwende ich SVG . IE8 hat jedoch keine Unterstützung denn weder ohne auf den IE7-Modus zurückzugreifen, der VML hat.

Daher füge ich <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> hinzu.

Das Problem (naja, eigentlich eine gute Sache) ist, dass der IE9 jetzt Unterstützung für SVG bietet. Ich möchte nicht, dass er auf den IE7-Modus zurückgreift, der eine viel schlechtere Leistung und Kompatibilität aufweist. Wie sage ich nur IE8, auf den IE7-Modus zurückzugreifen, IE9 jedoch im IE9-Modus bleiben?

Im Moment mache ich eine serverseitige Überprüfung des Agenten, ob die EmulateIE7-Zeichenfolge in den Kopf eingefügt werden soll oder nicht. Ich möchte dies jedoch so weit wie möglich vermeiden.

42
Urjan

Ich hatte gerade ein Theaterstück und fand folgende Werke für mich:

<meta http-equiv="X-UA-Compatible" content="IE=7,IE=9" >

Das ist mit einem Komma kein Semikolon!

Ich habe mir die Spezifikation nicht angesehen, aber das Format ähnelt content = "IE = 7, Chrome = 1", das für Chrome Frame funktioniert. Ich fand auch, dass content = "IE = 7,9" funktioniert, aber ich vermute, dass das Format nicht korrekt ist.

Bearbeiten:

Hüten Sie sich vor einem ernsthaften Problem, wenn sich Ihre Seite in einem Iframe befindet. Wenn Sie das Obige in einer gerahmten Seite verwenden, auf der sich der übergeordnete Modus im any-Modus befindet, der weniger als der IE9-Strikt ist, wird IE9 auf den IE8-Modus zurückgesetzt (ignoriert die IE = 7-Anforderung!). Alle bekannten Problemumgehungen sind willkommen :) Ist möglicherweise für IE11 nicht relevant.

Das Obige scheint ein Nebeneffekt der von design entworfenen Funktion zu sein, dass iframes (und ich vermute Frames) entweder alle im IE9-Modus sind oder alle weniger als der IE9-Modus. Man kann niemals IE9-Frames mit <IE9-Frames mischen, siehe MS-Ausgaben # 599022 und # 635648 .

Edit 2:

Beachten Sie, dass der IE11 nur "IE = Edge" (nicht IE = 11) unterstützt und dass die Verwendung von IE = Edge erhebliche Auswirkungen auf die IE Funktionalität (einschließlich des Benutzeragenten) hat.

Edit 3:

Edit 4:

X-UA-Compatible wurde aus dem Microsoft Edge-Browser entfernt. Nur der Internet Explorer verfügt über die Kompatibilitätsmodi. Beachten Sie, dass Sie, wenn Sie das WebView in einer App unter Windows Phone 10 verwenden, immer noch IE11 (nicht Edge) verwenden.

Aus verschiedenen Gründen können Sie sich nicht darauf verlassen, dass der Benutzeragent Ihnen den korrekten Kompatibilitätsgrad angibt. Verwenden Sie stattdessen document.documentMode aus JavaScript.

41
robocat

Der von jemand anderem erwähnte duale Modus sollte funktionieren (funktioniert aber nicht wie von Microsoft gezeigt ) und ist das, was ich am nächsten sehe. ' siehe MS-Dokumentation, die wie beschrieben funktionieren sollte. Im Folgenden finden Sie ein Update, das die richtige Form des Metaattributwerts angibt.

Also, wenn Sie dies verwenden:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9">

Leider erhalten Sie IE8 als IE8-Rendering, da die x-ua-kompatible Engine eine unscharfe Versionsvektorisierung durchführt. Siehe dieses Dokument: Definieren der Dokumentenkompatibilität: Grundlegendes zu Inhaltsattributwerten auf MSDN. In diesem Abschnitt sehen Sie, dass in der ersten Hälfte alle als größer als die aktuelle Browserversion definierten Versionsvektoren als die größte verfügbare Rendering-Engine interpretiert werden. Daher wird emulateIE9 in emulateIE8 übersetzt. Blöd.

Im selben Atemzug sprechen sie dann über die Verwendung mehrerer Versionsvektoren wie im obigen Code-Snippet, um eine bestimmte Engine auszuschließen. Aber wegen der Fuzzy-Versionslogik würde das nie funktionieren. Ah, Microsoft. Wieder fehlgeschlagen.

Der Grund, warum die Verwendung von CCs um das Meta herum nicht funktioniert, ist, dass der Browser eine Rendering-Engine ausgewählt haben muss, bevor er auf einen CC trifft. Das x-ua-Meta muss vor allen anderen Elementen in der Kopfzeile stehen, außer anderen Metas oder dem Titel gemäß der MS-eigenen Dokumentation.

Wenn jemand das herausfinden kann, bin ich ganz Ohr, weil ich unbedingt den IE8 von der Unterstützung ausschließen möchte, während ich den IE9 mit einbeziehe.

WICHTIGES UPDATE :

Robocat weist darauf hin, dass die Verwendung eines Kommas anstelle eines Semikols die richtige Methode ist, wie Microsoft zeigt. Ich habe es getestet und es hat bei mir funktioniert. Ich habe meine Testseite aktualisiert.

Die richtige Form lautet also (wie von robocat vorgeschlagen):

<meta http-equiv="X-UA-Compatible" content="IE=7, IE=9">

Die falsche Form lautet (wie von Microsoft vorgeschlagen):

<meta http-equiv="X-UA-Compatible" content="IE=7; IE=9">
27
squareman

Wenn Sie möchten, dass IE 8 IE7-Standards verwendet und IE 9 IE9-Standards verwendet, hat dies für mich funktioniert:

<meta http-equiv="X-UA-Compatible" content="IE=7, IE=9">

Für IE9 gibt mir das IE 9-Kompatibilitätsmodus mit IE 9-Standards . Für IE8 gibt es Browsermodus-IE8-Dokumentmodus-IE7-Standards

3
J F

Ich habe bisher alle verwendet, nichts funktioniert auf IE9:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >
<meta http-equiv="X-UA-Compatible" content="IE=8" >

<httpProtocol>
        <customHeaders>
          <clear />
          <add name="X-UA-Compatible" value="IE=EmulateIE8" />
        </customHeaders>
    </httpProtocol>

das ist so frustrierend, dass keine dieser Meta-Tags zu funktionieren scheint. Microsoft, was ist so schwierig an der Unterstützung von Informationen, die Ihrer Meinung nach in Ihrer Dokumentation funktionieren sollten? Wir müssen stundenlang Browserkriege verbringen. Sie verschwenden alle Zeit.

3
Deepfreezed

Dieser arbeitet für IE9 für mich.

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8"/>