/ 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
Problemer med funktioner onresize og onloa~
Fra : Mikkel Z. Herold


Dato : 11-06-08 23:21

Hej.

Jeg har en side, hvor jeg kører en javascript-funktion ved onpageshow,
onresize og onload - det foregår sådan her (i en ekstern js-fil):

window.onpageshow = resizeLayout();
window.onresize = resizeLayout();
window.onload = resizeLayout();

Men det giver en fejl i IE ("Ikke implementeret"). Jeg har læst mig til,
at det er fordi IE ikke kan li' parenteserne, så derfor har jeg lavet
denne ikke særlig kønne udbygning:

var browser=navigator.appName;
if (browser=="Microsoft Internet Explorer"){
   window.onpageshow = resizeLayout();
   window.onresize = resizeLayout;
   window.onload = resizeLayout;
} else {
   window.onpageshow = resizeLayout();
   window.onresize = resizeLayout();
   window.onload = resizeLayout();
}

Bemærk, at parenteserne stadig er der ved funktionen på onpageshow -
ellers skete der ikke en dyt i IE! Til gengæld får jeg fejlen (Ikke
implementeret) hvis jeg sætte parenteser på de to andre (onresize og
onload).

Er det bare noget jeg må leve med, eller er der en kønnere løsning end
den ovenfor?

Mvh. Mikkel

--
"At first just a rustle of canvas
And the gentlest breath on my face"
Sting, "The Wild Wild Sea"

 
 
Lasse Reichstein Nie~ (12-06-2008)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 12-06-08 00:22

"Mikkel Z. Herold" <mikkel@[remove_this]mzh.dk> writes:

> Jeg har en side, hvor jeg kører en javascript-funktion ved onpageshow,
> onresize og onload - det foregår sådan her (i en ekstern js-fil):
>
> window.onpageshow = resizeLayout();
> window.onresize = resizeLayout();
> window.onload = resizeLayout();

Det der står her er at du kalder funktionen "resizeLayout" tre gange,
lige her, og tildeler returværdien til de tre egenskaber på "window".

Hvis resizeLayout er den funktion der skal kaldes ved, fx, en resize-
event, så er dette forkert. Så skal der stå:

window.onpageshow = resizeLayout;
window.onresize = resizeLayout;
window.onload = resizeLayout;

Hvis resizeLayout returnerer den funktion der skal kaldes, så er det
rigtigt. Jeg gætter, bl.a. ud fra navnet, at det er forkert.

> Men det giver en fejl i IE ("Ikke implementeret").

Antagelig fordi du forsøger at tildele en ikke-funktion til
window.onresize, som forventer en funktion.

> Jeg har læst mig til, at det er fordi IE ikke kan li' parenteserne,

Det er fordi parenteserne ikke skal være der. IE er bare en eneste
der giver en fejl ved det.

> så derfor har jeg lavet denne ikke særlig kønne udbygning:
>
> var browser=navigator.appName;
> if (browser=="Microsoft Internet Explorer"){
>    window.onpageshow = resizeLayout();
>    window.onresize = resizeLayout;
>    window.onload = resizeLayout;
> } else {
>    window.onpageshow = resizeLayout();
>    window.onresize = resizeLayout();
>    window.onload = resizeLayout();
> }

Ganske rigtigt ikke kønt.

> Bemærk, at parenteserne stadig er der ved funktionen på onpageshow -
> ellers skete der ikke en dyt i IE!

Da "onpageshow"-eventen ikke er understøttet af IE, så kan det ikke være
fordi det virker rigtigt.

> Til gengæld får jeg fejlen (Ikke
> implementeret) hvis jeg sætte parenteser på de to andre (onresize og
> onload).

Samme grund som ovenfor.

>
> Er det bare noget jeg må leve med, eller er der en kønnere løsning end
> den ovenfor?

Ja. Ingen parenteser. Det skulle virke. Siden vil blive resizet på onload,
med mindre senere kode overskriver window.onload.

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

Mikkel Z. Herold (12-06-2008)
Kommentar
Fra : Mikkel Z. Herold


