/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
link med onclick
Fra : Martin


Dato : 28-01-08 01:07

Hej...

Jeg sidder lige og grupler over en lille ting...
Hvis der er javascript, så skal href'en ikke gøre noget, men hvis der
ikke er javascript, så skal href'en bruges

Lad os antage dette

<a href="enside" onclick="YS.doThis()">...</a>

Hvis man har javascript installeret og virkende, så vil browseren
selvfølgelig køre doThis(), men så vil den så åbne "enside" bagefter,
som den jo netop ikke skal.

Så kan man jo lave en

<a href="enside" onclick="return OO.doThis()">...</a>

Men hvis doThis() funktionen er kørt og udført korrekt, så er det godt
nok dårlig skik at lade den returne false.

Men så kunne man jo lave den som
<a href="enside" onclick="return (OO.doThis()===false ? false :
true)">...</a>

Men det er også temmelig omstændigt

Så kan man lave en
<a href="enside" onclick="OO.doThis(this)">...</a>

var OO = {
doThis: function(e) {
e.href = '';
}
}

Men det bliver godt nok omstændigt når der er temmelig mange forskellige
funktioner der skal udføre diverse ting.

Er der nogle andre muligheder?

PS:
Det er et site som har ca. 50-100.000 besøgende om dagen så, der er
nogle mennesker som ikke kan køre javascript (eller har slået det fra),
så helst ikke noget med "hvis ikke de kan køre javascript så lad de få være"

 
 
Lasse Reichstein Nie~ (28-01-2008)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 28-01-08 01:23

Martin <martin@aarhof.eu.invalid> writes:

> Hvis der er javascript, så skal href'en ikke gøre noget, men hvis der
> ikke er javascript, så skal href'en bruges
>
> Lad os antage dette
>
> <a href="enside" onclick="YS.doThis()">...</a>
>
> Hvis man har javascript installeret og virkende, så vil browseren
> selvfølgelig køre doThis(), men så vil den så åbne "enside" bagefter,
> som den jo netop ikke skal.

Derfor skal man returnere false.

> 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.

<a href="enside" onclick="OO.doThis(); return false;">...</a>

Det eneste problem er at hvis der er en *fejl* i OO.doThis, så
bliver "return false" ikke udført.

Det nemmeste er at undlade at lave fejl :) Ellers kan man forsøge
at pakke det ind i try/catch, men det vil få ældre browsere til
at stå af i stedet.


> <a href="enside" onclick="return (OO.doThis()===false ? false :
> true)">...</a>

Eller "return !OO.doThis();". Men igen, bare returner false direkte.

> Det er et site som har ca. 50-100.000 besøgende om dagen så, der er
> nogle mennesker som ikke kan køre javascript (eller har slået det
> fra), så helst ikke noget med "hvis ikke de kan køre javascript så lad
> de få være"

Ordentligt designede sider virker også uden Javascript ... bare lidt
langsommere (da det så skal foregå på serveren).
Sider der bare bryder sammen uden Javascript giver et meget dårligt
indtryk.
Så jeg er helt enig i at man ikke skal ignorere ~5% af sine potentielle
brugere/kunder :)


/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.'

Martin (28-01-2008)
Kommentar
Fra : Martin


Dato : 28-01-08 02:18

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>


Lasse Reichstein Nielsen wrote:
> Martin <martin@aarhof.eu.invalid> writes:
>
>> Hvis der er javascript, så skal href'en ikke gøre noget, men hvis der
>> ikke er javascript, så skal href'en bruges
>>
>> Lad os antage dette
>>
>> <a href="enside" onclick="YS.doThis()">...</a>
>>
>> Hvis man har javascript installeret og virkende, så vil browseren
>> selvfølgelig køre doThis(), men så vil den så åbne "enside" bagefter,
>> som den jo netop ikke skal.
>
> 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...

Hvis en vare derimod ikke er fundet, så skal der returneres false


>
>> 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 :)


>
> <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.

>
> 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

> Det nemmeste er at undlade at lave fejl :) Ellers kan man forsøge
> at pakke det ind i try/catch, men det vil få ældre browsere til
> at stå af i stedet.

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 :)

>
>> <a href="enside" onclick="return (OO.doThis()===false ? false :
>> true)">...</a>
>
> 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)

Så hellere
return (OO.doThis()===false ?? : true)
(som jeg lige lærte hehe)

>
>> Det er et site som har ca. 50-100.000 besøgende om dagen så, der er
>> nogle mennesker som ikke kan køre javascript (eller har slået det
>> fra), så helst ikke noget med "hvis ikke de kan køre javascript så lad
>> de få være"
>
> Ordentligt designede sider virker også uden Javascript ... bare lidt
> langsommere (da det så skal foregå på serveren).
> Sider der bare bryder sammen uden Javascript giver et meget dårligt
> indtryk.
> Så jeg er helt enig i at man ikke skal ignorere ~5% af sine potentielle
> brugere/kunder :)

Designet er der ingen problemer med... kan også godt ses på mobile
enheder (også uden Opera Mini) - og en tekstbrowser (Lynx) "viser" også
siden ganske fornuftigt - Mobilenheder er faktisk et væsentligt krav af
kunden til dette site, og det som jeg selv har testet på min K610i så
virker javascript og ajax ikke specielt hurraaaa, derfor faktisk hele
dette spørgsmål :)

Lasse Reichstein Nie~ (28-01-2008)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 28-01-08 07:19

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.'

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste