Oggetto Navigator e Cross-Browser Scripting Roberto Bruni e Daniela Giorgetti Script per tutti • Gli script visti sinora vanno bene per (la maggior parte de)i browser più diffusi • In seguito vedremo che NN e IE presentano incompatibilità su alcune scelte implementative (es. layers e DHTML) • Possiamo cercare di limitare le incompatibilità usando JS ed in particolare l’oggetto navigator Bruni e Giorgetti 2 Oggetto navigator • Rappresenta il browser in uso • Permette di ottenere informazioni su nome e versione (e altro) • Supportato da N.N. e I.E. • Ha due oggetti figli (supportati solo da NN): Plugin e Mimetype • Ogni browser può avere proprietà non standard – o anche rendere scrivibili proprietà di sola lettura (IE generalmente molto permissivo) Bruni e Giorgetti 3 navigator: proprietà fondamentali navigator.appCodeName // “Mozilla” per NN2/3/4 e IE3/4 navigator.appName // “Netscape” per NN e “Microsoft Internet Explorer” per IE navigator.platform // sistema operativo dove gira il browser, es. “Win32”, “MacPPC” navigator.appVersion //descrizione più completa della piattaforma e del browser navigator.userAgent //stringa inviata dal browser ai server nelle richieste di pagine web Bruni e Giorgetti 4 Eseguire azioni in base al browser if (navigator.userAgent.indexOf(“Mozilla/4”) == -1) { window.location = “non_Netscape_4_x.html”; }// Manda a una URL diversa da quella corrente gli utenti che non usano Netscape 4.x • Cosa succede se accediamo la pagina con IE5.5? navigator.userAgent == “Mozilla/4.0 (compatible; MSIE 5.5… • Perché? – Patto segreto tra Netscape e Microsoft? – Cospirazione Governativa? – Netscape si è infiltrato nel campus di Redmond della Microsoft? • All’epoca della “guerra dei browser” NN3.0 vs IE3.0 era comune incappare in pagine “NN only” gestite da JS! – Soluzione di IE4.0: Mozilla compatible – Notare anche la versione 4 invece che 5 (molti script usavano il test visto sopra) – Ironicamente vennero incrementate le statistiche di mercato di NN Bruni e Giorgetti 5 Netscape più onesto? • Non tanto… con NN6.0? navigator.userAgent == “Mozilla/5… navigator.appVersion == “5… – Perché? • Netscape 5.0 versione open source alla base di Netscape 6. – Che lezione ne possiamo trarre? • cautela, cautela e ancora cautela nel diversificare le pagine • provare ad accedere le pagine con più browser possibili – Uso pratico: controllare almeno appName e appVersion • userAgent meno affidabile perché passato sempre ai server Bruni e Giorgetti 6 Soluzione brutale • Scegliere una versione di un browser e supportare solo quella cacciando gli “intrusi” if (navigator.appName.indexOf(“Netscape”) == -1 || navigator.appVersion.indexOf(“5.0”) == -1) { alert(“Scarica Netscape o rinuncia al mio sito!”); window.location = “http://www.netscape.com”; } • Consigli – Cercate di essere più gentili (pochi utenti lo saranno con voi) – Supportate più browser che potete, magari rinunciando a qualche pulsante elegante o qualche animazione – Le pagine web dovrebbero avere più diffusione possibile Bruni e Giorgetti 7 Soluzione standard • Accontentate almeno gli utenti NN5/6 e IE4/5 con pagine ad hoc • Usate una pagina di default per tutti gli altri if (navigator.appName.indexOf(“Netscape”) > -1 && navigator.appVersion.indexOf(“5”) > -1) { window.location = “pagina_netscape5x_6x.html”; } if (navigator.appName.indexOf(“Microsoft”) > -1 && navigator.appVersion.indexOf(“4”) > -1) { window.location = “pagina_iexplorer4x_5x.html”; } window.location = “pagina_default.html”; Bruni e Giorgetti 8 Soluzione raffinata • Fare una sola pagina che accontenti tutti – L’idea è di settare opportunamente una variabile e testarla quando si vogliono accedere caratteristiche particolari (usarla come parametro degli script) – Si complica molto il codice, ma resta più facile da aggiornare – Vedremo esempi di questa soluzione usando DOM e DHTML var browser= “OTH”; if (parseInt(navigator.appVersion) >= 5 || navigator.appVersion.indexOf(“MSIE 5”) != -1 || navigator.appVersion.indexOf(“MSIE 6”) != -1) { browser = “DOM”; } else { if (navigator.userAgent.indexOf(“Mozilla/4”) != -1) { if (navigator.appName.indexOf(“Netscape”) != -1) { browser = “NS4”; } if (navigator.appVersion.indexOf(“MSIE 4”) != -1) { browser = “IE4”; } Bruni e Giorgetti 9 } } navigator: linguaggio utente navigator.language // lingua di default del browser, es. “en”, “it”, “fr”, “fr_CA”, etc. (solo NN4+) navigator.systemLanguage // lingua di default (solo IE4+) navigator.userLanguage // lingua dell’utente (solo IE4+) Bruni e Giorgetti 10 Pagine multi-language • Stesse soluzioni viste nel caso dei browser, ma adattate al linguaggio – Si può riconoscere prima il browser e poi andare a testare il linguaggio usando le proprietà opportune a seconda che si tratti di NN o di IE • Il pericolo è che il linguaggio del browser non sia quello veramente preferito dall’utente – Magari sta usando il browser lontano da “casa” – Oppure sta utilizzando l’ultimissima versione, non ancora disponibile nella sua lingua Bruni e Giorgetti 11 Quiz riassuntivi – Sapreste suggerire una soluzione salomonica al problema del linguaggio in cui visualizzare la pagina? – Cosa NON si può fare con JS? • spedire gli utenti Netscape ad un’altra pagina • spedire gli utenti Internet Explorer ad un’altra pagina • spedire gli utenti che usano browser che non implementano JS ad un’altra pagina • spedire gli utenti maleducati a quel… sito (o a fare un giro su web) – Come si fa ad aggiornare il browser di un visitatore della pagina? • • • • non si può con navigator.browser = “Netscape 6.0”; con window.location = “www.rottamazione.com”; con document.display = “Mozilla 2002”; Bruni e Giorgetti 12 Esercizi Bruni e Giorgetti 13