Dato : 12-06-08 10:21

On 12-06-2008 01:21 Lasse Reichstein Nielsen wrote:
> Hvis resizeLayout er den funktion der skal kaldes ved, fx, en resize-
> event, så er dette forkert. Så skal der stå:
>
> window.onpageshow = resizeLayout;
> window.onresize = resizeLayout;
> window.onload = resizeLayout;

resizeLayout er en funktion, der i grundtræk måler højden på en div, og
derefter sætter bredden på div'en efter et bestemt målestoksforhold.

I virkeligheden er processen lidt mere kompliceret end det, da det ikke
er javascriptet, der sætter bredden. Derimod viderestiller resizeLayout
til en ny side med højden som parameter i url'en. Herefter bruger jeg
PHP til at aflæse højde-parameteren og sætte bredden på div'en i et
dynamisk stylesheet (en smule omstændigt, men på den måde skal bredden
kun sættes én gang, og ikke hver gang siden loader - bredden gemmes som
en session-variabel).

Anyway, hvis jeg fjerner parenteserne, så sker der ingenting - layoutet
bliver ikke skaleret.

> Hvis resizeLayout returnerer den funktion der skal kaldes, så er det
> rigtigt. Jeg gætter, bl.a. ud fra navnet, at det er forkert.

resizeLayout returnerer ikke noget - den viderestiller (med
window.location) til en php-side. Men der er vel stadig en funktion,
eller hvad?

> Da "onpageshow"-eventen ikke er understøttet af IE, så kan det ikke være
> fordi det virker rigtigt.

Næh, det kan selvfølgelig være derfor, den ikke brokker sig!

>> Er det bare noget jeg må leve med, eller er der en kønnere løsning end
>> den ovenfor?
>
> Ja. Ingen parenteser. Det skulle virke. Siden vil blive resizet på onload,
> med mindre senere kode overskriver window.onload.

Det virker ikke.

Jeg havde først prøvet at sætte onload, onpageshow og onresize i
body-tag'et, men det gav også problemer. Jeg kan ikke huske hvad
problemet var præcist (det er lang tid siden jeg prøvede), men jeg tror
nok, at IE ignorerede dem og derfor ikke resizede.

I øvrigt er det også nemmere at kalde funktionen fra et script i stedet
for at skulle kalde den fra body-tag'et på hver side - men det kan måske
ikke rigtig lade sig gøre?

Mvh. Mikkel

--
"At first just a rustle of canvas
And the gentlest breath on my face"
Sting, "The Wild Wild Sea"

Lasse Reichstein Nie~ (12-06-2008)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 12-06-08 23:25

"Mikkel Z. Herold" <mikkel@[remove_this]mzh.dk> writes:

> resizeLayout er en funktion, der i grundtræk måler højden på en div,
> og derefter sætter bredden på div'en efter et bestemt målestoksforhold.
....
> Anyway, hvis jeg fjerner parenteserne, så sker der ingenting -
> layoutet bliver ikke skaleret.

Det kan skyldes flere ting. Enten at funktionen ikke kaldes,
eller at den ikke gør det den skal.

Prøv at putte en "alert('hertil!');" ind i starten af funktionen
så du kan se om den kaldes.

> resizeLayout returnerer ikke noget - den viderestiller (med
> window.location) til en php-side. Men der er vel stadig en funktion,
> eller hvad?

Den er en funktion. Det er den funktion der skal kaldes ved resize,
etc., så det korrekte er at skrive
window.onresize = resizeLayout;
Ingen parenteser. Hvis det ikke virker, så skal der debugges derfra.

> Det virker ikke.
>
> Jeg havde først prøvet at sætte onload, onpageshow og onresize i
> body-tag'et, men det gav også problemer. Jeg kan ikke huske hvad
> problemet var præcist (det er lang tid siden jeg prøvede), men jeg
> tror nok, at IE ignorerede dem og derfor ikke resizede.

Så er det nok det samme den gør nu. Prøv at insætte alert'en og se
om funktionen overhovedet bliver kaldt.
Tjek også om der kommer fejlbeskedder fra Javascript'en.

