Martin <martin@aarhof.eu.invalid> writes:
> Lasse Reichstein Nielsen wrote:
> Burde egentlig nok forklare lidt hvad slut resultatet gerne skulle
> præstere :)
>
> Noget ala en ajax webshop, hvor varerne bliver smidt i kurven via
> ajax, men hvis javascript er slået fra, så skal der kaldes en href
> istedet.
>
> Helt præcist ser et hurtigt eksempel således ud
>
> <a href="/items/245632" onclick="OO.basket.addItem(245632)">Smid i kurv</a>
Jep, og hvis OO.basket.addItem(...) lykkes (dvs, den udfører ikke en fejl),
så skal linket ikke følges. Beskrivelsen af elementet er:
Når bruger trykker på link:
- hvis javascript er enabled:
1. tilføj vare til vogn
2. returner false fra handler for at forhindre link.
- hvis javascript ikke er enabled
1. kald server med vare og tilføj til vogn der
Det opfyldes præcist af:
<a href="/items/245632"
onclick="OO.basket.addItem(245632); return false;">Smid i kurv</a>
>> Derfor skal man returnere false.
>
> Noget javascript som er udført perfekt, skal da ikke returner false,
> det mener jeg bestemt er imod "reglerne" eller rettere sagt imod
> kodnings reglerne...
Det afhænger da fuldstændigt af hvad returværdien betyder.
I dette tilfælde er det onclick-handleren der skal returnere false,
ikke den metode du kalder i handleren.
For en event-handler betyder en false returværdi netop det du skal
bruge: følg ikke linket (fordi jeg har taget mig af det).
> Hvis en vare derimod ikke er fundet, så skal der returneres false
Det må "addToBasket" gerne gøre. Det betyder ikke at det skal påvirke
returværdien af handleren.
>
>>
>>> Så kan man jo lave en
>>>
>>> <a href="enside" onclick="return OO.doThis()">...</a>
>> Det har ikke noget med OO.doThis at gøre at der skal returneres
>> false. Det skal altid ske.
>
> Skal der altid returneres false? - Den må du lige forklare :)
Fordi at returnere false fra handleren forhindrer at linket bliver
fulgt.
>
>> <a href="enside" onclick="OO.doThis(); return false;">...</a>
>
> Nja.. men hvad nu hvis doThis() har proppet en varer i kurven (via
> ajax) så skal den netop ikke kalde "enside" og det mener jeg denne
> ville gøre.
Nej, dette vil netop forhindre at "enside" bliver fulgt.
Ligegyldigt om OO.doThis har gjort det den skal eller har opgivet,
så længe den ikke udfører en fejl.
>
>> Det eneste problem er at hvis der er en *fejl* i OO.doThis, så
>> bliver "return false" ikke udført.
>
> Da jeg arbejder udfra nyere browsere (min. IE6, min. Firefox 2 osv) så
> virker javascriptet 99% altid der, men hvis nu der skulle forvilde sig
> en IE5 ind på siden (eller en firefox 1.x) så kunne det jo være at
> javascriptet ikke fungerer 99%... Om et element (eller en varer)
> eksisterer vil der selvfølgelig altid blivet tjekket op på, og
> returneret false hvis det ikke eksisterer, og hvis noget ajax skulle
> lave en failure, så vil den selvfølgelig også returner false
Du skal beslutte hvad du vil gøre hvis Ajax en fejler, eller hvis den
ikke kan finde varen. Skal man så følge linket? Eller ved man at
det også vil fejle? (Det var det jeg regnede med).
Hvis doThis() udføres uden fejl (altså så graverende fejl at udførslen
afbrydes, ikke bare de forudsete specialtilfælde som den selv håndterer),
så regner jeg med at det ikke vil hjælpe at følge linket.
Hvis javascript overhovedet er slået til, så håndterer vi det derigennem.
> Try/catch er rigtig gode, men svjh så er IF (eller switch) bedre
> supportet af ældre browsere, så IF's bliver nu brugt mest... hvorfor,
> aner det ikke :)
De virker IKKE ens. try-catch fanger udførselsfejl. Eks.:
try {
var x = undefined;
x.foo();
} catch (e) {
// x.foo findes ikke!
}
alert("vi overlevede"); // vi kommer hertil uden at fejle
Det kan kun gøres ved at teste hvis man kan forudsige fejlene.
>> Eller "return !OO.doThis();". Men igen, bare returner false direkte.
>
> Njaa.. ikke helt, for en funktion kan jo også returner '' (altså en
> tom streng, men ikke false)
Den kan returnere mange ting. Jeg regner med at du ved hvad den
returnerer. Hvis den returnerer både false og den tomme streng,
og de betyder forskellige ting, så skal man selvfølgelig tage
højde for det.
Men du bruger jo ikke den tomme streng til noget her, så hvorfor
returnere den?
> Så hellere
> return (OO.doThis()===false ?? : true)
> (som jeg lige lærte hehe)
Så hellere
return OO.doThis() !== false
Du behøver *aldrig* at have en "if" eller end "?:" hvor
værdierne bare er true/false.
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:
http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'