Avatar billede softspot Forsker
14. december 2005 - 15:23 Der er 5 kommentarer og
1 løsning

OBJECT og W3CDOM - Hvordan og hvilke faldgruber er der?

Jeg har en udfordring, nemlig at jeg skal kunne vise og skjule et variabelt antal flashstreams for et vilkårligt antal brugere.

Til dette formål benytter jeg en skabelon á la:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="215" height="170" align="middle">
  <param name="parameter1" value="value1" />
  <param name="parameter2" value="value2" />
  <param name="FlashVars" value="v1=##v1##&v2=##v2##" />
  <embed src="flashfil.swf" FlashVars="v1=##v1##&v2=##v2##" menu="false" quality="high" wmode="transparent" width="215" height="170" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

hvor jeg så udskifter ##v1## og ##v2## inden jeg lægger html-koden ind i tabelcelle (som oprettes med DOM til formålet) via innerHTML. Dette ser ud til at fungere og giver mig et stream der kører. Når dette stream skal skjules, benytter jeg removeChild() på hele den række hvor objektet ligger. Det ser også ud til at fungere fint nok...

Jeg oplever imidlertid ofte, at IE 6.0 går ned med en runtimefejl når jeg lukker det vindue hvor jeg har lavet dette "trick". Derfor er jeg interesseret i at høre, om der er nogen herinde som kan forklare mig, hvordan jeg skal gøre dette korrekt, så der ikke hænger nogle "løse ender" i DOM og evt. giver anledning til runtimefejl i browseren...

Hvad sker der f.eks. med det objekt jeg fjerner fra DOM med funktionen removeChild()? Skal det behandles specielt fordi det indeholder et "object", eller er det nok bare at fjerne det fra DOM og smide referencen væk (i håbet om at objektet så dør sammen med referencen), eller hvad?

Jeg havde en lidt spøjs oplevelse med Opera 7.54, der tilsyneladende stadig, med document.getElementById(), kunne finde et element jeg havde fjernet med removeChild() - jeg troede kun disse funktioner arbejdede på document-objektet og med de objekter som var tilkoblede efterkommere... men Opera synes at have en anden opfattelse... Kan det hænge sammen med at der var et object i den række jeg fjernede?
Avatar billede roenving Novice
15. december 2005 - 14:21 #1
1. Såvidt jeg ved, kan du spare embed-tagget (der jo heller ikke er valid html-kode !-) væk, hvis du sætter en data-attribut på selve object-tagget ...

2. Vil det ikke være bedre bare at udskifte værdien, som ikke skal bruges til noget andet ?-)

-- såvidt jeg husker kan du få fat i en parameter som en egenskab på tagget:

objectObjekt.FlashVars.value = "v1=##v1##&v2=##v2##";
objectObjekt.data = "v1=##v1##&v2=##v2##";

3. Fjerner du et html-element med removeChild() findes det stadig, der er bare ikke nogen reference til det, måske kan du assigne det til en variabel, og så sætte den til null bagefter !o]

var remObj = parObj.removeChild(chObj);
remObj = null;

-- absolut utestet !-)
Avatar billede softspot Forsker
15. december 2005 - 18:43 #2
Ad 1. Jeg vil ikke påstå at jeg ved så meget om brugen af object- og embed-elementerne, så jeg har bare (som mange andre nok også gør) kopieret koden fra et andet eksempel og brugt det som vist. Jeg opfatter embed som en bagudkompatilitetsting (som i bund og grund ikke er relevant i mit tilfælde, så kan da godt være man bare skal droppe det for overskuelighedens skyld).

Ad 2. Mener du ændre parametre på object-elementet i stedet for at fjerne HTML-koden fra document-hierarkiet? Hvis ja, hvordan håndterer jeg så at objektet skal kunne fjernes

Ad 3. Logisk set (og det er min fornemmelse at det ikke nødvendigvis er det rigtige udgangspunkt ifbm. browsere som IE), burde den lagring af elementet i en midlertidig variabel bare gøre det at den starter med at tælle referencecounter (i ActiveX-objektet) en op idet jeg henter objektet ud med removeChild() og derefter tælle den en ned igen når jeg tildeler referencen værdien null - altså status quo.

Jeg ved ikke om det har nogen betydning, men når jeg fjerner et objekt, så sker det indirekte ifbm. fjernelsen af den tabelrække som indeholder objektet. Det er altså ikke en direkte nedlæggelse af objektet, men snarere en nedlæggelse af en delstruktur, herunder object-elementet.

Jeg spekulerede på om det ifbm. object-elementet var nødvendigt eksplicit at nedlægge det element, altså noget i stil med

// find objektet
var obj = document.getElementById("flashobject1");

// find den celle som objektet ligger i
var pcell = obj.parentNode;

// fjern objektet
pcell.removeChild(obj);
obj = null;

// find den række som cellen ligger i
var prow = pcell.parentNode;

// fjern hele rækken med hvad der ellers er af indhold.
prow.parentNode.removeChild(prow);


I bund og grund savner jeg måske mest en metode til at kontrollere om de objekter jeg nedlægger rent faktisk også dør, eller om de hænger i en reference som jeg ikke kan kappe fordi de efter nedlæggelsen er udenfor rækkevidde af mit javascript...

En anden ting falder mig ind, nemlig om det kunne være fordi flashstreamingen ikke bliver afsluttet korrekt, altså om det er en flashobjekt-relateret problemstilling mere end det er object-elementet generelt der giver mig problemer...(?)
Avatar billede roenving Novice
15. december 2005 - 23:49 #3
ad 2. Ved at kombinere det med nr. 3 !-)

ad 3. Objektet findes stadig selv om du udfører en removeChild(), men som jeg forstår min egen reference, vil metoden returnere en reference til det fjernede objekt, hvilket får mig til at forstå, at man ikke kan bruge den tidligere brugte reference (men det er absolut utestet !-)

-- og man kan tilføje, at javascript notorisk har nogle problemer med at kontrollere ressourcer, hvorfor det overhovedet ikke undrer mig, at du får den omtalte mulighed for at referere et objekt, du mener ikke er til stede i objekt-hierarkiet (Opera-tingen !-)

Browsernes kontrol af plugins opførsel vil jeg tro er ligeså sloppy, så du skal ikke regne med at nogen hukommelses- eller anden ressource er fuldstændigt nedlagt før du genstarter browseren !o]
Avatar billede softspot Forsker
16. december 2005 - 11:24 #4
ad 3. Jeg ved ikke hvorfor, men jeg opfatter bare disse referencer på same måde som men gør i COM, hvilket betyder at uanset om jeg får en reference til et objekt via getElementById eller som et resultat af et kald til removeChild, så er det samme objekt jeg står med efterfølgende... men det kan da godt være jeg skal revidere min opfattelse (jeg er ikke helt stiv i JS-variabler, men komplekse datastrukturer opbevares vel også i dette sprog som referencer til en heap, hvor de faktiske data ligger... eller hvad?)

Anyway! Jeg kan ikke lige finde på nogle intelligente spørgsmål som kan vride mere viden ud af dig roenving, så hvis du vil lægge et svar kan jeg belønne dig for din interesse og ekspertvurdering... :)
Avatar billede roenving Novice
16. december 2005 - 17:28 #5
Oki '-)
Avatar billede roenving Novice
16. december 2005 - 17:37 #6
-- og tak for point ;~}
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