> I øvrigt er det også nemmere at kalde funktionen fra et script i
> stedet for at skulle kalde den fra body-tag'et på hver side - men det
> kan måske ikke rigtig lade sig gøre?

Event-handlers på body-elementet er også scripts, så jeg er ikke sikker
på hvad forskellen er.

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

Mikkel Z. Herold (13-06-2008)
Kommentar
Fra : Mikkel Z. Herold


Dato : 13-06-08 23:51

On 13-06-2008 00:24 Lasse Reichstein Nielsen wrote:
> Prøv at putte en "alert('hertil!');" ind i starten af funktionen
> så du kan se om den kaldes.

Uden parenteser: Funktionen kaldes IKKE, hverken i IE eller FF - der er
ingen fejlmeddelelser

- Med parenteser på onpageshow: Funktionen kaldes, BÅDE i FF og IE(!)
- Med parenteser på onresize: Funktionen kaldes både i FF og IE, men IE
giver herefter en "Ikke implementeret"-fejl
- Med parenteser på onload: Samme som ved onresize

> Ingen parenteser. Hvis det ikke virker, så skal der debugges derfra.

Jeg har prøvet at debugge med Microsoft Script Editor, og når den giver
fejl, så er det ved linjen med parenteserne - altså f.eks. linjen
window.onload = resizeLayout();

> Event-handlers på body-elementet er også scripts, så jeg er ikke sikker
> på hvad forskellen er.

Det jeg mente var bare, at det er besværligt at sætte event-handlers på
body-tag'et på samtlige sider - det er nemmere, hvis man kan lægge
f.eks. en onload-event ind i det eksterne javascript, der alligevel
bliver hentet ind på alle sider. Giver det mening ...?

Mikkel

--
"At first just a rustle of canvas
And the gentlest breath on my face"
Sting, "The Wild Wild Sea"

Lasse Reichstein Nie~ (14-06-2008)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 14-06-08 16:11

"Mikkel Z. Herold" <mikkel@[remove_this]mzh.dk> writes:

> On 13-06-2008 00:24 Lasse Reichstein Nielsen wrote:
>> Prøv at putte en "alert('hertil!');" ind i starten af funktionen
>> så du kan se om den kaldes.
>
> Uden parenteser: Funktionen kaldes IKKE, hverken i IE eller FF - der
> er ingen fejlmeddelelser
>
> - Med parenteser på onpageshow: Funktionen kaldes, BÅDE i FF og IE(!)

Selvfølgelig. Du kalder den selv, omgående. Det viser at funktionen
virker, men løser ikke problemet med at få den kaldt ved resize.

Der skal *ikke* være parenteser.

> - Med parenteser på onresize: Funktionen kaldes både i FF og IE, men
> IE giver herefter en "Ikke implementeret"-fejl

Samme fejl som før. Funktionen kaldes med det samme, og dens ubrugelige
returværdi forsøges tildelt til onresize-attributten.

> - Med parenteser på onload: Samme som ved onresize

Jep, samme fejl, samme grund.

>> Ingen parenteser. Hvis det ikke virker, så skal der debugges derfra.
>
> Jeg har prøvet at debugge med Microsoft Script Editor, og når den
> giver fejl, så er det ved linjen med parenteserne - altså
> f.eks. linjen window.onload = resizeLayout();

Ja. Den viser ikke hvorfor onresize-handleren ikke blive kaldt ved
resize. Det er det problem der skal løses.

> Det jeg mente var bare, at det er besværligt at sætte event-handlers
> på body-tag'et på samtlige sider - det er nemmere, hvis man kan lægge
> f.eks. en onload-event ind i det eksterne javascript, der alligevel
> bliver hentet ind på alle sider. Giver det mening ...?

Jep.
Kan du uploade siden til et eller andet sted og give et link til den.
Bedst hvis du kan skære den ned til kun at have nok med til at vise
problemet. Jeg har nået min grænse for hvad jeg kan diagnosticere
uden at se hele koden :)

/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