Avatar billede visto Professor
13. juni 2009 - 18:29 Der er 13 kommentarer og
1 løsning

Javascript menu's browser tjek

Jeg bruger coolMenus v. 3.02 på min hjemmeside. Idet jeg personligt bruger Internet Explorer som browser, har jeg erfaret, at der skal skrives lidt til, hver gang den del af versionsnummeret, der udgøres af et tal større end 1 skifter, fx når der gås fra version 6.x til 7.x.
Hvis der i nedenstående ikke står
this.ie8=(this.ver.indexOf("MSIE 8")>-1 && this.dom)?1:0;
og senere
||this.ie8
så dør menuen simpelthen i IE 8.

Jeg har imidlertid ikke tilføjet noget for de andre browseres vedkommende, og det kan sagtens tænkes, at der derfor er et eller andet der ikke virker der.
Hvad bør jeg tilføje til nedenstående for at være sikker på at menuen virker i alle de mest almindelige browsere? - Indføj det venligst i den nuværende kode, da jeg ikke aner hvad de koder betyder og hvordan man håndterer dem.

Her er så hvad der står i menuens kode aktuelt:

Default browsercheck - Leave this one
******************************************************************************/
function lib_bwcheck(){ //Browsercheck (needed)
    this.ver=navigator.appVersion; this.agent=navigator.userAgent
    this.dom=document.getElementById?1:0
    this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom)?1:0;
    this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom)?1:0;
    this.ie7=(this.ver.indexOf("MSIE 7")>-1 && this.dom)?1:0;
    this.ie8=(this.ver.indexOf("MSIE 8")>-1 && this.dom)?1:0;
    this.ie4=(document.all && !this.dom)?1:0;
    this.ie=this.ie4||this.ie5||this.ie6||this.ie7||this.ie8
    this.mac=this.agent.indexOf("Mac")>-1
    this.opera5=this.agent.indexOf("Opera 5")>-1
    this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
    this.ns4=(document.layers && !this.dom)?1:0;
    this.bw=(this.ie7 || this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5 || this.dom)
    return this
}
var bw=new lib_bwcheck() //Making browsercheck object
Avatar billede thesurfer Nybegynder
13. juni 2009 - 23:47 #1
Så vidt jeg ved, kræves de samme ting for både IE 7 og IE8.. muligvis også IE6 (IE5 har der vist altid været bøvl med)..

Derfor kunne man konkludere, at hvis IE er større end 5, er det lige meget om det er IE 6/7/8..

For sjov skyld kunne man prøve følgende, som burde virke hvis IE7 og IE8 har samme funktionalitet:


    this.ie7=( (this.ver.indexOf("MSIE 7")>-1 || this.ver.indexOf("MSIE 8")>-1) && this.dom)?1:0;

Hvilket betyder "hvis det er IE7 eller IE8, så er det IE7"..



Alternativt kan man gøre sådan her, hvis antager at alle fremtidige versioner af IE opfører sig ordentligt:

    this.ie7=( (this.ver.indexOf("MSIE ")>-1 && !this.ie4 && !this.ie5 && !this.ie6 ) && this.dom)?1:0;


Det skal så lige siges, at række følgen så skal være:



    ... de første linier og så: ...
    this.dom=document.getElementById?1:0
    this.ie4=(document.all && !this.dom)?1:0;
    this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom)?1:0;
    this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom)?1:0;
    this.ie7=(this.ver.indexOf("MSIE 7")>-1 && this.dom)?1:0;
    this.ie7=( (this.ver.indexOf("MSIE ")>-1 && !this.ie4 && !this.ie5 && !this.ie6 ) && this.dom)?1:0;
    this.ie=this.ie4||this.ie5||this.ie6||this.ie7||this.ie8;
    ... resten af linierne ...
Avatar billede thesurfer Nybegynder
13. juni 2009 - 23:49 #2
Eksempel:


function lib_bwcheck(){ //Browsercheck (needed)
    this.ver=navigator.appVersion; this.agent=navigator.userAgent
    this.dom=document.getElementById?1:0
    this.ie4=(document.all && !this.dom)?1:0;
    this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom)?1:0;
    this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom)?1:0;
    this.ie7=(this.ver.indexOf("MSIE 7")>-1 && this.dom)?1:0;
    this.ie7=( (this.ver.indexOf("MSIE ")>-1 && !this.ie4 && !this.ie5 && !this.ie6 ) && this.dom)?1:0;
    this.ie=this.ie4||this.ie5||this.ie6||this.ie7;
    this.mac=this.agent.indexOf("Mac")>-1
    this.opera5=this.agent.indexOf("Opera 5")>-1
    this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
    this.ns4=(document.layers && !this.dom)?1:0;
    this.bw=(this.ie7 || this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5 || this.dom)
    return this
}
Avatar billede thesurfer Nybegynder
13. juni 2009 - 23:50 #3
..man kunne vel også bare aflæse hvad der står bag "MSIE ", og se om tallet er større end 6.. igen hvis IE7 og op efter opfører sig på samme måde..
Avatar billede visto Professor
14. juni 2009 - 12:32 #4
Tak for dit input.

Jeg har muligvis ikke udtrykt mig klart nok. Der er ingen problemer med IE, så længe jeg husker at indføje det nævnte, fx når der skiftes til IE 9. Og det kan jeg godt overkomme at gøre.

Jeg tænker derimod på, om der ikke mangler noget for ANDRE browseres vedkommende. Fx står der ikke noget om Mozilla, og der mangler muligvis også noget om andre browsere, som jeg evt. ikke kender til.

Grundet mine manglende forstand på koderne, tør jeg ikke rigtig afprøve noget "for sjov" men vil gerne holde mig til det sikre og så enkelt og let som muligt.
Avatar billede thesurfer Nybegynder
14. juni 2009 - 15:24 #5
Alle nyere browser understøtter "Document Object Model" ("DOM"), hvilket der også spørges til her:

    this.dom=document.getElementById?1:0

Hvis browseren understøtter "document.getElementById", sættes "this.dom" til "1" (hvilket betyder "ja" / "sand" / "true").. ellers sættes "this.dom" til "0".


Længere nede spørges der om det er en kendt browser eller ("||" betyder "eller") om det er en der understøtter DOM:

    this.bw=(this.ie7 || this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5 || this.dom)

Dvs, hvis bare 1 af de ting der står mellem parenteserne er "1/sand/true", så er det ok.



Med hensyn til din forespørgsel, om der mangler noget til de andre browsere:

Hvis det er en nyere browser, vil browseren automatisk sikre at funktionaliteten er der, da den så vil sige "1" til denne her:

    this.dom=document.getElementById?1:0


Med andre ord:

Det vil altid virke med nyere browsere, selv om de ikke står i listen.
Med mindre at producenten af browseren har valgt at gå tilbage til hulemands tiden, og direkte fjerne (udelade) DOM.. hvilket absolut ikke giver mening.



Man skal dog huske følgende:

Da browserene ikke opfører sig 100% ens, kan det være nødvendigt at vide hvilken browser det er. Dvs., sommetider er det ikke nok at vide at det er en ny browser, og at den understøtter DOM.

Eksempel:
IE6 opfører sig lidt anderledes end IE7, og på samme måde er IE7 lidt anderledes end IE8. Derfor kan det være en god ide, at vide hvilke IE-browser der er tale om, selvom de alle 3 er nyere browsere og alle understøtter DOM.
Avatar billede thesurfer Nybegynder
14. juni 2009 - 15:38 #6
Hvis man så bort fra opførslen af forskellige version af samme browser, kunne man faktisk skære funktionen ned til omkring 6 linier.

Hvis browserne faktisk understøttede DOM som de skulle, og opførede sig ordentligt, skulle man sådan set bare undersøge om browseren understøttede DOM.

