: Retur til startside
 : Retur til javaScript-startside
 : Object window    
 : klik for options
 : Fejlfangere (gode til aflusning)

         MIDLERTIDIGE  VINDUER

 
Et midlertidigt vindue bruges til at skrive en meddelelse i - det kan gøres med alert() m.fl. funktioner :  (klik). Alert() er et eksempel på en funktion der åbner et midlertidigt vindue. Ofte vil man dog selv have mere styr på hvordan vinduet skal se ud, se f.eks. "5+2" knappen :  
 
<script language="JavaScript">
  function skriv_virker_kun_hveranden_gang(streng) {
    document.write(streng);
  }
  </script>

  <form>
    <INPUT type="button" value="Goddag dit grimme vindue"
         onClick="skriv_virker_kun_hveranden_gang('Goddaws do’')">
  </form>
 
TEST:
 (problemer? brug browserens BACK-funktion)
Ovenstående virker med Internet Explorer, men ikke med Netscape. Der åbnes et grimt nyt vindue, brug browserens BACK-funktion (eller "skift til", "tilbage") for at lukke det grimme nye vindue.
 
For at få det til at virke rigtigt skal der dog mere til:
  • åben først et nyt vindue, det vil nu indeholde et tomt dokument der burde være åbent.
  • åben det tomme dokument hvis du vil være helt sikker (ikke nødvendigt)
  • skriv alle linierne somom du skrev en HTML-fil
  • luk dokumentet (ikke vinduet)
  • Sæt focus på vinduet (ikke nødvendigt)
<script language="JavaScript">
 
var nytvindue;
var aaben = false;
 
function skriv(meddelelse) {
  nytvindue= open("", "vinduesnavn",
      "width=500,height=100,status=yes,toolbar=no,menubar=no,scrollbars=no");
    /* Vindue på 500*100 pixels, med statusbar men uden scrollbjælke mm.
       Vinduet er oprettet, men dokumentet tomt og
       sæt nu det var lukket. Det åbnes nu for output: */
  nytvindue.document.open();  /* Opret dokument - nu er det tomt -
     og skriv alle HTML-koder gerne med <head> osv selvom det ikke altid er nødvendigt*/
  nytvindue.document.write("<html><head><title>Luk-med-klik-på-luk");
  nytvindue.document.write("</title></head><body>");
  nytvindue.document.write(meddelelse);
  nytvindue.document.write("</body></html>");
  nytvindue.document.close();  // Luk document - (ikke vinduet)
  nytvindue.focus();  // Lad vinduet være forrest
  aaben=true; 
  document.gofil.lukgofil.value="Luk mig";
}
  // Ny tekst på lukke-knappen
  // gofil = formens navn - dén form der indeholder
  // lukkeknappen med navnet lukgofil
function luk() {
  if (aaben){ nytvindue.close();
              aaben=false;
              document.gofil.lukgofil.value="Jeg er blevet lukket";}
}
</script>
  <form name=gofil>
  <INPUT type="button" value="Klik mig" onClick="skriv('Goddaws do\'')">&nbsp;
  <INPUT type="button" name=lukgofil value=" Jeg er lukket " onClick="luk()"> <br> <br>
</form>
TEST:    
 
I ovenstående eksempel lukkes vinduet med klik på "luk" knappen. Glemmer man at lukke vinduet kan man se på proceslinien at vinduet stadig er åbent, også selvom det mister focus.
Der findes dog en event-handler der aktiveres når vinduet mister focus - den hedder onBlur - ved at indlede body-afsnittet med <body onBlur=self.close()> lukker vinduet automatisk.
TEST:
Og ak - da jeg fik I.explorer version 6 virkede det ikke mere... dvs den virker godt nok når jeg kører den over internettet, men ikke når jeg kører den fra harddisken på min hjemlige computer. Windows bliver da osse ringere og ringere for hver ny version.
Jeg fil den dumme meddelelse som jeg også har skrevet noget om på startsiden, " Internet explorer har ..... Klik her for indstillinger" og skal klikke på " klik her for indstillinger" og tillade blokeret indhold, når alt de er gjort så virker onBlur igen. Event-handleren onBlur er altså blevet blokeret af Internet Explorer, og det med fuldt overlæg !
I forkurset er beskrevet en metode til at overføre event-handlerne onMouseOver og onMouseOut til et billede :  
Her en metode der kalder en tekst frem, når cursoren er ved et billede - desværre havner teksten i øverste venstre hjørne. Først defineres en funktion der skriver teksten i et nyt vindue:
<script>
var nv;
function skrivmeddel(meddel){
  nv=window.open("","nvv","width=150,height=75");
  nv.document.open();
  nv.document.write("<HTML><HEAD><TITLE>Info</TITLE></HEAD>
  +"<BODY onBlur=self.close()>"
  +"<center>"+meddel+"</center></body></html>");
  nv.document.close();
}
</script>

