Newsgroup: it.comp.lang.javascript
Titolo: riconoscere il browser

Ciao a tutti,
probabilmente č una argomento "stradiscusso" per cui chiedo scusa in 
anticipo :)
Sono alle prime armi con JavaScript, e per saperne di piů mi servirebbe 
capire come si fa a riconoscere i principali browser.
Qualcuno potrebbe per favore indicarmi un codice commentato o una fonte da 
studiare?
Poiché il mio scopo č capirci qualcosa :) mi accontento anche di una 
soluzione semplice (per esempio uno script base che individua solo l'ultima 
versione di explorer, firefox e opera).
Ciao e grazie in anticipo,
mike
--
per scrivermi togliere "togliquesto" dall'inidirizzo

 capire come si fa a riconoscere i principali browser.
Non ti serve.
"browser sniffing", così come veniva chiamato all'epoca, è una tecnica
della vecchia scuola; e come molte dell'epoca concettualmente errata.
Viene utilizzata tutt'oggi solo in casi estremi, in cui sussistano
singolare bug del browser, ma si tende sempre a risolvere in modo diverso
(vedasi compilazione condizionale di IE).
Attualmente si tende all' "object checking". In sostanza si verifica il
tipo di oggetto e i suoi metodi / proprietà, prima di usarlo.
Il concetto è il seguente: "Non mi interessa chi sei, ma ciò che sai fare."
Ai tempi della vecchia scuola si aveva un codice del genere:
var 	ie=document.all?1:0,
	ns=document.layers?1:0;
if (ie){
	/* fai cose solo per ie */
}else if (ns)(
	/* fai cose solo per ns */
}
Il che era concettualmente sbagliato. Ci si affidava all'esistenza o meno
di una certa proprietà (o più proprietà/metodi) per definire il tipo di
browser che avevamo di fronte, e poi agire di conseguenza.
In pratica, in base a ciò che si credeva di avere davanti, si dava per
scontato che sapesse fare certe cose.
Se supportava il document.all allora era IE, e come tale sapeva fare anche
altre cose, anche se non le avevamo "controllate". Il che, però, non è del
tutto corretto. Ed Opera ce l'ha insegnato, inserendo anch'essa un
document.all.
L'object checking ribalta il concetto: si verifica cosa sa fare, a
prescindere di chi ci troviamo davanti.
Ad esempio, ripescando una vecchia funzione scritta in questo NG:
/* simple get reference crossbrowser ~ (c) ZER0 */
function getRef(id){
        if (document.getElementById && document.getElementById(id))
                return document.getElementById(id);
        else if (document.all && document.all[id])
                return document.all[id];
        else if (document.layers && document.layers[id]){
                document.layers[id].style=document.layers[id];
                return document.layers[id];
        }else return null;
}
Questa funzione verifica che il browser attuale "supporti"[1] per l'oggetto
document, il metodo getElementById, e verifica anche che l'esecuzione di
tale metodo restituisca un oggetto.
Se tali condizioni non sono verificate, allora passa a verificare nel
medesimo modo il supporto di document.all, per poi arrivare a
document.layers. Se nessuno di questi è "supportato", restituisce null.
Come vedi, qui non si avvalorano variabili per definire il browser usato.
Qui document.all e document.layers non vengono usati per definire qualcosa
di diverso da ciò per cui servono: ovvero recuperare il riferimento ad un
elemento. Prima di farne uso, viene verificato il supporto delle stesse, in
modo da optare per il metodo migliore, partendo dagli standard
(getElementById) e "scendendo".
[1] Leggendo questo recente post potrai meglio comprendere come mai ho
messo "supporti" tra virgolette:
http://groups.google.it/group/it.comp.lang.javascript/msg/9f9764a98fa38b29
-- 
var SEI	= "1+5", NOVE = "8+1";
// dump TheAnswerToLifeTheUniverseAndEverything :
alert("Cosa ottieni moltiplicando "+
	eval(SEI)+" per "+eval(NOVE)+"? "+eval(SEI+"*"+NOVE));

 ha scritto nel messaggio 
news:1tvarqfu...@ID-171124.news.individual.net...
[cut]
Scusa se ti rispondo solo adesso (con circa una settimana di ritardo) ma ho 
avuto un po' di casini con il computer. Ti volevo ringraziare per la 
disponibilità. Mi sei stato molto utile per chiarirmi le idee.
Grazie di nuovo.
ciao,
mike