Hvis browseren ikke understøttede DOM, var det en gammel browser.. fra omkring 90'erne.. og der er helt sikkert kommer sikkerhedsopdatering osv. til browseren..

Men, men, men.. sådan er det ikke.. :-)

Det er nemmere og mere sikkert at tilføje linier kode til funktionen, end at risikere at man forhinde browsere i at bruge menuen.
Avatar billede visto Professor
15. juni 2009 - 14:03 #7
Jeg er ikke sikker på at jeg helt forstår alt hvad du skriver.

Jeg opfatter det du skriver som, at alle nye browsere understøtter"DOM", og at der derfor ikke burde være noget problem, og at jeg dermed i terorien ikke behøver indføje ny kode for nye browserversioner.

Dette modsiges af, at menuen, som nævnt i mit første indlæg, simpelthen ikke virkede i IE 8, før jeg havde indføjet det nævnte.

Skal jeg forstå det sidste, du skriver, som at det netop er en god ide for en sikkerheds skyld at indføje dette (altså som jeg har gjort)? - Det har jo under alle omstændigheder vist sig absolut nødvendigt, så det kan jo ikke undværes.

Og så er spørgsmålet igen, om andet bør tilføjes for en sikkerheds skyld, eller om jeg (nogenlunde) kan regne med at det virker i alle moderne browsere bortset fra IE, der, som virkeligheden har vist, kræver disse tilføjelser til koden?
Avatar billede thesurfer Nybegynder
15. juni 2009 - 21:28 #8
Fra et sikkerhedssynspunkt, er det farligt at bruge ældre versioner af en hvilken som helst browser, da man så er fuldstændig sårbar over for angreb.


I mine øjne er det irrelevant at checke for IE4 og IE5.

IE4 udkom i september 1997 (kørte i Windows 95 / 95C), og IE5 i marts 1999 (kørte i Windows 98 SE).

De versioner er håbløst bagefter, med hensyn til understøttelse af nutidens standarder, og mangler en masse opdateringer, da de IE-versioner ikke bliver opdateret mere..

Deres "livscyklus" (=perioden som Microsoft holder produktet i live med opdateringer osv) udløb for omkring 6 år siden.

De eneste miljøer, som jeg har set at man stadigvæk brugte Windows 95, var interne computere på lager, som ikke havde adgang til internettet.


IE6 udkom i august 2001, lige før Windows XP, og IE7 udkom i Oktober 2006. De to (IE6 og IE7) er nok de mest brugte IE-browsere i dag.

IE8 udkom i marts 2009.

Hvis brugere bruger en gammel "Windows NT x.xx" maskine, kører han højst sandsynligt med IE4 eller IE5.



Med hensyn til IE6, IE7, IE8, IE9, IEx...

Hvis IE 7 og op efter opfører sig på samme måde, som f.eks. IE7 gør lige nu, kan man nøjes med:

    this.ie7=(this.ver.indexOf("MSIE ")>-1 && this.dom)?1:0;

På den måde vil fremtidige IE-browsere blive behandlet som værende IE7.

Det er kun skidt, hvis browser IEx ikke opfører sig som IE7 (og så skal man checke navnet), ellers er der ingen problemer.



Opera er nået til version 9.64 (version 10 er i beta), og ifølge Operas changelog, har der været 66 versioner (inkl. beta, inkl. minor) siden version 5.

Er det virkeligt nødvendigt at checke for version 5?



Den nyeste version af Netscape er version 9.

Support af Netscape sluttede 1. marts 2008, ifølge Netscapes website.

Der har været 24 versioner (inkl. minor), siden version 4.

Netscape understøtter DOM, i modsætning til NS4, som der checkes for (da den ikke understøtter DOM).



Snart er der ikke noget der hedder "Internet Explorer" på Mac, da denne ikke længere er understøttet af Microsoft.

Så vil det hedde enten Safari eller Firefox, eller en af de mindre brugte browsere.

