29. december 2006 - 00:18Der er
68 kommentarer og 2 løsninger
Hvorfor virker denne event-håndtering kun i IE?
Hej Eksperter!
Prøver at lave således at jeg lidt nemmere kan tilføje events til mine elementer...
Dertil jeg har lavet mig et par funktioner, men det virker kun i IE - hvad gør jeg galt? :S
Koden er som følger: -----------------------------------------------------------
function browser() { var browser = navigator.userAgent;
if (browser.indexOf('Gecko')>-1) return "FF"; //Mozilla og Netscape else if (browser.indexOf('Opera')>-1) return "Opera"; //Opera else if (browser.indexOf('MSIE')>-1) return "IE"; //Internet Explorer else return false; }
function addonloadevent(func) { var oldonload = window.onload;
function addevent(elm,event,func) { if (browser() == "IE") { elm.attachEvent('on' + event,func); } else elm.addEventListener(event,func,false); }
function validate(f) { if (f.brugernavn.value == '') { alert('Du skal indtaste dit brugernavn'); f.brugernavn.focus(); return false } else if (f.password.value == '') { alert('Du skal indtaste dit password'); f.password.focus(); return false }
document.login.action = '?login';
return true }
function setfocus() { if (document.login.brugernavn.value == '') document.login.brugernavn.focus(); else document.login.password.focus(); }
function events() { addevent(document.getElementById('login'),'submit',function(){return validate(document.getElementById('login'))}); }
Udover din kode er rodet, ser det umiddelbart ikke forkert ud. Andre browsere som Firefox burde give din en fejlmeddelse, så hvis du kan finde sådan en og poste den ville det være rart.
Ellers skal vi til at fabrikere et HTML document først, og det er træls :/
tømmer ff altid cachen når en ny version findes? fx i IE er jeg nødt til at sætte den til at deaktive cache når jeg oploader nye js-filer, det er ikke nødvendig for at teste i ff?
ang. min indsættelse af submit-event så er den stadig ikke helt i top i ff... den afbryder ikke afsendelsen som den gør i ie - hvad gør jeg galt der?
document.login skulle være fin nok når du har en <form name="login"> (note: name, ikke id!) men document.getElementById('login') er meget bedre, så brug den.
Selvom jeg kører: function events() { addevent(document.getElementById('login'),'submit',function(){return false;}); }
- Så submitter den stadig ... tester lidt, det virker umiddelbart somom at FF ikke accepterer nedkortningen. Jeg rodede selv med short events og endte vist med noget eval() som jeg droppede da det ikke var så slemt at skrive alt ind på min side
Windcape, vi er i xhtml så login.submit er vel ikke ok?
eval, er det ikke php? eller har javascript noget tilsvarende?
jeg kunne godt tænke mig at have det så nemt som muligt da det skal være grundstenen for mine fremtidige sider (ved at lave mig en administrationsskabelon)
- eval er dog ikke en standard men en "browser proprietær" ting hedder det vist (har vist fået det forklaret af Rønving eller Olebole for x antal måneder siden)
elskermad.dk har lige ledt og ledt, men kan ikke lige finde det, min pc er et værre rod, jeg havde det liggende i test, men da jeg altid har fået at vide at eval var "uha" så er det muligt at det er røget ud ... men tester ( lang tid siden jeg har rodet med js efterhånden ... )
function setfocus() { if (document.getElementById('login').brugernavn.value == '') ... rettes til: if (document.getElementById('login').brugernavn.getAttribute('value') == '') ...
...
Og en lille bi-ting - bør addonloadevent(func){} ikke baseres på attachEvent og addEventListener istedet for window.onload som benyttes p.t. ...
ehmn, jeg kan stadig ikke få det til at virke - i IE bliver valideringen kørt to gange hvorefter den afbryder afsendelsen. i ff bliver valideringen kørt én gang men den afbryder ikke afsendelsen.
Det virker som det skal i IE, men i FF bliver valideringen ikke gennemført korrekt. Den er begyndt at overholde return false, men den kommer ikke videre fra valideringen af brugernavnet, selvom man indtaster noget...
Kode er som følger: -------------------------------------------------------------
function browser() { var browser = navigator.userAgent;
if (browser.indexOf('Gecko')>-1) return "FF"; //Mozilla og Netscape else if (browser.indexOf('Opera')>-1) return "Opera"; //Opera else if (browser.indexOf('MSIE')>-1) return "IE"; //Internet Explorer else return false; }
function addEvent(elm,event,func) { if (browser() == "IE") { elm.attachEvent('on' + event,func); } else elm.addEventListener(event,func,false); }
function addonloadevent(func) { var oldonload = window.onload;
function validate() { if (document.getElementById('brugernavn').getAttribute('value') == '') { alert('Du skal indtaste dit brugernavn'); document.getElementById('brugernavn').focus(); return false } else if (document.getElementById('password').getAttribute('value') == '') { alert('Du skal indtaste dit password'); document.getElementById('password').focus(); return false }
function validate() { if (document.getElementById('brugernavn').value == '') { alert('Du skal indtaste dit brugernavn'); document.getElementById('brugernavn').focus(); return false } else if (document.getElementById('password').value == '') { alert('Du skal indtaste dit password'); document.getElementById('password').focus(); return false }
... der er fejl i FF's getAttribute("value") - så det er en af ulemperne ved xhtml, jeg håber at de snart får det rettet. Jeg har stødt på den flere gange selv. getAttribute("value") returnerer "" hvad der svarer til defaultValue hele tiden :-(
"hvordan vil du omskrive addonloadevent så den overholder xhtml mclemens?" Det kan jeg ikke hitte ud af ... Jeg synes ikke at jeg kunne få tilføjet flere funktioner i enden af hinanden ved brug af xhtml standard ...
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title><meta name="robots" content="index, follow">
<script type="text/javascript">
function browser() { var browser = navigator.userAgent;
if (browser.indexOf('Gecko')>-1) return "FF"; //Mozilla og Netscape else if (browser.indexOf('Opera')>-1) return "Opera"; //Opera else if (browser.indexOf('MSIE')>-1) return "IE"; //Internet Explorer else return false; }
function addEvent(elm,event,func) { if (browser() == "IE") { elm.attachEvent('on' + event,func); } else elm.addEventListener(event,func,false); }
addEvent(window,"load",function(){alert(";)");}); addEvent(window,"load",function(){alert("næsten - dog spejlvendt fra den ene browser til den anden");}); addEvent(window,"load",function(){alert("virker");}); addEvent(window,"load",function(){alert("Det");});
Problemstillingen med .getAttribute('value') vs. .value vs. .defaultValue ses i dette eksempel:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title><meta name="robots" content="index, follow">
<script type="text/javascript">
function browser() { var browser = navigator.userAgent; if (browser.indexOf('Gecko')>-1) return "FF"; //Mozilla og Netscape else if (browser.indexOf('Opera')>-1) return "Opera"; //Opera else if (browser.indexOf('MSIE')>-1) return "IE"; //Internet Explorer else return false; }
function addEvent(elm,event,func) { if (browser() == "IE") { elm.attachEvent('on' + event,func); } else elm.addEventListener(event,func,false); }
Der er overhovedet ikke fejl i Firefox getAttribute('value'), getAttribute vil retunere den værdi du har skrevet i din HTML, hvis værdien er ændret senere af en bruger skal du bruge inputField.value :-) Samme gælder forresten for at lave persistant data i XUL.
Man kan ikke rigtig sige at der er fejl i IE i dette tilfælde :-) Jeg hælder også til at det ville være ligeså korrekt at gøre som IE gør, men jeg tror Firefox har valgt at lade getAttribute hente værdien fra det orginale DOM pga. opbygningen i XUL (Firefox er jo baseret på et XML+javascript API, som tilsammen danner XUL).
Jeg har lige surfet lidt rundt nu og fandt så: http://www.eksperten.dk/spm/751439#rid6561509 olebole "Her er problemet blot, at FF ikke understøtter getAttribute-metoden på et elements value, korrekt."
"The attribute's effective value is determined as follows: if this attribute has been explicitly assigned any value, that value is the attribute's effective value; otherwise, if there is a declaration for this attribute, and that declaration includes a default value, then that default value is the attribute's effective value; otherwise, the attribute does not exist on this element in the structure model until it has been explicitly added. Note that the nodeValue attribute on the Attr instance can also be used to retrieve the string version of the attribute's value(s)."
Hvis jeg forstå dette korrekt, så er gør IE det faktisk forkert :-) Selvom det er den mest logiske vej.
Hmm, det bunder jo ud i at den skal hente attributtens værdi "Retrieves an attribute value by name."
Det er så en vurdering, om hvorvidt værdien er den oprindelige eller den, som brugeren har givet den. Jeg vil her være enig med Ole på punktet om at attributtens værdi ikke længere er default værdien, men istedet den nye værdi, som brugeren skriver ind.
- Det er altsammen en vurdering da det selvfølgelig kan læses på to måder afhængig af hvad man vurderer som værende en attributs værdi.
En ting er dog sikkert manglende standarder er dræbende, og at value opfører sig som den gør i FF er ikke sjovt, da det gør det en smule mere besværligt. ( Selvfølgelig blot min holdning til det )
At firefox snupper .value i et xhtml dokument gør ikke at .value er optimalt under xhtml.
- Hvis du læser frem og tilbage i de tråde hvor Olebole har snakket om xhtml ser du omtalt at Firefox accepterer htmldom bindinger af hensyn til sloppy coders. Og det er på dette punkt at det er vigtigt at man har det hele oppe i xhtml niveau da det ikke er meningen at browsere bør tage hensyn til sloppy coders, specielt dumt er IE's sikkerhedsnet: http://www.eksperten.dk/spm/734465#rid6443411
At IE ikke understøtter xhtml er ikke en overraskelse.
mclemens: Hvis OleBole tror det er pga. Sloppy coders, er det måske fordi har ikke har arbejdet med XUL (hvilket jeg har, og jeg havde præcis samme problem i XUL, derfor jeg kendte løsningen).
Men ECMAscript standarden er ret gammel, og Firefox har allerede Javascript 1.7 hvilket betyder at Mozilla er en del foran de andre browsere. Jeg tror ikke rigtig man kan sætte en rettesnor for Javascript, så i tilfælde som dette vil jeg nok bare kode efter hvad der virker, og være lidt ligeglad med hvad der er etisk korrekt :-)
Mozilla/Netscape har trosalt været en af de helt store standardsættere inden for Javascript. (JScript var Microsofts pendant).
Næh, jeg er ikke sikker på hvad Olebole tror på det punkt. Han har bare sagt at det ikke er godt at den accepterer htmldom. Jeg siger at det må være p.gr.a. Sloppy coders - nu har jeg selv været en Sloppy coder for 1½ år siden (ren html baseret med attribut design samt topmargin, center m.v.) og laver til tider selv noget Sloppy noget, når det lige skal gå hurtigt for at klaske et eksempel op til demo. I ordet Sloppy lægger jeg at man laver noget for at det skal virke efter hensigten uden at gå helt op i standarder, etik eller effektivitet.
- Blot for at skrive at Olebole ikke har brugt udtrykket Sloppy coders.
windcape >> Det er korrekt, at der ikke står noget sted, det skal være den aktuelle værdi, man henter med getAttribute - men i så fald eksisterer der ikke en metode til at hente den aktuelle værdi under X(HT)ML i FF (eller for den sags skyld i W3C's ECMA-DOM bindinger) ... og det kan jo ikke være meningen =)
I eksemplet (29/12-2006 13:29:14) tvinger du browseren til at bruge HTML-parseren til at behandle dokumentet ... så meget for FF's XHTML-understøttelse! ;o) Hvad IE angår, så er det ikke nogen hemmelighed, at MS - i modsætning til Mozilla - har valgt at vente med at understøtte XHTML, til de har et helt nyskrevet, toptunet markup-lag færdigt. Det har der været megen snak om på MS' udviklings-blog i forbindelse med udviklingen af version 7.0.
Den løsning, du tror, du har fundet p.gr.a. dit arbejde med XUL, er som sagt en ikke-løsning, der fjerner de væsentligste grunde til at bruge XHTML - nemlig at koden behandles som XML. Jeg har også arbejdet en masse med XUL, men ved alligevel stadig, hvordan X(HT)ML skal behandles =) Derudover er der ikke så meget tale om JavaScript, men om de af W3C standardiserede ECMA-DOM bindinger.
FF er lysår bagud i forhold til dens forgængere Netscape og de første Mozilla'er. Hele dens DOM-lag er f.eks. komplet fucked og _intet_ valideres, når du bruger DOM-handlinger. Det var ikke tilfældet i de tidligere Gecko-baserede browsere - men det er lykkedes FF's udviklerhold at ødelægge mere end de har gjort godt! :o|
De tilgængelige browsere er desværre nogenlunde lige elendige - omend deres elendigheder ligger på lidt forskellige områder. Mellem to dybe grøfter ligger ofte en farbar vej ;o)
elskermad.dk >> preventDefault-metoden bruger du i f.eks. FF, ligesom du bruger event.returnValue=false i IE ... altså til at modvirke at browserens default-handling udføres, når en event fyres af
Hvis den bruge HTML ville Firefox's Generated Source (webdev toolbar) vise en html4 version, dvs. /> konverteret til > etc. Så den bruger skam dens XML parser.
Men godt at vi er enige om at getAttribute ikke nødvendigvis skal hente brugerens data, selvom det er mest logisk , hehe.
Jamen, det er blot fordi, FF heller ikke på dette punkt opfører sig i overensstemmelse med standarderne - og fordi FF's XHTML-understøttelse i høj grad er en pseudo-understøttelse, der bygger på et XML-lag, som mere eller mindre grad er en dårlig klon af HTML-laget. En XML-parser _må_ ikke håndtere den viste syntaks ... simple as that! ;o)
FF kan såmænd også bruge innerHTML under XHTML - og det på trods af, at den property aldrig har været valid i nogen standard og heller aldrig bliver det. Hvad i alverden innerHTML har at gøre med XML (som XHTML jo er et subset af) er en lodret gåde! Det er ovenikøbet med fuldt, overvejet overlæg, man har implementeret denne property (det skete for et årstid siden). Hvis ikke det er at forsøge at please sloppy kodere, ved jeg virkelig ikke, hvad man vil angive som undskyldning!
Når vi nu (med overgangen til 'nye' standarder) har chancen for at få stringente browsere, der faktisk tager standarderne højtideligt, er det jo pokkers ærgeligt, det kun er MS, som agter at deltage i dén del af festen. Det ville have været klædeligt, om Mozilla levede op til sine forgængeres høje standarder ... men ak! :o|
hehe ok :-) Dog synes jeg ikke MS har taget sig ordenlig sammen i IE7. Det er vel næsten kun Safari som har seriøse udviklere ? (Den bestod ACID2 for et stykke tid siden)
Men kan du lige bekræfte eller afkræfte ideen med at .value er en lovlig attribute for de elementer den er defineret for under XHTML også ? (Det er den jo så vidt jeg kan læse på DOM level 2 specifikationerne, men det er så nemt at misforstå noget).
Vi diskutterede omkring HTMLInputElement.value var en legal property under XHTML, eller om det kun er HTMLInputElement.getAttribute('value') der er korrekt.
Samt om eventhandlers bør sættes i dokumentet som her <form action="" method="post" onsubmit="alert(this.foobar.value); return false;"> - Istedet for at tilføjes via. attachEvent / addEventListener ...
Faldt tilfældigt over denne tråd igen ... og er blevet lidt klogere i mellemtiden :)
Problemet er ikke FF, men XHTML/W3C! getAttribute("value") _skal_ hente attributten, som den står skrevet i koden. Da man ikke må bruge ELEMENT.value, eksisterer der ikke idag en brugbar/valid måde at hente dynamiske værdier ud af element-objekter.
- vi venter med spænding på XForms =)
Synes godt om
Ny brugerNybegynder
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.