Domare i vostri IE multipli standalone

Torna all'indice
Articolo originale

Un articolo di Manfred Staudinger

Le versioni multiple di Explorer per Windows su un unico computer hanno rivoluzionato i test sui CSS, ma purtroppo le differenti versioni di IE sembrano identiche a prima vista, causando una potenziale confusione ed errori nei test. Inoltre i Commenti Condizionali (CC) di Microsoft non funzionano bene su questi standalone, rendendo l'uso avanzato di tali commenti un gioco combinatorio. Questi problemi ora sono stati risolti! Ma prima una breve introduzione sugli standalone.

Cosa sono questi standalone?

Quando Joe Maddalone propose Versioni multiple di IE in Windows XP Pro nel november 2003, fu un grande sollievo per i web developer. Tecnicamente parlando, è stato possibile grazie all'uso di una caratteristica di sistema descritta come libreria di subroutine del processo specifico, altrimenti detta .dll condivisa e moduli .com. Viene supportata dallo scheduler di sistema da Win98 SE in poi, ed è inizializzata da un file vuoto di nome process.exe.local.

Affinchè questa libreria di processo possa permettere a diverse versioni di Explorer di girare contemporaneamente sulla stessa macchina deve contenere il modulo di partenza per il processo (iexplore.exe), l'inizializzatore (iexplore.exe.local), e ogni DLL richiesta specifica del processo. Per ulteriori ragguagli, si vedano le info di Joe Maddalone: IE multipli in Windows.

Scaricate le versioni standalone già pronte qui.

Come mai c'è voluto così tanto?

Una domanda mi dava da pensare: se Win98 SE (e la caratteristica in questione) erano disponibili ai primi di aprile del 1999, perchè questa caratteristica che io chiamo libreria di processo ci ha messo più di quattro anni per venire a galla? A mio avviso, in parte dipende dal fatto che il SO Windows manca di una descrizione concisa in tal senso, e anche perchè Microsoft sembra aver confuso le acque usando almeno tre nomi diversi per denominare questa caratteristica: Componenti Isolati, Redirezione DLL/COM, e Un approccio parallelo per implementare DLL private.

L'ultimo si trova in The End of DLL Hell (Rick Anderson, Microsoft, gennaio 2000). Anderson cita anche "l'uso di un unico numero di versione" per implementare DLL private, un approccio diverso chiamato in seguito Condivisione parallela di componenti, che ha contribuito ad un'ulteriore confusione!

Ad ogni modo, ora abbiamo questi standalone per ogni versione di Explorer fino alla 4, ed è una cosa grande, ma che può essere ulteriormente perfezionata.

Perfezionare gli standalone

Per espandere ulteriormente le funzionalità degli IE multipli, vorrei sottolineare due modifiche:

  1. Aggiungere il numero di versione alla barra del titolo del browser
  2. Far funzionare i commenti condizionali nelle versioni IE 5.01, IE 5.5, e IE 6

Etichette di versione

Per ottenere la modica numero 1 bisogna fare due cose:
1. trovare e possibilmente modificare una stringa del registro
2. aggiungere un modulo modificato ad ogni libreria di processo.

Se la stringa di registro in questione, Window Title, esiste nel vostro registro, farà in modo che tutte le vostre versioni di IE visualizzino la stessa stringa sulla barra del titolo. Questa stringa viene dalla stringa Window Title e il suo valore predefinito è, lo immaginate, "Microsoft Internet Explorer". Per ulteriori informazioni leggete Come cambiare il titolo della finestra in Internet Explorer sul sito Microsoft.

Per vedere se la stringa Window Title esiste, cliccate su Start, poi su Esegui, e digitate "regedit.exe". Questo aprirà l'editor del registro, dove potrete navigare fino alla chiave Main, che si trova sotto HKCU\Software\Microsoft\Internet Explorer\ dove "HKCU" si legge come "HKEY_CURRENT_USER".

Una volta in Main, cercate la stringa chiamata Window Title, e se c'è, cliccate col tasto destro e rinominatela zWindow Title.

