Sostituire la modalità di compatibilità intranet IE8

Per impostazione predefinita, IE8 impone la modalità di compatibilità dei siti Web intranet. Ho provato a cambiare la meta header in IE8, ma non riconosce la meta header e usa solo le impostazioni del browser. Qualcuno sa come disabilitare questo?

È ansible sovrascrivere la modalità di compatibilità in intranet.

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

        

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') 

Michael Irigoyen è corretto, ma è un po ‘più complicato …

se stai usando il meraviglioso boilerplate di Paul Irish allora avrai qualcosa di simile al seguente: –

          

Questo NON funzionerà come previsto e imporrà in IE in modalità di compatibilità in un ambiente Intranet se è stato selezionato “Visualizza siti intranet in visualizzazione compatibilità”. È necessario rimuovere i commenti IE condizionali per impedire la modalità di compatibilità Intranet.

Quindi il seguente codice funzionerà:

     

Fondamentalmente se si triggersno i commenti IE condizionali prima allora si verrà forzati in modalità compatibilità in un ambiente Intranet se si è eseguire IE9 con le impostazioni predefinite.

AGGIORNAMENTO – INFORMAZIONI AGGIUNTIVE: nota però che esiste un trucco che farà funzionare la piastra armonica HTML5:

Aggiungi un commento condizionale emtpy prima di DOCTYPE. E notate anche che, quando lo fate, potete anche aggiungere commenti condizionali attorno alla direttiva X-UA-Compatible , rendendo anche la pagina HTML5 valida. Quindi per esempio:

      

Un post sul blog che è stato ispirato dalla prima parte di questa risposta , ha più dettagli. E a proposito: come menzionato in quel post del blog, si può anche sostituire il commento condizionale prima del DOCTYPE con un commento semi-condizionale senza condizione : . Quindi, in questo modo:

      

Ma nota che quest’ultima variante ( <--[]--> ), come spiegato ad esempio da questa risposta ad un’altra domanda , triggers il ben noto problema che esso – per versioni legacy di IE senza supporto per la X-UA-Compatioble (leggi: per IE7 e IE6): porta il browser in modalità “Quirks”.

Se apri il menu “Strumenti” e scegli “Impostazioni vista compatibilità” nella finestra di dialogo in basso c’è un’impostazione “Visualizza siti intranet in modalità compatibilità”. Se si deseleziona ciò che dovrebbe risolvere il problema e IE utilizzerà la modalità basata su DOCTYPE.

C’è una certa dose di confusione nelle risposte a questa domanda.

La risposta migliore è attualmente una soluzione lato server che imposta un flag nell’intestazione http e alcuni commenti indicano che una soluzione che utilizza un meta tag non funziona.

Penso che questo post sul blog fornisca una buona panoramica su come utilizzare le informazioni sulla meta 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 il motore di rendering prima basato sull’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 resa la pagina Web).

La modalità Browser determina quale stringa IE di User-Agent (UA) invia ai server, quale modalità IE di default è impostata su IE e come IE valuta i commenti condizionali.

Maggiori informazioni sulle 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? Redirect = true

Nella mia esperienza i metadati di compatibilità influenzeranno solo la modalità documento . Quindi, se ti affidi al rilevamento del browser, questo non ti aiuterà. Ma se stai usando il rilevamento di funzionalità, questa dovrebbe essere la strada da percorrere.

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

  

Avviso: fornire un elenco delle modalità del browser per cui è stato testato.

Il blog post anche consigli contro 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 di queste due cose e poi determina quali di queste due cose guardi altrove nel codice per un DOCTYPE (e poi tenti di capire se quel DOCTYPE ti darà degli standard o stranezze a seconda del suo contenuto – un altro compito a volte confusionario). Piuttosto che farlo, penso che abbia molto più senso specificare direttamente ciò che si vuole, piuttosto che dare una risposta che è di per sé una domanda. Se si desidera standard IE7, quindi utilizzare IE = 7, anziché IE = EmulateIE7. (Nota che questo non significa che non dovresti usare un DOCTYPE – dovresti.)

Prova questo metatag:

  

Dovrebbe forzare IE8 a eseguire il rendering come modalità standard IE8 anche se “Visualizza i siti intranet in visualizzazione compatibile” è selezionato [sia per intranet che per tutti i siti Web], l’ho provato su IE 8.0.6

Il nostro amministratore di sistema ha risolto questo problema deselezionando la casella globalmente per la nostra organizzazione. Gli utenti non hanno nemmeno bisogno di disconnettersi.

inserisci la descrizione dell'immagine qui

Ho trovato una risposta funzionante che consente di ignorare la vista di compatibilità intranet selezionata. Basta aggiungere l’evento OnInit della tua pagina a questa riga (non è necessario alcun meta o web.config personalizzatoHeader):

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

Prova a inserire quanto segue nell’intestazione:

  

Courtesy HTML5 Boilerplate di Paul Irish (ma funziona anche in XHTML Transitional).

Sono stato in grado di sovrascrivere la modalità di compatibilità specificando il meta tag come THE FIRST 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 ho avuto:

QUESTO NON HA FUNZIONA

    

ha spostato il tag di collegamento e ha funzionato

QUESTO FUNZIONA :

  

Quindi un client IE8 impostato per utilizzare la compatibilità esegue il rendering della pagina come modalità standard IE8 – il contenuto = “IE = 9” significa utilizzare lo standard più elevato disponibile fino a IE9 incluso.

Questa non è esattamente una soluzione, ma sento che è la migliore. Nei nostri siti intranet diciamo alle persone che è ansible accedervi solo da Firefox, non prendiamo gli utenti IE da queste parti. Controllare l’agente utente sul lato server o client e negare loro l’accesso da IE. E io sono un programmatore .NET.

Avevo faticato con questo problema e volevo contribuire a fornire una soluzione e una visione uniche.

Alcuni framework basati su AJAX iniettano javascript e fogli di stile all’inizio di e ciò sembra impedire il corretto funzionamento della soluzione di meta tag consolidata. In questo caso ho trovato che l’iniezione diretta nell’intestazione della risposta HTTP, proprio come la risposta di Andras Csehi, risolverà il problema.

Per quelli di noi che utilizzano 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 { } } 

Possiamo risolvere questo problema nell’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 un filtro e modificare l’intestazione della risposta Copre il modo in cui possiamo risolvere questo problema tramite un RequestInterceptor (Spring).

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

Notare il valore “EmulateIE8” anziché il semplice “IE8”.

Secondo gli sviluppatori di IE, questo dovrebbe: “Visualizza gli standard DOCTYPE in modalità standard IE8, Visualizza i tipi di DOCTYPE in modalità Quirks. Usa questo tag per sostituire la visualizzazione di compatibilità sulle macchine client e forzare gli standard agli standard IE8”.

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

Questa domanda è un duplicato della modalità del browser Force “Internet Explorer 8” in intranet .

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

Ho dovuto fare un po ‘di gestione speciale per IE7 e la modalità di compatibilità, che ha causato il rendering del browser utilizzando IE8 ma segnalare che era IE7, ha rotto il mio codice. Questo è il modo in cui ho corretto il mio codice (sono consapevole che si tratta di un attacco orribile e dovrei provare per le funzionalità non per le 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;
 }

Aveva lo stesso problema. Ha funzionato usando

  

Aggiungi questo all’interno del tag head della tua pagina (mirato alla versione IE desiderata):

  

Nota, questo NON cambierà il fatto che il browser dica la sua modalità di compatibilità (chiamata modalità browser), ma la pagina verrà renderizzata in modalità standard IE8. Se ANCORA non rende come desideri, è probabilmente perché hai javascript che sta erroneamente controllando la versione di IE. Vedere il post del blog seguente per determinare la proprietà da escludere perché anche se si imposta il tag meta X-UA-Compatible, la stringa dell’agente utente continuerà a pronunciare 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 } 

Per chiunque altro stia leggendo questo aspetto per disabilitare questo tramite GPO per tutti gli utenti, questa è l’impostazione:

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

anche se la modifica web.config l’ha corretta per me.

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

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

La risposta per me era di testare document.documentMode qualcosa come:

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

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

Perché faccio una cosa accigliata come prova il browser? Velocità. Vari dei miei add-in jQuery, come i tablesorter, sono troppo lenti su IE6 / 7 e voglio distriggersrli. Non sono sicuro che il test delle funzionalità del browser possa aiutarmi a risolvere il problema diversamente.

Cambia le intestazioni in .htaccess

 BrowserMatch MSIE ie Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie 

Trovato la soluzione a questo problema qui: https://github.com/h5bp/html5-boilerplate/issues/378