Avatar billede gertnissen Nybegynder
24. oktober 1999 - 22:54 Der er 21 kommentarer og
1 løsning

document.write giver uventet resultat i 2 forskellige situationer.

Jeg har en side med 2 frames, den ene skjult (navn=hidden), den anden med dette script i HEAD.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<SCRIPT language="JavaScript">
function sidstOpdateret() {
  var page = sidstOpdateret.arguments[0];
   
  parent.frames['hidden'].document.location.href=page+'.htm';
  document.write(parent.frames['hidden'].document.lastModified);
}
</SCRIPT>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

og dette i selve HTML/BODY, også i hoved framen.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<SCRIPT>sidstOpdateret('about');</SCRIPT>
<SCRIPT>sidstOpdateret('main');</SCRIPT>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Formålet er at lave en side der dynamisk kan vise hvornår, mine sider sidst er blevet opdateret, ved at loade siderne  enkeltvis i den skjulte frame og ud fra den skrive lastModified i hoved framen. Og det virker næsten...

Det vil sige, det giver kun det korrekte resultat hvis jeg tilføjer en alert(); lige inden document.write.

Uden denne tilføjelse skrives lastModified værdien for sidste kaldte html fil ud for alle sidstOpdateret() kald !!!

Hvad skal jeg gøre for at få det til at virke efter hensigten ?
Avatar billede skjoldby Nybegynder
24. oktober 1999 - 23:37 #1
Har du ikke en url. Jeg har lige nogle ideer jeg vil afprøve...
Avatar billede justincase Nybegynder
25. oktober 1999 - 15:23 #2
Problemet er at lastModified informationen kun er tilgængelig efter at siden er loadet færdig. Den umiddelbare løsning ville så være at bruge parent.frames['hidden'].document.onLoad til at aktivere document.write.
Men, så støder du højst sandsynlig ind i et andet problem. Nemlig at din bodyframe er loadet færdig og så får du ikke lov at skrive dynamisk til den mere.

Løsninger ???
  1) Brug et layer til at indeholde sidst opdateret info.
  2) Brug en frame mere (for browsere ude DHtml) og skriv i den når alt er loadet.
  3) Allerbedst ville det være hvis du havde adgang til serverside scripting af en slags.

Jeg kan ikke lige komme på andre muligheder.

:)

JustinCase
Avatar billede justincase Nybegynder
25. oktober 1999 - 15:28 #3
Eller dog. En fjerde mulighed er at gøre som flg :
Hav en midlertidig start side, som en efter en henter de sider du skal bruge ind i din hidden frame.
For hver side der er hentet lagres dens lastModified inf i et array i et script i parent.
Når alle sider er hentet udskiftes bodysiden, og kan nu udskrive info fra parent.array.

:)

JustinCase
Avatar billede gertnissen Nybegynder
25. oktober 1999 - 15:43 #4
Jeg læser lige svaret fra justincase igennem, og så vender jeg (forhåbentlig) tilbage igen mandag aften. (og måske med en URL)
Avatar billede gertnissen Nybegynder
25. oktober 1999 - 22:06 #5
Til skjoldby >>
På http://home.worldonline.dk/~gan/sitemapframe.htm kan du se et eksempel på hvordan koden kører/ikke-kører.

Til Jusincase >>
Jeg har arbejdet lidt med dine forslag, men det giver mig stadig problemer med last modified datoen, som kun gives for det sidste dokument. Jeg arbejder videre....
Avatar billede justincase Nybegynder
26. oktober 1999 - 00:13 #6
Hvilke forslag bruger du og hvordan udfører du dem ?
Avatar billede gertnissen Nybegynder
26. oktober 1999 - 20:27 #7
spredt fægtning indtil nu og ingen løsning endnu.
Kan man teste (i javascript) på onLoad af dokument, og hvordan ?
Avatar billede justincase Nybegynder
26. oktober 1999 - 20:40 #8
Hmm, man kan vel egentilg godt teste, men det er den vej du skal gå.

Du kan enten ligge et script på hver af de sider der hentes :
function updateArray() {
  parent.timeStampArray[parent.timeStampArray.length] := document.lastModied;
}
<body onload="updateArray()">

Og så i den sidste tilføje parent.body.location

Eller fra fra body siden lave noget lignenede :

page = new Array();
page[1] = "page1.htm";
page[2] = page 2.htm";

function updateArray(num) {
  if (num > 0) {
    parent.timeStampArray.length = num;
    parent.timeStampArray[num] = parent.hidden.document.lastModified;
  }
  if (num < page.length) {
    parent.hidden.location = page[num];
    num++;
    parent.hidden.onload = updateArray(num);
  }
}

Det her er ikke noget jeg har testet !

Spredt fægtning !?    :))

JustinCase
Avatar billede gertnissen Nybegynder
26. oktober 1999 - 22:09 #9
OK, jeg har lavet en ekstra script side, der loader mine dokumenter et adgangen. Load tiden var jo afgørende for om lastmodified datoen var den korrekte.
se evt. http://home.worldonline.dk/~gan/sitemapframe.htm

Script på 'script siden'
<SCRIPT language="JavaScript"><!--
parent.updateArray = new Array();

page = new Array();
page[1] = "about.htm";
page[2] = "detect.htm";
page[3] = "gert.htm";
page[4] = "gertcv.htm";
page[5] = "gertuniarb.htm";
page[6] = "gertbgarb.htm";
page[7] = "mads.htm";

timeout = setTimeout("load(1)",1);    timeout = setTimeout("moddate(1)",1000);
timeout = setTimeout("load(2)",2000);  timeout = setTimeout("moddate(2)",3000);
timeout = setTimeout("load(3)",4000);  timeout = setTimeout("moddate(3)",5000);
timeout = setTimeout("load(4)",6000);  timeout = setTimeout("moddate(4)",7000);
timeout = setTimeout("load(5)",8000);  timeout = setTimeout("moddate(5)",9000);
timeout = setTimeout("load(6)",10000); timeout = setTimeout("moddate(6)",11000);
timeout = setTimeout("load(7)",12000); timeout = setTimeout("moddate(7)",13000);
timeout = setTimeout("slut()",14000);

function load() {
    var i = load.arguments[0];
    parent.frames['hidden'].document.location.href=page[i];
}
function moddate() {
    var i = moddate.arguments[0];
    parent.updateArray[i] = parent.frames['hidden'].document.lastModified;
}
function slut() {
    document.location.href='sitemap.htm';
}
// -->
</SCRIPT>

På selve oversigtssiden er så tilføjet et script ala dette for hvert punkt.
<SCRIPT>document.write(parent.updateArray[1]);</SCRIPT>

Den dårlige ved løsningen er, at den er styret af fast tid og ikke af reel load tid !!

Side struktur
sitemapframe.htm loader getLastModified.htm i en frame og laver en anden frame med navn hidden. Når getLastModified.htm er færdig læses sitemap.htm ind i samme frame. sitemapframe.htm indeholder array med alle lastModified datoerne som udskrives med document.write i sitemap.htm

Forslag til forbedringer modtages MEGET gerne.

til jusincase >>
Jeg forstår ikke helt dit sidste forslag, vil du uddybe lidt - jeg kan ikke få det til at virke.
Avatar billede gertnissen Nybegynder
26. oktober 1999 - 22:15 #10
File timestamp (set i CuteFTP) til test
26/10 21.55 about.htm
11/03 00.00 detect.htm
11/03 00.00 gert.htm
11/03 00.00 gertcv.htm
26/10 21.54 gertuniarb.htm
26/10 21.54 gertbgarb.htm
19/09 22.49 mads.htm
Avatar billede justincase Nybegynder
26. oktober 1999 - 22:28 #11
Jeg prøver lige at kigge lidt på det. 5 min :))

JustinCase
Avatar billede justincase Nybegynder
27. oktober 1999 - 11:26 #12
:)) 5 min. min bare :))

Nå, men det virker nu. I det mindste hos mig. Jeg har ikke prøvet det med tunge sider.

Jeg starter med et frameset :

parent
    hidden
    body

og tre sider der skal tjekkes :

side1.htm
side2.htm
side3.htm

og til sidst den endelige bodyside :


I parent placerer jeg flg script :

<script language="JavaScript">
var checking = true;
var lmArray = new Array();
var page = new Array()
page[1] = "side1.htm";
page[2] = "side2.htm";
page[3] = "side3.htm";

var description = new Array()
description[1] = "Side nummer 1";
description[2] = "Side nummer 2";
description[3] = "Side nummer 3";
</script>

i body framen flg script :
<script language="JavaScript">
var num = 0;
var loaded  = false;
function updateArray() {
  if (num > 0) {
    parent.lmArray.length = num;
    parent.lmArray[num] = parent.hidden.document.lastModified;
    parent.page[num] = parent.hidden.document.location.href;
  }
  num++;
  if (num <= parent.page.length-1) {
    parent.hidden.document.location.href = parent.page[num];
  }
  else {
    moveOn();
  }
}

function moveOn() {
  parent.checking = false;
  document.location = "mainBody.htm";
}

loaded = true;
</script> 


I hidden flg :
<script language="JavaScript">
function startUpdate() {
  if (parent.checking) {
    if (!parent.body.loaded) {
      setTimeout("startUpdate()",100);
    }
    parent.body.updateArray();
  }
}
</script>
<body onLoad="startUpdate()">

I hver ef de sider der skal tjekkes (sidst på siden):
<script language="JavaScript">
function check() {
  if (parent.checking) {
    parent.body.updateArray();
  }
}
</script>
<body onLoad="check()">

Og til sidst i den endelige bodyside :
<body>
<script language="JavaScript">
for (var i=1; i <= parent.lmArray.length-1; i++) {
  document.write(parent.description[i]+' updated '+parent.lmArray[i]+'<br>');
}
</script> 
</body>




Jeg har lagt et eksempel ud på http://www.elvers.dk/eksperten/lastModified
Og elles så bare skriv hvis du vil ha' forklaring på noget af det.

:)

JustinCase

Avatar billede skjoldby Nybegynder
27. oktober 1999 - 19:47 #13
JustinCase>>>
Jeg får fejl i linie 12 tegn 3. 'Objekt understøtter ikke denne egenskab'. Ellers ser det fint ud hos mig.

skjoldby
Avatar billede gertnissen Nybegynder
27. oktober 1999 - 20:04 #14
Jeg ser lige på det, umiddelbart syntes jeg ikke om at skulle lægge et script på hver side - men det kan jo være at det er nødvendigt.

I MSIE 4 får jeg i linie 12, tegn 3 følgende fejl:
Objektet understøtter ikke denne egenskab eller metoder.

Jeg vender tilbage om 5 timer ;-)))
Avatar billede justincase Nybegynder
27. oktober 1999 - 20:18 #15
Helt enig i at det er åndsvagt at der skal et script på hver side.

Problemet er bare at for at "aktivere" en event fra javascript i Netscape, bliver man nød til at capture den. Og det kan man først fra JavaScript1.2

Jeg kigger lidt på fejlen.
Avatar billede gertnissen Nybegynder
28. oktober 1999 - 00:47 #16
Jeg har rodet list med mit problem, specielt med
parent.hidden.document.body.onload (MSIE)
parent.hidden.document.onload (NS)
men de sættes ikke når der læses et nyt dokument i framen, men kun når framen indlæses !! (tror jeg)

Så løsningen er stadig med setTimeout (skod), men kun med et lille script.

se evt. http://home.worldonline.dk/~gan/sitemapframe.htm

>>>>>>>>>>>> i body >>>>>>>>>>>>>>>>>>>>>>><
<SCRIPT>
  parent.updateArray = new Array();
  var i=0;

  page = new Array();
  page[1] = "about.htm";
  page[2] = "detect.htm";
  page[3] = "gert.htm";
  page[4] = "gertcv.htm";
  page[5] = "gertuniarb.htm";
  page[6] = "gertbgarb.htm";
  page[7] = "mads.htm";
  page[8] = "mads020599.htm";
 
  function load() {
      parent.updateArray[i] = parent.hidden.document.lastModified;
    i++;   
    if (page.length-1 < i)
    document.location.href='sitemap.htm';
    else {
    parent.hidden.document.location.href=page[i];
    timeout=setTimeout("load()",2000);
    }
  }
</SCRIPT>
</HEAD>
<BODY onLoad="load();">
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
(PS. istedet for <BODY onLoad="load();"> kan bruges en event handler som window.onresize = load; !!)

og en tom hidden, men i den endelige bodyside

<SCRIPT>document.write(parent.updateArray[7]);</SCRIPT>

for hvert punkt (ikke videre dynamisk, men layoutet nødvendigør det)

Til justincase>> Dit forslag virker fint, men jeg kunne godt tænke mig noget mere lækkert.

Hvis løsningen (nogenlunde) kan fungere fra MSIE 3 og NS 3 og op efter, er det helt fint for mig.
Avatar billede gertnissen Nybegynder
28. oktober 1999 - 22:48 #17
En løsning i Javascript 1.2 er helt fin til mig, min hjemmeside er primært lavet til min egen fornøjelse.

Dit forslag skal være mere end velkomment
Avatar billede gertnissen Nybegynder
07. november 1999 - 14:59 #18
Hvad hvis jeg forhøjer med 50 point ?
Avatar billede justincase Nybegynder
07. november 1999 - 15:21 #19
Nej nej, du skal ikke forhøje. Jeg havde egenltig glemt at det her spm. stadig var der. Jeg får tid tirsdag/onsdag aften. Så skal jeg se om jeg kan finde ud af at brygge noget sammen.
Avatar billede skjoldby Nybegynder
07. januar 2000 - 09:34 #20
hvad med at acceptere eller lukke det her?
Avatar billede gertnissen Nybegynder
09. januar 2000 - 14:14 #21
Tja, Politimand-skjoldby har jo ret.
Eftersom justincase ikke har vendt tilbage bør jeg afvise eller acceptere svaret.

-> Justincase, jeg vælger at acceptere dit svar - men hvis løsning i javascript 1.2 kommer, vil jeg blive meget glad.
Avatar billede skjoldby Nybegynder
09. januar 2000 - 14:16 #22
YEAH. But call me Sherif...
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