Disse browsere er up-to-date, og understøtter DOM.




Problemet (der gør at det kan blive nødvendigt at kende browseren) er at (næsten) alle browsere har deres skævheder.

Der kan f.eks. være en pixels forskel på liniehøjden, eller forskellige måder at håndtere visse egenskaber på elementer.

Dette er gældende for både ældre og nutidige browsere.

Browserene vil nok aldrig opføre sig 100%, men omkring 90% - 95%, vil jeg skyde på.




Thomas Brattli (ham der har lavet menuen) skriver (i version 4):

"In theory we should use object detection, but this script needs work-arounds for almost every browser"

Med andre ord:

Spørg hvad browseren kan, i stedet for hvad den hedder. - men næsten alle browsere har skævheder.

Det med at spørge hvad browseren hedder, i stedet for hvad den kan, kan give problemer.

Hvis en browser (der er fravalgt pga manglende understøttelse af et eller andet) pludseligt understøtter det den ikke gjorde før (f.eks. pga en mini-opdatering), skal man rette i koden.

Ellers ville man jo udelukke en browser, der fungerer fejlfrit.



Det er op til dig, om du (for en sikkerhedsskyld) vil tilføje en linie hver gang der kommer en ny version, eller bare sige "smid de gamle browsere væk".



PS:
Faktisk synes jeg at Coolmenus er en elendig menu.
Jeg hader Coolmenus.. den tillader mig ikke engang at højreklikke på et menupunkt, og åbne det i et nyt tab/fane.
- hvor primitiv kan man være?

Den nyeste version af Coolmenus er 4 Beta (4.06 Beta).

Sidst opdateret d. 13 november 2002.


Hmm.. jeg tror ikke at http://www.dhtmlcentral.com/projects/coolmenus/ har været opdateret i lang tid..

Desuden ser det ud til at siden er blevet hacket..

Med mindre at de med vilje reklamerer for viagra???

Se bunden af siden.
Avatar billede visto Professor
17. juni 2009 - 17:59 #9
Ved at læse dit sidste indlæg bliver jeg klar over, at jeg ikke aner, hvad det browser tjek, som menuen foretager, går ud på. Min eneste anledning til at beskæftige mig med det er, som indledningsvis nævnt, at menuen ikke virkede i IE 8 uden at jeg satte diverse ting vedr. IE 8 ind i koden for browsertjekket. Og at det således så ud til at være en nødvendighed i visse tilfælde at tjekke for browseren hvis den overhovedet skulle virke.

Om det så fx er nødvendigt at checke for Opera version 5 aner jeg ikke, idet jeg ikke bruger Opera og ikke ved om menuen overhovedet fungerer med den browser. Men der sker vel ikke noget ved at have koden med. Det der - jfr. IE problematiken - optager mig er, om der skal MERE kode med ikke mindre, idet den vel næppe skader noget og heller ikke optager nogen resurser. Jeg er ikke kodeteoretiker. Skidtet skal bare virke, dvs. folk skal kunne se min hjemmeside med diverse browsere.

Ifølge en af mine tællere optræder følgende browsere i statistiken udover IE i diverse versioner: Firefox 2 & 3, Safari, Google Crome, Opera 9, Konqueror 3, Netscape 5, Mozilla, "Andre brosere".

Skal jeg forstå det med at du skriver, at det "kan være nødvendigt at kende browseren" = at der skal tjekkes for browseren for at undgå forskelligt udseende? I så fald er det en alvorlig mangel, at der intet står i koden om Firefox, hvor jeg ved at min hjemmeside ser lidt skæv ud hist og pist, og det er ikke godt, da ca. 10% af læserne bruger den browser.

Jeg gentager, hvad jeg skrev i første indlæg: Jeg forstår ikke de koder og beder blot om hjælp til konkret kode i sin helhed, der gør, at menuen virker uproblematisk for "alle".
Avatar billede thesurfer Nybegynder
17. juni 2009 - 21:54 #10
Kort: Da alle nyere browsere understøtter DOM (og DOM er kommet for at blive), burde menuen virke i alle nyere browsere. Tilføj bare flere linier (f.eks ie8, ie9, osv). Heller for meget kode, end for lidt.