Per abilitare le etichette di versione per IE 4.01 standalone (per il suggerimento vorrei ringraziare Derek Ahmedzai), la procedura è simile. Questa volta partite da "HKLM", ossia "HKEY_LOCAL_MACHINE", andate su HKLM\Software\Microsoft\Internet Explorer\Main e cercate di nuovo la stringa Window Title.

Se non c'è, cliccate col tasto destro su Main, selezionate "Nuovo", scegliete "Valore stringa" per il tipo di dati, e rinominate "Nuovo Valore #1" come Window Title.

Ora avete la stringa Window Title, cliccateci col tasto destro e selezionate "Modifica". Quando si apre la pop-up "Modofica stringa" impostate il valore su "IE 4.01 (Microsoft Internet Explorer)" e cliccate su "OK". Tutto qua!

Seguite le istruzioni alla lettera, ma sappiate che il registro non è concepito secondo il principio del "prova e sbaglia". Se volete fare delle modifiche, leggete prima la Descrizione del registro di Microsoft Windows.

Per abilitare le etichette di versione per IE 5.01, IE 5.5, e IE 6.0 standalone, è necessario aggiungere un modulo modificato (BROWSELC.DLL) alla libreria di processo. La modifica consiste nel sostituire la stringa "Microsoft Internet Explorer" (che appare nella barra del titolo) con "IE 5.01 (Microsoft Internet Explorer)", "IE 5.5 (Microsoft Internet Explorer)" e "IE 6.0 (Microsoft Internet Explorer)". Una volta posizionate le DLL, la barra del titolo del browser annuncerà la versione di IE, evitando ogni confusione.

La discussione presuppone che voi abbiate IE7 come browser primario e IE6 come standalone. Se avete invece IE6 come browser primario, non toccate niente: la mancanza di un'etichetta di versione nella barra del titolo indicherà che si tratta comunque di IE6.

Per scaricare le DLL, cliccate sui link qui sotto, selezionate "Salva come", e salvatele nella cartella che contiene il file IEXPLORE.EXE per ogni versione dei vostri standalone. In altre parole, queste DLL sono specifiche rispettivamente per IE 5.01, IE 5.5 o IE 6.0, e ciascuna deve trovarsi nella stessa cartella del vostro file IEXPLORE.EXE. Le tre DLL hanno lo stesso nome (BROWSELC.DLL), quindi state attenti a non metterle nella stessa cartella!

Riparare i commenti condizionali

Per i dettagli, andate diritti alla fonte e leggete Sui commenti condizionali sul sito Microsoft. C'è chi sostiene che usare questa caratteristica proprietaria sia sbagliato, perchè i CC non sono standard, ma in fondo si tratta solo di codice messo in un commento HTML, un commento che viene etichettato in base alle diverse versioni di IE, in modo che ognuna di esse può leggerlo e ricavarne codice utilizzabile. Se tutti i browser avessero qualcosa di simile, la risoluzione dei bug sarebbe più semplice in Opera e Mozilla.

Inoltre, i CC sono validi, in quanto per il validatore e i browser diversi da IE/Win non sono altro che un normale commento HTML, e così vengono ignorati.

Molti dei comportamenti dei commenti condizionali possono essere riabilitati sugli standalone eseguendo una semplice modifica al registro. Si tratta solo di rinominare una chiave particolare, di solito chiamata IE, come zIE.

Cliccate su Start, poi su Esegui, e digitate "regedit.exe". Si apre l'editor del registro, dove potete navigare fino alla chiave desiderata. La nostra chiave, chiamata IE, si trova sotto HKLM\Software\Microsoft\Internet Explorer\Version Vector\. In alcune versioni di Windows "HKLM" può apparire come "HKEY_LOCAL_MACHINE"

Una volta su Version Vector, cercate la chiave chiamata IE, cliccateci col tasto destro, e rinominatela zIE.

(Se usate una versione a 64 bit di Windows, mi piacerebbe mettermi in contatto con voi per vedere la corretta procedura per cambiare la chiave. Un "registry reflector" copia i valori dalla chiave citata a HKLM\Software\Wow6432Node\Microsoft\Internet Explorer\Version Vector\, che viene usata da applicazioni a 32 bit in esecuzione su una macchina a 64 bit).

