Avatar billede cold_raider Nybegynder
19. juni 2008 - 19:58 Der er 16 kommentarer og
1 løsning

Fejl i IE men ikke i FF

Hej!

Jeg har kodet noget javascript ud fra AJAX kontrollen ResizableControl og det virker super fint i Firefox og opera osv. men ikke i internet explorer.. Den kommer med en fejl " 'null' er null eller ikke et objekt ". Jeg har led tog ledt og prøvet dit og dat og jeg kan simpelthen ikke gennemskue det.
Fejlen opstår når jeg prøver at kalde functionen på OnLoad i bodyen, altså  <body onload="OnClientResize();"> scriptet virker sådan set også fint nok ellers, bare ikke på onload.

Håber i kan gennemskue det, her er koden.


<script type="text/javascript">
   
    function OnClientResize () {
        if(document.getElementById('<%= checkProportioner.ClientID %>').checked == true)
        {
            var rcp = $find('ResizeImageBehavior');
            var size = rcp.get_Size();
            var txtWidth = document.getElementById('<%= txtWidth.ClientID %>');
            var txtOldWidth = document.getElementById('<%= txtOldWidth.ClientID %>');
            var txtHeight = document.getElementById('<%= txtHeight.ClientID %>');
            var txtOldHeight = document.getElementById('<%= txtOldHeight.ClientID %>');
           
            document.getElementById('HeightSliderDiv').style.visibility = "hidden";
            document.getElementById('HeightBoxDiv').style.visibility = "hidden";
                                       
            var newWidth =  txtWidth.value;
            var newHeight = newWidth/txtOldWidth.value*txtHeight.value;
            txtHeight.value = newHeight;
            rcp.set_Size( { width: newWidth, height: newHeight } );
            txtOldWidth.value = txtWidth.value;
            txtOldHeight.value = txtHeight.value;
            return false;
        }
        else
        {
            document.getElementById('HeightSliderDiv').style.visibility = "visible";
            document.getElementById('HeightBoxDiv').style.visibility = "visible";
            var rcp = $find('ResizeImageBehavior');
            var size = rcp.get_Size();
            rcp.set_Size( { width: document.getElementById('<%= txtWidth.ClientID %>').value, height: document.getElementById('<%= txtHeight.ClientID %>').value } );
            return false;
        }
       
    }
   
    function OnResizing () {
        var rcp = $find('ResizeImageBehavior');
        var txtWidth = document.getElementById('<%= txtWidth.ClientID %>');
        var txtHeight = document.getElementById('<%= txtHeight.ClientID %>');
        var size = rcp.get_Size();
        txtWidth.value = size.width;
        txtHeight.value = size.height;
        return false;
    }
   
</script>
Avatar billede w13 Novice
19. juni 2008 - 21:20 #1
Hmm. Så har den måske alligevel ikke nået at lave alle de rette elementer, som funktionen skal bruge, selvom den køres onload. Hvad hvis du retter til:

<body onload="setTimeout('OnClientResize()',1000);">

Virker det så? (Selvfølgelig med en forsinkelse på et sekund!)
Avatar billede erikjacobsen Ekspert
19. juni 2008 - 23:20 #2
Næppe derfor - må vi få et link til siden?
Avatar billede w13 Novice
20. juni 2008 - 08:15 #3
Jeg kan ikke forestille mig, hvad det ellers skulle være, hvis det virker alle andre steder end onload. Kunne vel muligvis skyldes, at noget JavaScript mangler at oprette et element eller så.
Avatar billede olebole Juniormester
20. juni 2008 - 12:34 #4
<ole>

w13 >> det kan jeg nu sagtens  =)

Hvad er indholdet af funktionen '$find'? Bevares, der burde ikke være en funktion med begyndelsesbogstavet '$' - men da man nu har valgt den konstruktion, så bør vi nok se den, da der jo kunne være noget i den, som konflikter med IE.

Ligger der noget brugbart i de forskellige ASP-variabler? Ellers _skal_ fejlen jo opstå. Man kunne forestille sig, de kommer et sted fra, hvor værdien ikke bliver sat i IE - ikke mindst, hvis de fremkommer på baggrund af et Ajax-kald.

/mvh
</bole>
Avatar billede cold_raider Nybegynder
20. juni 2008 - 14:31 #5
Hej
tak for de hurtige svar!
setTimeout('OnClientResize()',1000); løser ikke problemet.
$find('ResizeImageBehavior') er en fuktion der finder denne kontrol
<cc1:ResizableControlExtender ID="ResizeImageControl" runat="server" BehaviorID="ResizeImageBehavior"
                        TargetControlID="ResizeImageDiv" HandleCssClass="resizeBoxHandle" ResizableCssClass="resizeBox"
                        MinimumHeight="10" MinimumWidth="10" HandleOffsetX="3" HandleOffsetY="3" />

Jeg kan desværre ikke vise det online da det ligger på en lukket server.
Øhmm så det er ikke muligt, men hvis i vil se mere kode så bare sig til.
Avatar billede cold_raider Nybegynder
20. juni 2008 - 14:32 #6
Det skal også sige javascriptet ligger i en UserControl ved ikke om det kan være årsagen?
Avatar billede cold_raider Nybegynder
20. juni 2008 - 15:52 #7
Jeg tror muligvis fejlen ligger i
    if(document.getElementById('<%= checkProportioner.ClientID %>').checked == true)
fordi jeg satte koden ind i Masteren og der kom den med en fejl om at CheckBoxen ikke kunne findes og det er vel rigtig nok hvis koden bliver kørt før CheckBoxen er blevet oprettet. Så jeg skal på en eller anden måde få kaldt function når siden er loadet men først efter CheckBoxen er blevet oprrettet. Deter i hvert fald det som jeg tror der kunne være fejlen... Andre forslag?
Avatar billede w13 Novice
20. juni 2008 - 15:57 #8
Men du kører vel først den funktion onload, gør du ikke? Så burde checkboxen jo være lavet, medmindre checkboxen laves med JavaScript.
Avatar billede cold_raider Nybegynder
20. juni 2008 - 15:59 #9
Haha!

setTimeout('OnClientResize()',1000);  løste rent faktisk problemet!!

jeg havde bare glemt at jeg kørte en funktion på OnLoad i bodyen så jeg skulle bare sætte det ind i den funktion istedet for Bodyen.

Super duper,  w13 smid et svar så får du største delen af pointne hvis i vil kan i andre få resten fordi i ledte mig ind på svaret :)

Igen tak :D
Avatar billede w13 Novice
20. juni 2008 - 16:07 #10
:P
Avatar billede w13 Novice
20. juni 2008 - 16:07 #11
Men ellers skal du vel bare sørge for at kalde det, lige efter du opretter checkboksen. Det er lidt mere stabilt end at vente et sekund.
Avatar billede cold_raider Nybegynder
20. juni 2008 - 18:40 #12
har bare sat timeout på 1 så virker det og man kan ikke se delayet... Egentlig lidt mærkeligt at det virker selv med så lidt Timeout :P
Avatar billede w13 Novice
21. juni 2008 - 11:34 #13
Jeg mener, Roenving engang kom frem til, at alle timeouts under ca. 33 bliver tolket som 33 alligevel. Det er den nedre grænse for, hvor lille et timeout må være.
Avatar billede w13 Novice
21. juni 2008 - 11:34 #14
Men det er nu stadig meget hurtigt!
Avatar billede erikjacobsen Ekspert
21. juni 2008 - 12:24 #15
Jeg gætter bare: det er ikke længden af den timeout, der betyder noget, men blot at den er der, for det bevirker at den bliver sat bagefter det andet, der skal gøres først.

Og en dag spørgeren har god tid, kunne det måske være smart at strikke koden sammen på en måde, så det slet ikke er nødvendigt. :)
Avatar billede olebole Juniormester
21. juni 2008 - 14:17 #16
Hvis det at spørgeren får godt tid skulle falde sammen med en mere substantiel opdatering af visse browsere, vil der være en god chance for, timeout'en kan undværes. Desværre er det også min erfaring, at det - trods udfoldelse af stor kreativitet - er nødvendigt at give browseren et pusterum til rendering.

At et element er oprettet, er desværre ikke altid ensbetydende med, det kan tilgås i næste øjeblik. Om der så står 1 eller 33 i timeout'en er somregel uden betydning.
Så vidt jeg ved, er der ikke nogen officiel grænse for, hvor kort en timeout må være ... men det er et heftigt diskussionsemne i mange fora. Det veksler fra PC til PC, men det ligger nok i området 20-40 msek  =)
Avatar billede cold_raider Nybegynder
21. juni 2008 - 17:42 #17
På et tidspunkt skal jeg nok ha lavet det smartere, men det vigtigste er at det virker og 1000 tak for det :)
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

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