Denne funktion kaldes når musen er over billedet, og nv lukkes når musen forlader billedet:
<A Href=# onClick='return false'
      onMouseOver="skrivmeddel('Dette er en rød kugle med et N i')"
      onMouseOut="nv.close()">
      <IMG Src=../TEGNBIL/BALLNRO.GIF name=Nro border=0></A>

Desværre er I. Explorer meget bange for pop-up vinduer, jeg véd ikke hvorfor. I ovenstående kan der fremkomme en meddelelse "et pop op-vindue blev blokeret. Hvis du vil se dette pop op-vindue eller se yderligere indstillinger, skal du klikke her... . klik og tillad pop op-vinduer fra
Tilsvarende kan man lave en onMouseOver mm til en knap i en formular, som beskrevet  

         FEJLFANGERE

  Jeg har det ligesom alle andre når jeg programmerer: Jeg bruger mere tid på aflusning (dvs fejlfinding) end på at skrive koden. Med Netscape var der en javaScript console, den kunne man åbne og se hvilke fejl der var opstået, og et (omend upålideligt) linienummer .. og somme tider var man så heldig at man fik vist linien hvor fejlen opstod, med udpegning af hvor i linien det skete.
Firefox har tilsvarende en fejlkoncol, desværre stadig med upålideligt linienr.
Opera (og Chrome ?) har fejlkoncol, og linienummeret passer ofte. Det sværeste er næsten at finde den.
Med Internet Explorer installerer du blot en fejlfanger ved simpelthen at vælge:
Funktioner - Internetindstillinger - Avanceret - og sæt et flueben i punkt nr 25 :   "Vis en meddelelse om hver scriptfejl"
i den lange unummererede liste, hvor er jeg dum at jeg ikke så det straks, der står jo intet om det nogen steder så det burde jeg da vide ?
Inden jeg fandt ud af det nåede jeg at lave min egen fejlfanger, og den er forresten meget mere stabil, den fra Microsoft får ofte computeren til at hænge ("Alt-Ctrl-Delete kvalitet")
Vi kan indbygge en fejlfanger (især til Microsoft Internet Explorer) i vores HTM-fil. Object windows ejer nemlig en variabel (læs: metode) onerror, der virker som en pil hen til den fejlprocedure der skal kaldes, og denne pil kan sættes til i stedet at pege på en funktion vi så skal skrive i HTM-filen.
Fejlproceduren modtager 3 parametre: yderst summarisk beskrivelse af fejlen, HTM-filnavn med sti, og linienummer. Koden bør stå i sit eget script først i <HEAD-afsnittet, så den er på plads og i orden inden der kommer flere scripts som jo kunne tænkes at indeholde fejl.

<script>

function fejlfang(meddel, url, lnr){
  if ((i=url.lastIndexOf("/"))>=0) url=url.slice(i+1); // url bliver så filnavn uden sti
                                                // fordi statuslinien ikke har plads til for meget tekst

  window.status="FEJL: "+meddel+" i "+url+" linienr "+lnr;
  return true;                                      //   undertrykker almindelige fejlprocedure
}

window.onerror=fejlfang;
</script>
<script>
..... og her kommer så hvad der i øvrigt skulle være af script's i HEAD-afsnittet.