Al prossimo avvio di IE, la chiave mancante IE farà in modo che IE vada a reperire informazioni da altri moduli, dove vi sono almeno 4 diverse stringhe di caratteri (contenenti la versione, la sottoversione, la build ecc.). L'informazione ivi trovata farà in modo che gli standalone funzionino quasi perfettamente quando gli vengono presentati i commenti condizionali. Se volete ripristinare il precedente stato del registro e il comportamento del browser, rinominate la chiave zIE come IE e riavviate Internet Explorer.

Se non avete mai fatto una modifica al registro, state tranquilli perchè non è pericoloso, a patto che seguiate le istruzioni alla lettera! Ma, nel caso voi cediate alla tentazione e facciate altre modifiche, nè io nè Position Is Everything siamo responsabili di quello che potrebbe accadere!

Verificare la funzionalità dei commenti condizionali

Con i quattro diversi IE (IE 5.01, IE 5.5, IE 6 e IE 7.0) abbiamo un totale di 27 differenti espressioni (più 22 negazioni) che si possono usare in un commento condizionale, le quali funzioneranno dopo la modifica al registro. Queste "espressioni" di norma stabiliranno quali versioni di IE compariranno nel codice all'interno di un CC. Questa è la funzionalità che avete ripristinato.

Per testare le modifiche al registro, fate un test usando l'Explorer di vostra scelta, e otterrete un valore vero/falso per ciascuna delle 27 espressioni dei CC. I pattern true/false ricavati da questi test (screenshot semplificati) sono quello che vedrete nella vostra pagina di test.

Screenshot dei CC con IE 7.0 Se installate IE 7 Beta, questo è il pattern che dovreste vedere, che vale anche per gli altri IE standalone se non avete modificato il registro. Così, per dare stili unici per tutte le versioni di IE, dovete modificare il registro.

Screenshot  dei CC con IE 6Questo è il pattern che avrete con IE 6: se avete installato IE 7 Beta, lo avrete solo dopo la modifica al registro. - Ma nel caso non abbiate IE 7, questo varrà per tutte le versioni di , e quindi è fondamentale modificare il registro per dar loro stili unici.

Screenshot dei CC con IE 5.5 Tutti i risultati di IE 5.5 standalone sono ora corretti, grazie al suggerimento di Thierry Koblentz di TJKDesign: sostituite "IE 5.5" con "IE 5.5000" nelle espressioni e funzionerà!

Screenshot dei CC con IE 5.01 La modifica al registro ripristina i risultati corretti per IE 5.01.

Una discussione tecnica sui CC

Quando lanciate una versione di IE5+, questa va sul registro e pone tutti i valori del Version Vector in un array per tenerli in memoria. Questa procedura viene eseguita una volta sola all'atto dell'inizializzazione. Se una versione successiva di IE incontra i caratteri " <!--[if " mentre elabora una pagina web, essa riconosce il cosiddetto commento condizionale nascosto di livello inferiore (il termine "livello inferiore" venne coniato da MS ai tempi della "guerra dei browser" e indica un browser non-Microsoft oppure IE4 e precedenti). Verrà presa la stringa IE (o qualsiasi cosa abbiate scritto) dal commento condizionale e verrà effettuata una ricerca nell'array Version Vector per ottenere una corrispondenza (non sensibile alle maiuscole e alle minuscole). Per esempio, se scrivete:

<!--[if zIE]> ... <![endif]-->
<!--[if zIE 6.0]> ... <![endif]-->

Il risultato sarà "true" in entrambi i casi, indipendentemente dalla versione di IE che usate, se avete seguito la procedura alla lettera, altrimenti sarà "false". Ma potete facilmente sostituire il nome piuttosto che usare zIE per creare un CC personalizzato!

Perchè cambiare la chiave di registro di IE in zIE? Semplicemente perchè se IE non trova la chiave IE nel Version Vector, allora creerà tale voce nell'array del vettore di versione usando le informazioni di versione prese dai moduli come sostituti, abilitando così l'uso dei CC.

Di più sui CC: quelli brutti

A parte il CC nascosto di livello inferiore, che molte persone trovano brutto comunque, MS ha inventato anche il Commento Condizionale di livello inferiore rivelato :  <![if IE]>  ...  <![endif]> . Non solo sembra brutto, ma non viene neanche validato! Non lo avrei citato qui, ma John Lascurettes ha trovato una soluzione, usando un CC di livello inferiore rivelato all'interno di uno nascosto.