Lidt længere: Det samme som "kort", med tilføjelsen "Da alle browserne er lidt forskellige, og har hver deres små skævheder, kan det være nødvendigt at vide hvilken browser det er, samt versionsnummeret, for at korrigere småfejl."



Jeg har lavet en lille test, som kan fortælle dig om en given browser er understøttet:

1) Tag en hvilken som helst browser.

2) Åben din hjemmeside i browseren.

3) Indsæt denne linie (skal stå som 1 linie) i adressefeltet:

java script: t="";b=top.indhold.bw; for(p in b) {t+=p+" : "+ eval("b."+p) + "\n";}; alert(t); void(0)

4) Fjern mellemrummet mellem "java" og "script", som Eksperten.dk automatisk indsætter.

5) Tryk på ENTER-tasten.


Så får du et resultat der ligner dette, som fakisk stammer fra browseren Firefox 3:


ver : 5.0 (Windows; en-US)
agent : Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11
dom : 1
ie5 : 0
ie6 : 0
ie7 : 0
ie8 : 0
ie4 : 0
ie : 0
mac : false
opera5 : false
ns6 : 1
ns4 : 0
bw : 1
filter : false


Det man skal se efter, er det der står bag "bw :".

Hvis der står "1" (eller måske "true"), er browseren understøttet.


Det sjove (om man vil) er så, at alle fremtidige browser vil sige "bw : 1", da de understøtter DOM (se "dom : 1" i resultatet), hvilket der checkes for her:

    this.dom=document.getElementById?1:0


Så er der kun skævhederne tilbage, som kan være afhængig af browserversionen.

(Egentligt er det jo ikke "browserversioner" men "browsere".. fordi IE6, IE7, IE8 osv jo sådan set er selvstændige browsere, og har intet med hinanden at gøre.)



Gav det mening?
Avatar billede thesurfer Nybegynder
17. juni 2009 - 22:37 #11
Lidt mere officielt:

java script: t="";b=top.indhold.bw; for(p in b) {t+=p+" : "+ b[p] + "\n";}; alert(t); void(0)

(husk mellemrummet der skal fjernes)
Avatar billede visto Professor
16. juli 2009 - 14:24 #12
Du må undskylde min sene respons.

>Kort: Da alle nyere browsere understøtter DOM (og DOM er kommet for at blive), burde menuen virke i alle nyere browsere. Tilføj bare flere linier (f.eks ie8, ie9, osv). Heller for meget kode, end for lidt.

Det mærkelige er jo så, at menuen ikke virker i de forskellige IE udgaver, med mindre jeg tilføjer kode, som nævnt i forb.m. IE8 i det oprindelige spørgsmål. Så det bliver jeg ved med, hver gang IE kommer i en ny udgave.

Jeg har prøvet din test og får nogenlunde samme svar. Dog forstår jeg ikke, at flere versioner af IE ikke skulle være understøttet - men det er også ligemeget, for jeg ved det virker. Og her tæller praksis højere end teori. Så jeg kan ikke rigtig se den praktiske anvendelighed for testen.

Jeg siger tak for dine inputs og beder dig lægge et svar, hvorefter jeg vil afslutte spørgsmålet.

Jeg håber så at menuen virker i alle mulige og umulige browsere. Og hvis der er en der læser disse linjer, og som konstaterer at siden ikke virker i vedkommendes browser, hører jeg gerne om det...
Avatar billede thesurfer Nybegynder
17. juli 2009 - 20:13 #13
Du snupper bare selv pointse.. :)
Avatar billede visto Professor
18. juli 2009 - 09:50 #14
Tak igen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Alle kurser indenfor Microsoft 365 – både til begyndere og øvede.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester