Sostituisci la modalità di compatibilità intranet IE8


200

Per impostazione predefinita, IE8 impone i siti Web Intranet in modalità compatibilità. Ho provato a cambiare la meta header in IE8, ma non riconosce la meta header e usa solo l'impostazione del browser. Qualcuno sa come disabilitarlo?


1
Prova stackoverflow.com/questions/2742853/… , che ha funzionato per me.
David Kolar,

2
Aggiungi questo all'interno del tag head delle pagine: <meta http-equiv = "X-UA-Compatible" content = "IE = 8" /> (destinato alla versione IE che desideri). Nota, questo NON cambierà il fatto che il browser dice che è in modalità compatibilità (chiamata modalità browser), ma la pagina verrà visualizzata in modalità standard IE8. Sarà quindi necessario modificare javascript per verificare la presenza di "tridente" se si sta verificando IE8 o versioni successive. Vedi: blogs.msdn.com/b/mikeormond/archive/2008/09/25/…
n00b

@ n00b - questo non ha alcun effetto sul mio sito.
Pete,

La mia comprensione è che il meta tag mi deve immediatamente dopo il tag head. Ho notato che alcuni script verranno inseriti in testa all'indice 0; quindi, il meta tag non sarà più dopo head.
AMissico,

Risposte:


224

È possibile ignorare la modalità di compatibilità in Intranet.

Per IIS, basta aggiungere il codice seguente a web.config. Ha funzionato per me con IE9.

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <clear />
      <add name="X-UA-Compatible" value="IE=edge" />
    </customHeaders>
  </httpProtocol>
</system.webServer> 

Equivalente per Apache:

Header set X-UA-Compatible: IE=Edge

E per nginx:

add_header "X-UA-Compatible" "IE=Edge";

E per express.js:

res.set('X-UA-Compatible', 'IE=Edge')

20
Questa è la risposta corretta Il meta tag non fa nulla, ma l'aggiunta dell'intestazione della risposta funziona. Maggiori informazioni qui: social.msdn.microsoft.com/Forums/is/iewebdevelopment/thread/…
russau,

3
Essere d'accordo. Questa dovrebbe essere la risposta corretta in quanto sovrascrive correttamente le impostazioni Intranet solo per questo sito Web.
enriquein,

9
(per chiarire: funziona per la modalità documento, ma non per la modalità browser)
codeulike

21
Questa non è la risposta corretta questa risposta modifica la modalità documento NON cambia l'importante "modalità browser". Sto ancora cercando una soluzione a questo problema.
DeveloperChris

4
Questa non è la risposta corretta, in quanto è specifica .net (senza nemmeno riconoscere il fatto).
Daddy32,

84

Michael Irigoyen ha ragione, ma è un po 'più complicato ...

se stai usando il meraviglioso boilerplate di Paul Irish, avrai qualcosa di simile al seguente: -

<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

Questo NON funzionerà come previsto e importerà in IE la modalità di compatibilità in una Intranet ambiente se è selezionata l'opzione "Visualizza i siti Intranet nella vista compatibilità". È necessario rimuovere i commenti IE condizionali per impedire la modalità di compatibilità Intranet.

Quindi funzionerà il seguente codice:

<!doctype html>
<html class="no-js" lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

Fondamentalmente se si attivano commenti IE condizionali prima <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">dell'istruzione, si verrà forzati alla modalità di compatibilità in un ambiente Intranet se si esegue IE9 con le impostazioni predefinite.

AGGIORNAMENTO - INFORMAZIONI AGGIUNTIVE: Nota che esiste un trucco che farà funzionare la piastra HTML5:

Aggiungi un commento condizionato e vuoto prima del DOCTYPE. E nota come pure, che quando si fa che , allora si può anche aggiungere commenti condizionali intorno alla X-UA-Compatibledirettiva, rendendo la pagina HTML5 valido pure. Quindi per esempio:

<!--[if HTML5]><![endif]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->

Un post sul blog che è stato ispirato dalla prima parte di questa risposta , ha più dettagli. E a proposito: Come accennato in questo post del blog, si può anche sostituire il commento condizionale prima del DOCTYPE con un semi condizionale commento con nessuna condizione : <!--[]-->. Quindi, in questo modo:

<!--[]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->

Ma nota che quest'ultima variante ( <--[]--><!DOCTYPE html>), come spiegato ad esempio da questa risposta a un'altra domanda , attiverà il ben noto problema che esso - per le versioni IE legacy senza supporto per X-UA-Compatioble(leggi: per IE7 e IE6) - inserirà il browser in quirks mode.


Questo non ha risolto il problema per me. Tuttavia, FYI, aggiungendo il "Compatibile X-UA" come DID Header risolve il problema!
Scott Rippey,

34

Se si apre il menu "Strumenti" e si sceglie "Impostazioni di visualizzazione compatibilità" In quella finestra di dialogo in basso è presente un'impostazione "Visualizza siti intranet in modalità compatibilità". Se lo deselezioni, ciò dovrebbe risolvere il problema e IE utilizzerà la modalità basata su DOCTYPE.


19
Non ho votato in negativo, ma immagino sia perché hai risposto dal punto di vista dell'utente (cosa dovrebbe fare un utente). Questa domanda viene da uno sviluppatore web e si sta chiedendo come risolvere il problema senza richiedere all'utente di fare qualcosa in particolare.
Roy Tinker,

1
Inoltre, ciò non consente di mantenere la compatibilità con le vecchie applicazioni. Se deselezioni tale impostazione, le tue vecchie app potrebbero rompersi senza alcun modo per aggiornarle. Penso che il richiedente sia alla ricerca di un modo per forzare la modalità standard quando tutte le altre app sulla propria intranet richiedono che la casella di controllo sia selezionata per la modalità di compatibilità.
Andrew Lewis,

2
Credo che abbia risposto dal punto di vista del programmatore. "... IE utilizzerà la modalità base sul DOCTYPE". Vedere: msdn.microsoft.com/en-us/library/ms535242%28VS.85%29.aspx Se la società esegue Active Directory, l'amministratore può propagare le modifiche alle impostazioni del browser. Non puoi farlo con FireFox!
Nate Zaugg,

@AndrewLewis forse. Ma c'è il pulsante della modalità di compatibilità nella barra degli URL che imposterà il browser per utilizzare la modalità di compatibilità per quel sito specifico. Oppure puoi aggiungerli manualmente nella finestra di dialogo. Ancora una volta, questa roba può essere eseguita a livello globale dall'IT.
PilotBob,

2
@PilotBob se hai 120K + utenti e centinaia (se non migliaia) di siti Intranet da supportare, questa non è una soluzione praticabile.
yorch

19

C'è una certa confusione nelle risposte a questa domanda.

La risposta principale è attualmente una soluzione lato server che imposta un flag nell'intestazione http e alcuni commenti indicano che una soluzione che utilizza un metatag non funziona.

Penso che questo post sul blog offra una bella panoramica di come utilizzare le meta informazioni sulla compatibilità e nella mia esperienza funziona come descritto: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x- UA-Compatible-per-creare-resistente-enterprise-web-applications.aspx

I punti principali:

  • l'impostazione delle informazioni utilizzando un meta tag e nell'intestazione funzionano entrambe
  • Il meta tag ha la precedenza sull'intestazione
  • Il meta tag deve essere il primo tag, per assicurarsi che il browser non determini prima il motore di rendering in base all'euristica

Un punto importante (e penso che molta confusione provenga da questo punto) è che IE ha due "classi" di modalità:

  1. La modalità documento
  2. La modalità browser

La modalità documento determina il motore di rendering (come viene visualizzata la pagina Web).

La Modalità browser determina quale stringa IE User-Agent (UA) invia ai server, a quale Modalità IE predefinita per documento e come IE valuta i commenti condizionali.

Ulteriori informazioni sulla modalità documento rispetto alla modalità browser sono disponibili in questo articolo: http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for- sito-developers.aspx? reindirizzate = true

Nella mia esperienza, i metadati di compatibilità influenzeranno solo la modalità documento . Quindi, se fai affidamento sul rilevamento del browser, questo non ti aiuterà. Ma se si utilizza il rilevamento delle funzionalità, questa dovrebbe essere la strada da percorrere.

Quindi consiglierei di usare il meta tag (nella pagina html) usando questa sintassi:

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

Avviso: fornire un elenco di modalità browser testate per.

Il post sul blog suggerisce anche l'uso di EmulateIEX. Ecco una citazione:

Detto questo, una cosa che trovo strana è quando un'applicazione richiede EmulateIE7 o EmulateIE8. Queste modalità di emulazione sono esse stesse decisioni. Quindi, invece di essere specifico su ciò che vuoi, stai chiedendo una delle due cose e quindi determinando quale di queste due cose cercando altrove nel codice per un DOCTYPE (e quindi cercando di capire se quel DOCTYPE ti darà standard o stranezze a seconda del suo contenuto - un altro compito a volte confuso). Piuttosto che farlo, penso che abbia molto più senso specificare direttamente ciò che vuoi, piuttosto che dare una risposta che è essa stessa una domanda. Se si desidera standard IE7, utilizzare IE = 7, anziché IE = EmulateIE7. (Nota che questo non significa che non dovresti usare un DOCTYPE - dovresti.)


come cambiare la modalità browser?
Vishnudev K,

la frase in modalità browser è confusa
Justice Fist

@JusticeFist Sì, hai ragione, grazie. Ho provato a migliorarlo.
stefan.s

1
@VishnudevK L'unico modo che conosco è usare gli strumenti per sviluppatori. Ma probabilmente vuoi una soluzione programmatica.
stefan.s,

9

Prova questo metatag:

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

Dovrebbe forzare il rendering di IE8 come Modalità standard IE8 anche se "Visualizza i siti Intranet in vista compatibilità" è selezionato [sia per Intranet o tutti i siti Web], l'ho provato da solo su IE 8.0.6


15
No non lo fa.
Dennis C,

11
Questo in realtà è corretto, ma DEVE apparire prima di tutti i tag META sulla pagina o non funzionerà.
Michael Irigoyen,

2
Questo non funziona per me. Per quanto ne so IE8s "Visualizzare i siti Intranet in modalità compatibilità" non è
irreversibile

6
(per chiarire: funziona per la modalità documento, ma non per la modalità browser. Quindi il rendering è fisso, ma il browser finge ancora di essere IE7)
codeulike

7

Il nostro amministratore di sistema ha risolto questo problema deselezionando la casella a livello globale per la nostra organizzazione. Gli utenti non avevano nemmeno bisogno di disconnettersi.

inserisci qui la descrizione dell'immagine


1
Questa soluzione funziona perfettamente se tutti i siti sull'intranet possono utilizzare gli ultimi standard Web. Tuttavia, se alcuni non riescono, questo metodo romperà inavvertitamente quelli ... Mi avvicinerei con cautela.
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

4

Ho trovato una risposta funzionante che consente di ignorare la Visualizzazione compatibilità intranet selezionata. Basta aggiungere all'evento OnInit della tua pagina questa riga (non sono necessarie meta o web.config customHeader):

Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");

1
Risposta specifica per piattaforma di sviluppo ... senza nemmeno specificare la piattaforma. Immagino che stai parlando di Visual Studio .NET? Per quanto ne so, l'evento "OnInit" non esiste (in Javascript, Java, PHP, ....)
Stijn de Witt,


3

Sono stato in grado di ignorare la modalità di compatibilità specificando il meta tag come IL PRIMO TAG nella sezione head, non solo il primo meta tag ma come e solo come il MOLTO PRIMO TAG .

Grazie a @ stefan.s per avermi inserito nella tua eccellente risposta. Prima di leggere che avevo:

QUESTO NON FUNZIONA

<head> 
<link rel="stylesheet" type="text/css" href="https://stackoverflow.com/qmuat/plugins/editors/jckeditor/typography/typography.php"/>
<meta http-equiv="x-ua-compatible" content="IE=9" >

spostato il tag di collegamento e ha funzionato

QUESTI LAVORI :

<head><meta http-equiv="x-ua-compatible" content="IE=9" >

Quindi un client IE8 impostato per usare la compatibilità rende la pagina come modalità Standard IE8 - il contenuto = 'IE = 9' significa usare lo standard più alto disponibile fino a IE9 incluso.


2

Questa non è esattamente una soluzione ma, penso che sia la migliore. Sui nostri siti intranet diciamo alle persone che è possibile accedere solo da Firefox, non accettiamo gentilmente gli utenti IE da queste parti. Controllare l'agente utente sul lato server o client e negare loro l'accesso da IE. E sono un programmatore .NET.


1
Mi piace la tua idea ma non abbiamo Firefox qui.
Dennis C,

22
Peggio. Suggerimento. Mai. È un problema tanto quanto tutti i siti Intranet che sono solo IE. Prova a fare un po 'di lavoro extra e fai funzionare le tue cose su tutti i browser comuni. Non è così difficile.
mhenry1384

2
@ mhenry1384 Ti interessa spiegare perché è un suggerimento terribile avere un sistema intranet bloccato? Non è necessario supportare i quark per i vecchi browser. Sai che i tuoi utenti otterranno l'esperienza prevista. Non è un sistema pubblico, che importa, continui a supportare IE 5.5? Dico ai miei utenti pubblici di aggiornare. Non dovrei comunque perdere tempo con i sistemi di backend, è il pubblico che ha bisogno di me. Non è come se lo bloccassi su Internet Explorer 6 e richiedessi ActiveX come alcuni. Ad esempio il mio sistema consente Firefox 6 e versioni successive. Quindi, se esce Firefox 27, funziona ancora. O mi sottovaluti o fai una vera discussione.
Caimen

2
Ogni sito intranet che ho usato che era bloccato su un browser specifico è bloccato su IE. Questo mi fa impazzire, dato che odio IE tanto quanto il prossimo. Obbligare i tuoi utenti a utilizzare il browser che preferisci (non il loro), anche se è qualcosa MA IE, sembra contrario al web, persino al web intranet. In genere non è così difficile far funzionare un sito Web in IE7 / 8/9, soprattutto se si utilizzano librerie come jQuery. Consenti agli utenti di utilizzare ciò che desiderano.
mhenry1384

2
Un sito scritto per Firefox 10, ad esempio, nella mia esperienza funzionerà quasi sempre perfettamente su IE9 senza modifiche. Quindi limitare agli utenti l'uso di IE9 significa che sta succedendo qualcos'altro. Indica che sei in una missione idealogica, non qualcuno che cerca di scrivere un buon software web. Se si trattava solo di non avere il tempo di testare browser diversi da Firefox, limiti anche le persone a utilizzare Opera? [Mi dispiace per essere così prolisso. Dovrei tornare a risolvere questo dannato problema con IE8 che sto
riscontrando

1

Avevo lottato con questo problema e volevo aiutare a fornire una soluzione unica e approfondimenti.

Alcuni framework basati su AJAX inietteranno javascript e fogli di stile all'inizio <head>e, facendo ciò, sembra che la soluzione di metatag ben consolidata non funzioni correttamente. In questo caso ho scoperto che l'iniezione diretta nell'intestazione della risposta HTTP, proprio come la risposta di Andras Csehi risolverà il problema.

Per quelli di noi che usano Java Servlet, tuttavia, un buon modo per risolverlo è usare un ServletFilter.

public class EmulateFilter implements Filter {

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
        FilterChain arg2) throws IOException, ServletException {
    HttpServletResponse response = ((HttpServletResponse)arg1);
    response.addHeader("X-UA-Compatible", "IE=8");
    arg2.doFilter(arg0, arg1);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

}

1

Possiamo risolvere questo problema in ambiente Spring-Apache-tomcat aggiungendo una sola riga nel metodo RequestInterceptor -

//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {

// Some logic

// below statement ensures IE trusts the page formatting and will render it acc. to IE 8 standard.
response.addHeader("X-UA-Compatible", "IE=8"); 

return true;
}

Riferimento da - Come creare il filtro e modificare l'intestazione della risposta Descrive come possiamo risolvere questo problema tramite RequestInterceptor (Spring).


0

Se si desidera che il proprio sito Web imponga la modalità standard IE 8, utilizzare questo metatag insieme a un DOCTYPE valido:

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

Nota il valore "EmulateIE8" anziché il semplice "IE8".

Secondo gli sviluppatori IE, dovrebbe essere "Visualizza DOCTYPE di standard in modalità Standard IE8; Visualizza DOCTYPE di quirk in modalità Quirks. Usa questo tag per sovrascrivere la visualizzazione di compatibilità sui computer client e imporre gli standard agli standard IE8".

maggiori informazioni su questo post sul blog di IE: http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx


0

Questa domanda è un duplicato della modalità browser Force "Internet Explorer 8" in Intranet .

Le risposte indicano che non è possibile disabilitare la visualizzazione di compatibilità (sul lato server) - https://stackoverflow.com/a/4130343/24267 . Questo sembra certamente essere il caso, poiché nessuno dei suggerimenti che ho provato ha funzionato. In IE8 la "Modalità browser" viene impostata sulla vista Compatibilità di Internet Explorer 8, indipendentemente dal tipo di intestazione compatibile con X-UA che invii.

Ho dovuto fare una gestione speciale per IE7 e la modalità di compatibilità, che ha causato il rendering del browser usando IE8 ma riferivo che era IE7, ha rotto il mio codice. Ecco come ho risolto il mio codice (sono consapevole che si tratta di un hack orribile e dovrei testare funzionalità non versioni del browser):

isIE8 = navigator.appVersion.indexOf ("MSIE")! = -1 && parseFloat (navigator.appVersion.split ("MSIE") [1]) == 8;
if (! isIE8 && navigator.appVersion.indexOf ("MSIE")! = -1 && parseFloat (navigator.appVersion.split ("MSIE") [1]) == 7 && navigator.appVersion.indexOf ("Trident") ! = -1) {
    // Bugiardo, questo è IE8 in modalità compatibilità.
    isIE8 = true;
}

0

Ho avuto lo stesso problema. Ha funzionato usando

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

0

Aggiungi questo all'interno del tag head delle pagine (indirizzato alla versione IE che desideri):

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

Nota, questo NON cambierà il fatto che il browser dice che è in modalità compatibilità (chiamata modalità browser), ma la pagina verrà visualizzata in modalità standard IE8. Se il suo ANCORA non viene visualizzato come desideri, è probabilmente perché hai JavaScript che controlla erroneamente la versione di IE. Vedi il seguente post sul blog per determinare quale proprietà dovresti escludere perché anche se imposti il ​​tag meta X-UA-Compatible, la stringa dell'agente utente continuerà a dire MSIE 7.0 .

Nel mio caso, per la correzione ho dovuto aggiungere un controllo per la modalità di compatibilità IE7. L'ho fatto usando un semplice codice javascript:

                //IE8 and later will have the word 'trident' in its user agent string.
                if (navigator.userAgent.indexOf("Trident")>-1) { //do something }

0

Per chiunque legga questo cercando di disabilitarlo tramite GPO per tutti gli utenti, questa è l'impostazione:

Configurazione computer / Modelli amministrativi / Componenti di Windows / Internet Explorer / Visualizzazione compatibilità / Attiva modalità standard Internet Explorer per Intranet locale

sebbene la modifica di web.config l'abbia corretto per me.


Per accedere all'editor Criteri di gruppo locali , è possibile eseguire gpedit.msc da Esegui.
ROMANIA_engineer


0

Il commento di Stefan S sulla modalità documento rispetto alla modalità browser è stato molto pertinente per il mio problema.

Ho i metadati X-UA-Content nella pagina, ma stavo testando sul lato client la versione del browser tramite navigator.appVersion. Questo test non riflette i metadati perché fornisce la modalità browser non la modalità documento.

La risposta per me è stata quella di testare document.documentModequalcosa del tipo:

function IsIE(n)
{
    if (navigator.appVersion.indexOf("MSIE ") == -1) return false;
    var sDocMode = document.documentMode;
    return (isFinite(sDocMode) && sDocMode==n);
}

Ora, il mio tag meta X-UA-Content si riflette nel mio test del browser.

Perché faccio una cosa così accigliata come testare il browser? Velocità. Vari dei miei componenti aggiuntivi di jQuery, come tablesorter, sono troppo lenti su IE6 / 7 e desidero disattivarli. Non sono sicuro che il test per le funzionalità del browser possa aiutarmi a risolvere questo altrimenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.