Questo costrutto è valido e ci permette di selezionare alcune cobinazioni di IE per cui non c'è soluzione se usiamo un CC nascosto (si veda "Selezionare gli IE" di seguito). Ma la soluzione è ancor più potente se esaminata in dettaglio. Cosa più importante, si può nascondere html dalla selezione di IE. Per esempio:

<!--[if IE]><![if gt IE 6]><![endif]-->
 html 
<!--[if IE]><![endif]><![endif]-->

L'elemento  html  sarà selezionato da ogni browser tranne IE 6, IE 5.5 e IE 5.01. In questo gruppo troverete tutti i browser (inclusi IE 7 e IE 5.2) che sono in grado di elaborare i selettori CSS avanzati. Inoltre, anche  html  è dentro un CC rivelato, quindi può contenere commenti e non è solo un commento dall'aspetto bizzarro. In altre parole, l'area non-standard viene ristretta per contenere solo il meccanismo di selezione per IE, ma non html.

Per una pagina funzionale, vorremmo aggiungere un più familiare CC nascosto, selezionando IE 6, IE 5.5 e IE 5.01

<!--[if lte IE 6]> html <![endif]-->

Produrre i CC con XSLT

Se volete applicare una trasformazione  lato-browser  per inserire i CC nel vostro  html , allora la prima parte dell'esempio di sopra può essere tradotta in XSLT:

<xsl:comment><![CDATA[[if IE]><![if gt IE 6]><![endif]]]></xsl:comment>
 html 
<xsl:comment><![CDATA[[if IE]><![endif]><![endif]]]></xsl:comment>

Qui  html  può essere ogni valido XSLT inclusi elementi letterali e anche commenti! Ora la seconda parte può essere costruita allo stesso modo, perchè XSLT supporta la funzione  system-property . Così usiamo di nuovo un CC rivelato all'interno di uno nascosto, inserito in un XSLT  if-clause .

<xsl:if test="system-property('xsl:vendor') = 'Microsoft'">
<xsl:comment><![CDATA[[if IE]><![if lte IE 6]><![endif]]]></xsl:comment>
 html 
<xsl:comment><![CDATA[[if IE]><![endif]><![endif]]]></xsl:comment>
</xsl:if>

Nel caso che il CC sia inserito con un XSLT  lato server , la prima parte rimane immutata. Ma la seconda parte cambia, perchè in assenza della funzione  system-property  dobbiamo accettare che un html appaia come uno pseudo-html:

<xsl:comment><![CDATA[[if lte IE 6]>
 pseudo-html 
<![endif]]]></xsl:comment>

Selezionare gli IE

Infine, possiamo selezionare ciascuna delle 16 diverse combinazioni dei 4 Internet Explorer, partendo da nessuna per arrivare a tutte. Alcune delle espressioni sono dette meno specifiche, perchè selzioneranno anche future versioni superiori alla 7.0.

I seguenti termini sono definiti come segue:

Per specificare quale versione leggerà il CC, si possono usare le seguenti combinazioni:

  1. Per selezionare esclusivamente solo  non IE  - si usi " IE  & !IE " con un CC rivelato all'interno di uno nascosto

    <!--[if IE]><![if !IE]><![endif]-->  html  <!--[if IE]><![endif]><![endif]-->

  2. Per selezionare   solo IE 5.01   - si usi " IE 5.0 " o "lte IE 5.0" o "!gt IE 5.0" o "lt IE 5.5000" o "!gte IE 5.5000"

    <!--[if IE 5.0]>  html  <![endif]-->

  3. Per selezionare  IE 5.5 o 6 or 7.0  - si usi " !IE 5.0 " o "!lte IE 5.0" o "gt IE 5.0" o "!lt IE 5.5000" o "gte IE 5.5000" (tutti meno specifici)

    <!--[if !IE 5.0]>  html  <![endif]-->

  4. Per selezionare  solo IE 5.5   - si usi " IE 5.5000 "

    <!--[if IE 5.5000]>  html  <![endif]-->

  5. Per selezionare  IE 5.01 o 6 o 7.0  - si usi " !IE 5.5000 " (meno specifico)

    <!--[if !IE 5.5000]>  html  <![endif]-->

  6. Per selezionare  solo IE 6   - si usi " IE 6 "

    <!--[if IE 6]>  html  <![endif]-->

  7. Per selezionare  IE 5.01 o 5.5 o 7.0  - si usi " !IE 6 " (meno specifico)

    <!--[if !IE 6]>  html  <![endif]-->

  8. Per selezionare  solo IE 7.0  - si usi " IE 7.0 "; o un meno specifico "!lte IE 6" o "gt IE 6" o "!lt IE 7.0" o "gte IE 7.0" o "!lt IE 7" o "IE 7" o "gte IE 7"

    <!--[if IE 7.0]>  html  <![endif]-->

  9. Per selezionare  IE 5.01 o 5.5 o 6  - si usi " lte IE 6 " o "!gt IE 6" o "lt IE 7.0" o "!gte IE 7.0" o "lt IE 7" o "!gte IE 7"; o il meno specifico "!IE 7.0" o "!IE 7"

    <!--[if lte IE 6]>  html  <![endif]-->

  10. Per selezionare  IE 5.01 o 5.5  - si usi " IE 5 " o "lte IE 5" o "!gt IE 5" o "lte IE 5.5000" o "!gt IE 5.5000" o "lt IE 6" o "!gte IE 6"

    <!--[if IE 5]>  html  <![endif]-->

  11. Per selezionare  IE 6 o 7.0  - si usi " !IE 5 " o "!lte IE 5" o "gt IE 5" o "!lte IE 5.5000" o "gt IE 5.5000" o "!lt IE 6" o "gte IE 6" (tutti meno specifici)

    <!--[if !IE 5]>  html  <![endif]-->

  12. Per selezionare  IE 5.01 o 6  - si usi " lte IE 6  & !IE 5.5000 " o, più in generale, ciascuna delle 3 coppie ({"lt IE 7", "!IE 7", "lte IE 6"},{"!IE 5.5000"}) per un CC rivelato all'interno di uno nascosto

    <!--[if lte IE 6]><![if !IE 5.5000]>  html  <![endif]><![endif]-->

  13. Per selezionare  IE 5.01 o 7.0  - si usi " !IE 6  & !IE 5.5000 " (meno specifico) per un CC rivelato all'interno di uno nascosto

    <!--[if !IE 6]><![if !IE 5.5000]>  html  <![endif]><![endif]-->

  14. Per selezionare  IE 5.5 o 6  - si usi " lte IE 6  & gte IE 5.5000 " o, più in generale, ciascuna delle 9 coppie ({"lt IE 7", "!IE 7", "lte IE 6"},{"gt IE 5.0", "!IE 5.0", "gte IE 5.5000"}) per un CC rivelato all'interno di uno nascosto

    <!--[if lte IE 6]><![if gte IE 5.5000]>  html  <![endif]><![endif]-->

  15. Per selezionare  IE 5.5 o 7.0  - si usi " !IE 6  & gt IE 5.0 " o, più in generale, ciascuna delle 3 coppie meno specifiche ({"!IE 6"},{"gt IE 5.0", "!IE 5.0", "gte IE 5.5000"}) per un CC rivelato all'interno di uno nascosto

    <!--[if !IE 6]><![if gt IE 5.0]>  html  <![endif]><![endif]-->

  16. Per selezionare  IE 5.01 o 5.5 o 6 o 7.0  - si usi " lte IE 7.0 "; o il meno specifico "gte IE 5" o "gte IE 5.0" o "lte IE 7" o "IE"; non sembra possibile usare le negazioni per questa selezione.

    <!--[if lte IE 7.0]>  html  <![endif]-->

Avrete notato la simmetria tra (2) e (3), ed anche tra (6) e (7): le espressioni per il primo sono negate dall'ultimo. Si può notare anche una maggiore ridondanza, poichè "gt xx" converte direttamente a "!lte xx", e "lt xx" converte direttamente a "!gte xx".

Manfred Staudinger
e-mail: Manfred.Staudinger@gmail.com
Ultimo aggiornamento: 18 giugno 2006
Creato il 4 febbraio 2005