Når din browser requester en webside medsender den "headers", der blot er en slags tekststrenge. En browser har ikke pligt til at identificere sig men vil normalt gøre det i "headeren" ved navn "User Agent". Det er "User Agent", der er grundlaget for den klassiske detektion af browsere, hvad angår browserfabrikat, versionsnummer og styresystem.
| Request.UserAgent | Header sendt af din browser | CCBot/1.0 (+http://www.commoncrawl.org/bot.html) |
Når browserfabrikat og versionsnummer er identificeret er det blot at slå browseren op i en tabel over browsere og deres egenskaber. I ASP.NET har Microsoft stillet en sådan tabel til rådighed i en mappe på webserveren. Tabellen over browsernes egenskaber hedder "Browser Capabilities", og "tabellen" er blot oplysninger indtastet i en sektion i en XML-fil, der hedder "machine.config".
"Browser Capabilities" indeholder kun de mest kendte browsere, og xml-filen skal opdateres, når der komme nye versioner af browserne. Det er vigtigt at slå fast, at "Browser Capabilities" kun fortæller, hvad en browser kan på papiret, ikke om du har slået funktionerne til eller fra. I følgende tabel ser du, hvad jeg har af oplysninger om din browser.
| ActiveXControls | Sand hvis browseren understøtter ActiveX-kontroller | False |
| AOL | Sand hvis browseren er en "American Online"-browser | False |
| BackgroundSounds | Sand hvis browseren kan afspille baggrundsmusik/-lyde | False |
| Beta | Sand hvis browseren er en beta-version | False |
| Browser | Browsernavn (hentet fra ServerVariables) | Unknown |
| CDF | Sand hvis browseren understøtter Channel Definition Format | False |
| ClrVersion | Version af Common Language Runtime installeret på brugerens maskine | 0.0 |
| Cookies | Sand hvis browseren understøtter cookies | False |
| Crawler | Sand hvis clienten ikke er en browser men en søgemaskine | False |
| EcmaScriptVersion | Version af European Computer Manufacturer's Association udgave af JavaScript | 0.0 |
| Frames | Sand hvis browseren understøtter frames i HTML | False |
| JavaApplets | Sand hvis browseren undersøtter Java Applets | False |
| JavaScript | Sand hvis browseren understøtter Javascript | False |
| MajorVersion | Browserens versionsnummer før kommaet (hentet fra ServerVaríables) | 0 |
| MinorVersion | Browserens versionsnummer efter kommaet (hentet fra ServerVaríables) | 0 |
| MSDomVersion | Version af Microsoft Document Object Model | 0.0 |
| Platform | Platform browseren er installeret på (hentet fra ServerVariables) | Unknown |
| Tables | Sand hvis browseren understøtter tabeller i HTML | False |
| Type | Browserens navn og versionsnummer | Unknown |
| VBScript | Sand hvis browseren understøtter VBScript direkte i browseren | False |
| Version | Browserens fulde versionsnummer | 0.0 |
| W3CDomVersion | Version af W3C's Document Object Model | 0.0 |
| Win16 | Sand hvis browseren er installeret på en 16-bit udgave af Windows, f.eks. Windows 3.1 | False |
| Win32 | Sand hvis browseren er installeret på en 32-bit udgave af Windows, f.eks. Windows 2000 | False |
På webserveren kan din browser kun identificeres ved hjælp af oplysningerne i "User Agent". Browser-sniffing "server-side" kan ikke bruges til så meget, hvis oplysningerne i "User Agent" mangler. Vi kan også få store problemer, hvis browseren foregiver at være en anden end den er, eller hvis vi ikke kender browseren i forvejen, eller hvis funktionaliteten i browseren er slået fra.
På Internettet bruger de fleste forfattere af websider kun scripting client-side (JavaScript) til identificering af browsere, dynamiske menuer, validering af formularer, åbning af nye vinduer, popup-vinduer, mouseover-effekter, til at vise og skjule ting på siden, osv.
Selv om det er muligt at programmere avanceret funktionalitet client-side, ses det sjældent i praksis, fordi det er alt for vanskeligt at få det til at virke i mere end ét browserfabrikat. Alt funktionalitet, der kan tåle at foregå på webserveren (hastighed), overflyttes hertil, fordi funktionaliteten (programmeringen) her virker uafhængigt af browserne. Browser-problemet ved programmering server-side er udelukkende at sikre præsentationen (resultatet af programmeringen) i browserne.
Objekter kan have mange "properties", "methods", "events" og "arrays". Der er flere tusinde ting, der kan være forskellige fra browser til browser, og endnu mere at teste på hvis vi skal understøtte yderligere browsere! I det følgende lister vi kun eksempler på browserobjekter, der handler om din skærm og om din browser.
| screen.width | Din skærms opløsning, bredde | |
| screen.height | Din skærms opløsning, højde | |
| screen.colorDepth | Din skærms farvedybde | |
| document.body.offsetWidth | Browservinduets bredde (IE) | |
| document.body.offsetHeight | Browservinduets højde (IE) | |
| window.innerWidth | Browservinduets bredde (Netscape) | |
| window.innerHeight | Browservinduets højde (Netscape) |
Bemærk at Internet Explorer og Netscape bruger forskellige objekter til browservinduets bredde og højde. Det har stor betydning i praksis, fordi mange websites tester for browservinduets bredde. Det gør klapmusen.dk f.eks. for at sikre, at linjelængderne ikke bliver for lange (dog ikke på denne side).
Opera 7 bruger begge metoder for at sikre sig! Hvis du ser denne webside i Internet Explorer vil du bemærke, at der står "Undefined" i de felter, der er til brug for Netscape. Omvendt vil en Netscape i de to felter, der er for Internet Explorer, returnerer ikke "Undefined" men "0". Browserne kan altså ikke engang blive enige om, hvordan du skal have besked, hvis et objekt ikke understøttes. De aller nyeste Netscape-browsere er i øvrigt på linje med Opera begyndt at understøtte både Microsofts og egne objekter!
Ovenstående er et fingerpeg om, hvor store problemer du løber ind i, hvis du forsøger at optimere dine websider til mere end et browserfabrikat. Vi kan kun gætte på, hvad de øvrige 100 browseres objekt for browservinduets bredde hedder, og hvad de returnerer af melding, hvis de ikke understøtter et objekt!
Objektet "Navigator.userAgent" returnerer de samme oplysninger som "User_Agent" detektet på webserveren. Bemærk at ikke engang de tre mest kendte browsere understøtter "userLanguage" på samme måde. Internet Explorer returnerer sproget valgt for tastaturet, Opera 7 returnerer browserens sprog og Netscape kender ikke objektet.
Bemærk også at websiden i browseren kan teste om cookies understøttes og vel at mærke, om understøttelsen er slået til eller fra i modsætning til i "Browser Capabilities", som vi så tidligere. Det er dog vanskeligt at bruge det til noget, da vi ikke på forhånd ved, hvor mange browsere, der understøtter objektet. Den eneste sikre måde at teste for cookies er at prøve, om websiden kan gemme og læse en cookie!
I stedet for at fokusere på browserfabrikat og versionsnummer bør vi i det omfang, det er muligt, teste på objekter i browseren. Vi har allerede set på et par objekter ovenfor. I følgende tabel er et par klassiske test-eksempler vist som illustration.
| if(document.images){document.write("Ja");} else {document.write("Nej");} | Understøtter din browser grafik? | |
| I begyndelsen af 90'erne, da de første browsere begyndte at understøtte grafik, blev "document.images" ofte anvendt til at skelne mellem grafik-browsere og tekst-browsere. | ||
| if(document.layers){document.write("Ja");} else {document.write("Nej");} | Er din browser Netscape 4? | |
| Netscape 4 introducerede LAYERS til brug for bl.a. DHTML. I senere udgaver valgte Netscape i stedet at understøte "W3C DOM" og helt at droppe understøttelsen af LAYERS. Det betyder, at LAYERS nu entydigt indentificerer Netscape 4. Det har dog næsten kun historisk interesse! | ||
| if(document.all){document.write("Ja");} else {document.write("Nej");} | Er din browser IE4+ eller måske Opera 7 (gisp!)? | |
| Denne test er stadig meget anvendt til at skelne mellem nye og gamle IE-browsere og til at holde andre browserfabrikater som f.eks. Opera ude, når de forsøger at snyde ved at identificere sig som Internet Explorer. Kun Microsoft's browsere fra og med IE4 understøtter "all"-objektet. Det er dog ikke længere rigtigt. Opera 7 understøtter på skrømt "all"-objektet for stadig at kunne snyde alverdens browser-sniffing, der ofte diskriminerer imod Opera! | ||
| if(document.getElementById){document.write("Ja");} else {document.write("Nej");} | Understøtter browseren "W3C DOM"? | |
| Som det fremgår af artiklen "Kunsten af sniffe en browser", er det udmærket at teste på denne måde, men der kan gå mange år før denne test er nok til at bestemme koden, vi skal skrive, hvis vi vil understøtte browsere, der følger standarderne! Årsagen er bl.a., at der kan gå mange år, før browserne er helt enige om, hvordan standarderne skal forstås, og hvordan de i praksis skal implementeres. | ||
Opdateret 12. december 2002