Man kan også lave en simplificeret udgave, der skriver til et alert-object:
function fejlfang(meddel, url, lnr){
  alert("FEJL: "+meddel+" i "+url+" linienr "+lnr);
  return true;
}


Eller man kan lave den store udgave, med en hel fejlkoncol hvor fejlmeldingerne lagres i en array:

var FejlAry= new Array();  //   den skal være global

function fejlfang(meddel, url, lnr){
  FejlAry[FejlAry.length] = "FEJL: "+meddel+"  i fil "+url+"  linienr. "+lnr+"<br>";
  if ((i=url.lastIndexOf("/"))>=0) url=url.slice(i+1);
  window.status="FEJL: "+meddel+" i "+url+" linienr "+lnr;
  return true;
}

window.onerror=fejlfang;

function VisFejlFang() {
  fejlwin=window.open("","window2","scrollbars=yes,width=380,height=500");
  fejlwin.document.writeln("<html><head><title>FejlFanger</title><body onBlur=self.close()>")
  if (FejlAry.length==0) fejlwin.document.write("<INGEN FEJL")
  else {
      fejlwin.document.writeln("<B>"+FejlAry.length+" FEJL :</B><br><br>");
      for (var i=0; i < FejlAry.length; i++)
            fejlwin.document.writeln(FejlAry[i]+"<br>");   }
  fejlwin.document.close()
  fejlwin.focus();
}

og så skal der være en knap i <BODY>-afsnittet der kalder fejlkoncollen frem, den kan kodes som:
<A Href="javaScript:VisFejlFang()"><Img Src=..\TEGNBIL\BALLTRAN.GIF Alt="Vis fejlfanger" border=1></A>
knappen er her: Vis fejlfanger
Jeg har brugt et usynligt billede BALLTRAN.GIF - og tegnet en lille ramme udenom så du trods alt kan se hvor det er. Du kan downloade de usynlige billede til din computer ved at højreklikke på det, hvis du vil.

Og her er så en lille knap der kalder en funktion findesej(moster_Olga) - den findes ej, og det er jo en fejl at moster_Olga ikke er defineret, så nu kan du klikke på den og proppe nogle fejl ned i den fine fejlkoncol: ... og her er hvad 3 forskellige browsere gjorde:
Hvad browserne gjorde ved onClick="findesej(moster_Olga)"
Opera Skrev ikke til statusbjælken eller til min fine fejlkoncol.
Skrev til egen fejlkoncol (Menu: Funktioner - Avanceret - Fejlkoncol):
Den sidste linie betyder at en man kan skrive "opera:config#userPrefs" i adresselinien,
vælge "Exceptions Have Stacktrace",
og for fremtiden får man så noget atvide om hvor fejlen opstod, helt konkret i dette tilfælde:
"stacktrace: Line 1 of function script findesej(moster_Olga)",
samt en udpegning ved hjælp af prikker . . . . . .    til f-et i "findesej" hvor fejlen blev fundet.
Firefox 3.5.7 :   Skrev til fejlkoncollen "FEJL: findesej is not defined i fil file:///D:/i/Hjside/JAVASCR/TEMPWIN.HTM linienr. 1"
-- skrev ikke til statuslinien.
Skriver desuden til Firefox's egen fejlkoncol, såfremt man i function fejlfang ovenfor undlader at skrive "return true;"
Internet Explorer 8 :   Skrev til statuslinien og fejlkoncollen:
"FEJL: 'moster Olga' er ikke defineret i TEMPWIN.HTM linienr 372"
Chrome 4.0.249.89:   Har ingen statuslinie,
skrev ikke til min fine fejlkoncol, men skrev til sin egen fejlkoncol:
Uncaught ReferenceError: findesej is not defined      TEMPWIN.HTM:372
Netscape 4.7 :  Skrev til fejlkoncollen at
"FEJL: findesej is not defined i fil file:///D:/i/Hjside/JAVASCR/TEMPWIN.HTM linienr. 372"
Safari :  Skrev slet ingenting, virker slet ikke men ulejliger sig ikke med at give en forklaring
 
 : Til toppen af siden