Avatar billede monkeysee Nybegynder
17. januar 2005 - 13:33 Der er 14 kommentarer og
1 løsning

JS objekt fejl i MSIE ?

jeg har defineret et objekt i mit frameset (top)

myObj=new object()

og en funktion som sletter objektet (også i top):

function deleteObj(){
delete myObj
}


dette virker fint og kan kaldes fra undervinduer i browseren. MEN hvis jeg derimod tilgår og forsøger at slette objektet direkte, altså:

delete top.myObj

så risikerer jeg at der opstår "objektet understøtter ikke denne handling", eller værre endnu "der er ikke mere hukommelse".

Ingen af disse fejl opstår på firefox, kun MSIE!

Er der nogen som kan kaste lys over hvad der foregår, det er temmelig mystisk...
Avatar billede monkeysee Nybegynder
17. januar 2005 - 13:44 #1
- Update- MSIE5.5 crasher når jeg forespørger objekt-typen (typeof) efter jeg har kaldt deleteObj(). Den BURDE returnere "undefined" som værdi
Avatar billede monkeysee Nybegynder
17. januar 2005 - 14:02 #2
- Update II - jeg har placeret en lille test suite på adressen

http://www.irisworks.dk/test/

(prøv at klikke på "top.createObject()" og dernæst "delete top.objDlg")
Avatar billede olebole Juniormester
17. januar 2005 - 16:51 #3
<ole>
Det er ukorrekt brug af delete i JScript  :)
delete-operatoren i JScript kan ikke slette et objekt - men et element i et objekt eller array (som jo er to forskellige repræsentationer af én og samme datastruktur).
Prøv at sætte objektet til null i stedet  ;o)

/mvh
</bole>
Avatar billede monkeysee Nybegynder
17. januar 2005 - 17:00 #4
OK, men ifølge javascript implementationen fra netscape kan man godt slette objekter med delete (og det virker jo sådan set også i firefox). Jeg tjekkede lige Jscript, og der står jo godt nok at man kun kan benytte funktionen på objekt-egenskaber og array-elementer.

Men slemt at jeg kan crashe browseren ;-). Jeg tester lige hvordan "null" fungerer.
Avatar billede olebole Juniormester
17. januar 2005 - 17:08 #5
Det at rytte op i IE har altid været noget rod ... den har en elendig garbage-collection - og så er den faktisk ikke svær at crashe  :o|

Kommentaren "Prøv at sætte objektet til null i stedet" var nok lidt underspillet ... det fungerer helt fint  ;o)
Avatar billede monkeysee Nybegynder
17. januar 2005 - 18:29 #6
man skal sætte objektet til "void(null)" for at slette det - jeg prøvede at tjekke typeof() og den påstod at det stadig var et objekt efter at være blevet sat til null.

Jeg går ud fra at det er fordi null er ...ingenting. Og derfor rent faktisk ikke gjorde noget ;-) ?
Avatar billede olebole Juniormester
17. januar 2005 - 18:34 #7
Nej, det er nok fordi, du ikke helt er opmærksom på, hvad browseren fortæller dig  ;o)
Ja, det er naturligvis et object ... men ikke af typen 'Object':

var o = {};
alert(o)
o = null;
alert(typeof o)
o.bla = "noget"; // Genererer en fejl, da o ikke længere er et [object Object]
Avatar billede olebole Juniormester
17. januar 2005 - 18:36 #8
... eller du kan prøve denne:

var o = {};
alert(o.toString())
o = null;
alert(o.toString())
Avatar billede monkeysee Nybegynder
17. januar 2005 - 20:35 #9
Hm...eksperten var lige nede en kort stund ?

"Ja, det er naturligvis et object ... men ikke af typen 'Object'"

Hm...nu er jeg ikke sikker på jeg er med :-).

Hvis jeg benytter den metode du foreslår så vil et tjek på typeof() stadig kaste en "object" af sig, hvilket er præcis hvad jeg ønsker at undgå. Der er flere typer end object,string,function,number og undefined?

Jeg ønsker at fjerne alle referencer til et objekt - som om det aldrig havde eksisteret - men også med void(null) metoden er det ikke helt det samme som hvis objektet aldrig havde eksisteret - jeg kan nemlig stadig sige alert(mitObjekt) og istedet for at kaste en fejl af sig så svarer browseren undefined.
Måske den garbage collection du snakkede om?
Avatar billede olebole Juniormester
17. januar 2005 - 21:06 #10
Jeg fornemmer, du er ude på lidt dybt vand i forhold til din benlængde  :)
Garbage-collection handler om oprydtning af variabler, m.m. Det er præcis, hvad vi taler om her.

Du kan ikke fjerne alle referencer til 'o', men objektet 'o' eksisterer ikke længere som et 'Object', når du har sat det til værdien 'null'. Det eksisterer kun som en tom variabel:

var o = {"myProp":"Værdien af propertyen"};
o = null;
o.bla = "Noget nyt";
alert(o); // Her udløses en fejl, da o ikke længere er et Object
Avatar billede olebole Juniormester
17. januar 2005 - 21:11 #11
Problemet opstår sikkert, fordi du ikke forstår betydningen af begrebet 'object'. Et objekt, der er instantieret ved en af følgende metoder:
var o = {};

var o = new Object();

function MyObj(){
  return this;
}
var o = new MyObj();

- har alle typen [object Object]. Det er ikke det samme som typen object  :)
Avatar billede monkeysee Nybegynder
17. januar 2005 - 21:52 #12
OK så sagt på en anden måde så kan man ikke fjerne objektet (eller gå ud fra at det kan lade sig gøre) når det først er skabt? Hvilket samtidig vil sige at den gyldne regel er at tjekke for "null", istedet for at gå ud fra "undefined" ?

"What is done can't be undone" - meget lidt typisk computere i øvrigt...

Og nej, jeg er tabt bag den berømte vogn, men når først teorien blander sig med bugs á la internet explorer, så bliver det sgu' kompliceret :-)

Men tusind tak indtil videre, lærerigt som altid <ole>
Avatar billede olebole Juniormester
18. januar 2005 - 00:24 #13
Taktak ... Ja, det lyder, somom du er ved at have fanget den  :)
Nu ved jeg ikke præcist, hvad du kender til JS-objekter og -arrays, men jeg har skrevet denne lille artikel, du måske kan hive lidt info ud af:
  http://www.eksperten.dk/artikler/227
- om ikke andet står der lidt om array- kontra dot-notaion og hvordan man kan bruge det til dynamisk tilgang til properties  :)
Avatar billede monkeysee Nybegynder
18. januar 2005 - 21:00 #14
Kommentar, kommentar, - og et svar!
du har fortjent points for hjælpsomheden så send et svar...?
Avatar billede olebole Juniormester
18. januar 2005 - 21:14 #15
oki ... thnx  ;o)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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