Din browser detektet "server-side" og "client-side"

Din browser detektet på min webserver

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.UserAgentHeader sendt af din browserCCBot/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.

ActiveXControlsSand hvis browseren understøtter ActiveX-kontrollerFalse
AOLSand hvis browseren er en "American Online"-browserFalse
BackgroundSoundsSand hvis browseren kan afspille baggrundsmusik/-lydeFalse
BetaSand hvis browseren er en beta-versionFalse
BrowserBrowsernavn (hentet fra ServerVariables)Unknown
CDFSand hvis browseren understøtter Channel Definition FormatFalse
ClrVersionVersion af Common Language Runtime installeret på brugerens maskine0.0
CookiesSand hvis browseren understøtter cookiesFalse
CrawlerSand hvis clienten ikke er en browser men en søgemaskineFalse
EcmaScriptVersionVersion af European Computer Manufacturer's Association udgave af JavaScript0.0
FramesSand hvis browseren understøtter frames i HTMLFalse
JavaAppletsSand hvis browseren undersøtter Java AppletsFalse
JavaScriptSand hvis browseren understøtter JavascriptFalse
MajorVersionBrowserens versionsnummer før kommaet (hentet fra ServerVaríables)0
MinorVersionBrowserens versionsnummer efter kommaet (hentet fra ServerVaríables)0
MSDomVersionVersion af Microsoft Document Object Model0.0
PlatformPlatform browseren er installeret på (hentet fra ServerVariables)Unknown
TablesSand hvis browseren understøtter tabeller i HTMLFalse
TypeBrowserens navn og versionsnummerUnknown
VBScriptSand hvis browseren understøtter VBScript direkte i browserenFalse
VersionBrowserens fulde versionsnummer0.0
W3CDomVersionVersion af W3C's Document Object Model0.0
Win16Sand hvis browseren er installeret på en 16-bit udgave af Windows, f.eks. Windows 3.1False
Win32Sand hvis browseren er installeret på en 32-bit udgave af Windows, f.eks. Windows 2000False

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.

Din browser detektet af min webside i din browser

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.widthDin skærms opløsning, bredde
screen.heightDin skærms opløsning, højde
screen.colorDepthDin skærms farvedybde
document.body.offsetWidthBrowservinduets bredde (IE)
document.body.offsetHeightBrowservinduets højde (IE)
window.innerWidthBrowservinduets bredde (Netscape)
window.innerHeightBrowservinduets 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!

navigator.userAgentDin browser (User Agent)
navigator.appNameDin browsers fabrikat
navigator.platformDin computers platform
navigator.userLanguageSprog valgt i dit styresystem?
navigator.cookieEnabledUnderstøttelse af cookies

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!

Testning på objekter i browseren

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