<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>JavaScript på norsk</title>
   <link rel="alternate" type="text/html" href="http://javascript.kakeboksen.org/" />
   <link rel="self" type="application/atom+xml" href="http://javascript.kakeboksen.org/atom.xml" />
   <id>tag:javascript.kakeboksen.org,2008://3</id>
   <updated>2007-09-05T08:15:42Z</updated>
   
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.2-en</generator>


<entry>
   <title>Instanser av klasser, instanceof-operatoren</title>
   <link rel="alternate" type="text/html" href="http://javascript.kakeboksen.org/2003/12/instanser_av_klasser_instanceo_1.html" />
   <id>tag:javascript.kakeboksen.org,2003://3.312</id>
   
   <published>2003-12-30T15:44:22Z</published>
   <updated>2007-09-05T08:15:42Z</updated>
   
   <summary>Jeg har tidligere skrevet litt om problemer som kan oppstå når du sender et objekt til et annet vindu og så forsøker å teste hvilken klasse objektet er en instans av. Denne testen benytter instanceof-operatoren og slik det går frem...</summary>
   <author>
      <name>morten</name>
      <uri>http://www.kakeboksen.org/</uri>
   </author>
   
   
   <content type="html" xml:lang="no" xml:base="http://javascript.kakeboksen.org/">
      <![CDATA[Jeg har "tidligere":http://www.kakeboksen.org/javascript/arkivet/000299.html skrevet litt om problemer som kan oppstå når du sender et objekt til et annet vindu og så forsøker å teste hvilken klasse objektet er en instans av. Denne testen benytter <code>instanceof</code>-operatoren og slik det går frem av det tidligere innlegget oppfører ikke Microsoft Internet Explorer alltid slik en skulle forvente. Nå har jeg utvidet problemstillingen til også å teste variabler i andre vinduer og med flere browsere, for å finne ut når praksis er enig med teori.]]>
      <![CDATA[Når du vil teste om et objekt er en instans av en klasse benyttes operatoren <code>instanceof</code>, for eksempel slik:
<pre><code>if(minVariabel instanceof minKlasse) { ... }</code></pre>
Denne testen skal være sann dersom <code>minVariabel</code> er en instans av klassen <code>minKlasse</code>. For å lage et objekt (en instans) av en klasse brukes <code>new</code>-operatoren, eksempelvis <code>minVariabel = new minKlasse();</code>

Poenget med <code>instanceof</code>-operatoren er at den gir deg mulighet til å teste hvilken klasse et objekt er hentet fra, og således kun benytte metoder og egenskaper du vet eksisterer for objekter av den klassen.  Du kan med andre ord lage en metode som gjør forskjellige ting avhengig av klassen den tilhører, noe som igjen kan gi mer kompakt og oversiktlig kode.

Ideen er god, men så viser det seg at teori og praksis ikke stemmer. I det tidligere blogginnlegget er det nevnt at MSIE(Microsoft Internet Explorer) ikke kan teste objekter sendt som argumenter fra et annet vindu. Spørsmålet var nå om det eksisterte andre varianter der testene også feilet, og hvilke browsere som sluttet å fungere.

Til å hjelpe meg med dette har jeg laget tre varianter av samme test og lagt det ut som et eget <a href="http://www.kakeboksen.org/javascript/tester/instanceof-number/frameset.html">testcase</a>.  Dokumentene der er holdt på engelsk eftersom jeg vil kunne bruke det i bugrapporter.  Første variant (#1) av testen kaller en funksjon i et (annet) vindu med lokale variabler som argument.  Det er samme problemområde som nevnt i det tidligere blogginnlegget, og hvor MSIE(Microsoft Internet Explorer) feiler.  Funksjonen kalles to ganger, først med en primitiv tall-verdi, det vil si en vanlig tall-variabel laget med <code>var notNumberClass = 8;</code>.  Andre gang kalles den med et objekt skapt fra klassen <code>Number()</code> med <code>var isNumberClass = new Number(8);</code>.  Resultatet av det første kallet skal være at variabelen (objektet) ikke er instans av noen klasse, mens det andre kallet skal definere objektet som en instans av klassene Number og Object (alle objekter i JavaScript nedstammer fra Object).

Andre variant (#2) snur om på problemstillingen ved at den kaller en lokal funksjon, det vil si i ett og samme vindu, mens argumentet flyttes rundt.  Igjen gjøre testen med både en primitiv verdi og en instans av Number-klassen og skal i utgangspunktet gi samme resultater som for #1. Jeg var usikker på om problemet ville være likt for de som ikke takler #1, men ut fra resultatet ser de ut til å betrakte det som samme problem.

Siste variant (#3) kaller en funksjon hvor variablene befinner seg i samme vindu som funksjonen, det vil si at både funksjon og argument flyttes rundt.  Den variabelen som testes er dermed lokal til vinduet funksjonen befinner seg i.  Her er det ingen problemer overhodet og alle browsere gir riktige resultater.

Jeg har sjekket testcaset med fire browsere:

* Microsoft Internet Explorer 6
* Mozilla 1.5
* Opera 7.23
* Konqueror 3.1-15 Red Hat

Av disse er det bare Mozilla 1.5 som gjør tingene riktig i alle 3 testene.  De tre andre får riktige svar i test #3, men nekter for at objektet er en instans av klassene Number og Object i test #1 og #2.  Foreløpig har jeg ikke lest nok av ECMA-262 til å forstå hvorfor de oppfører seg om de gjør, men ut fra definisjonen av <code>instanceof</code> finner jeg det noe overraskende at den ikke skal fungere på tvers av vinduer/rammer.]]>
   </content>
</entry>

<entry>
   <title>Tekst-browser med JavaScript</title>
   <link rel="alternate" type="text/html" href="http://javascript.kakeboksen.org/2003/12/tekstbrowser_med_javascript.html" />
   <id>tag:javascript.kakeboksen.org,2003://3.311</id>
   
   <published>2003-12-16T20:08:39Z</published>
   <updated>2007-09-05T08:15:53Z</updated>
   
   <summary>Browsere som kjører i terminalvinduer og viser frem websider kun som tekst er et nyttig redskap. De gir deg nemlig en veldig god indikasjon på hvordan en søkemotor vil oppfatte websiden din. Eksempler på slike browsere er Lynx og Links....</summary>
   <author>
      <name>morten</name>
      <uri>http://www.kakeboksen.org/</uri>
   </author>
   
   
   <content type="html" xml:lang="no" xml:base="http://javascript.kakeboksen.org/">
      <![CDATA[Browsere som kjører i terminalvinduer og viser frem websider kun som tekst er et nyttig redskap. De gir deg nemlig en veldig god indikasjon på hvordan en søkemotor vil oppfatte websiden din.  Eksempler på slike browsere er "Lynx":http://lynx.browser.org/ og <a href="http://artax.karlin.mff.cuni.cz/~mikulas/links/">Links</a>. Det finnes også en web-tjeneste for å vise hvordan Lynx oppfatter websider, den heter "<a href="http://www.google.com/url?sa=U&start=4&q=http://www.delorie.com/web/lynxview.html&e=7418">Lynx Viewer</a>".

For oss som jobber med JavaScript er dette selvfølgelig også interessant, men det åpenbare spørsmålet er: eksisterer det en tekst-browser som støtter JavaScript?

I "&lt;3f6fb504$1@news.broadpark.no&gt;":http://groups.google.com/groups?selm=3f6fb504%241%40news.broadpark.no&oe=UTF-8 ble det nevnt at Links kunne gjøre det, men det hadde jeg aldri merket. Etter noen undersøkelser kom jeg frem til at RedHat Linux versjon 9 som jeg kjører på laptopen min ikke inkluderer Links med JavaScript-støtte. Noen minutter senere hadde jeg oppdaget "en versjon":http://atrey.karlin.mff.cuni.cz/~clock/twibright/links/ (2.1) som faktisk har støtte for JavaScript.  Jeg har ikke tatt rede på hva nøyaktig den støtter ennå, men konstatert at document.write() og location- og navigator-objektene er støttet. Det skal bli interessant å teste den ytterligere.]]>
      
   </content>
</entry>

<entry>
   <title>Referansedokumentasjon</title>
   <link rel="alternate" type="text/html" href="http://javascript.kakeboksen.org/2003/12/referansedokumentasjon.html" />
   <id>tag:javascript.kakeboksen.org,2003://3.310</id>
   
   <published>2003-12-16T19:35:46Z</published>
   <updated>2007-09-05T08:16:04Z</updated>
   
   <summary>Veldig ofte får jeg spørsmål fra folk som har liten erfaring med å programmere JavaScript, eller de har ingen erfaring med programmering overhodet. De har kanskje lest seg til litt forståelse gjennom noen introduksjoner på nett, og lurer så på...</summary>
   <author>
      <name>morten</name>
      <uri>http://www.kakeboksen.org/</uri>
   </author>
   
   
   <content type="html" xml:lang="no" xml:base="http://javascript.kakeboksen.org/">
      Veldig ofte får jeg spørsmål fra folk som har liten erfaring med å programmere JavaScript, eller de har ingen erfaring med programmering overhodet.  De har kanskje lest seg til litt forståelse gjennom noen introduksjoner på nett, og lurer så på hvordan et eller annet skal gjøres.  Sjelden ser jeg at arbeidsvanene deres inneholder konsultasjon av dokumentasjonen.  Jeg tror det like gjerne skyldes forvirring om hvor en skal begynne å lete like mye som det skyldes manglende kunnskap om at det er et lurt sted å finne svar.
      Noe av det jeg anser som viktig å lære seg for å ha noe oversikt over dokumentasjonen er forskjellen mellom kjernen av programmeringsspråket og objektmodellen browseren tilbyr.  Om det virker forvirrende har jeg forsøkt å oppklare temaet i et &quot;tidligere innlegg&quot;:http://www.kakeboksen.org/javascript/arkivet/000296.html i bloggen.

Med det ute av veien kan jeg gyve løs på dokumentasjon.  Først dokumentasjon av kjernen:
&quot;ECMA-262&quot;:http://www.ecma-international.org/publications/standards/Ecma-262.htm er referansedokumentasjonen for ECMAScript.
&quot;JScript v5.6&quot;:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/js56jslrfjscriptlanguagereference.asp  er Microsofts implementasjon av ECMAScript.
&quot;JavaScript Core Reference v1.5&quot;:http://devedge.netscape.com/library/manuals/2000/javascript/1.5/reference/ dokumenterer Netscapes implementasjon.

Dokumentasjon av objektmodeller:
&quot;W3C Document Object Model&quot;:http://www.w3.org/DOM/DOMTR (level 1 og level 2 vil være de mest interessante)
&quot;Microsoft HTML and DHTML Reference&quot;:http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp dokumenterer objektmodellen i Internet Explorer
&quot;Netscape JavaScript Reference v1.3&quot;:http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/ dokumenterer objektmodellen i Netscape Navigator frem til v4.x, det som enkelte kaller DOM level 0.
&quot;The Mozilla DOM Reference&quot;:http://www.mozilla.org/docs/dom/domref/ dokumenterer objektmodellen slik du finner den i Mozilla.

Annen dokumentasjon:
Opera har &quot;dokumentert hva de støtter&quot;:http://www.opera.com/docs/specs/js/ av ECMAScript og W3Cs DOM.
Mozilla-prosjektet har mye dokumentasjon omkring hvordan en skal skrive scripts for browseren i dokumentet &quot;Web developer documentation&quot;:http://www.mozilla.org/docs/web-developer/

Dette dokumentet kan bli oppdatert ytterligere etterhvert som jeg kommer over nyttig referansedokumentasjon.  Det vil aldri på noe tidspunkt forsøke å være en liste over nyttige Javascript-linker.
   </content>
</entry>

<entry>
   <title>Språkets kjerne og objektmodeller</title>
   <link rel="alternate" type="text/html" href="http://javascript.kakeboksen.org/2003/12/sprakets_kjerne_og_objektmodel.html" />
   <id>tag:javascript.kakeboksen.org,2003://3.309</id>
   
   <published>2003-12-12T14:45:47Z</published>
   <updated>2007-09-05T08:16:15Z</updated>
   
   <summary>JavaScript (/JScript/ECMAScript) er i utgangspunktet ikke et stort og uoversiktlig programmeringsspråk. Grunnen til det er at den koden vi skriver for å manipulere HTML-dokumenter egentlig kan deles i to. En del er selve kjernen av JavaScript, den andre er de...</summary>
   <author>
      <name>morten</name>
      <uri>http://www.kakeboksen.org/</uri>
   </author>
   
   
   <content type="html" xml:lang="no" xml:base="http://javascript.kakeboksen.org/">
      <![CDATA[<p>JavaScript (/JScript/ECMAScript) er i utgangspunktet ikke et stort og uoversiktlig programmeringsspråk. Grunnen til det er at den koden vi skriver for å manipulere HTML-dokumenter egentlig kan deles i to.  En del er selve kjernen av JavaScript, den andre er de objektene browseren tilbyr gjennom sin objektmodell.</p>]]>
      <![CDATA[<p>Mesteparten av arbeidet ligger i browserens objektmodell.  Det er der vinduer, dokumenter, skjemaer og det meste annet er tilgjengelig.  Objektmodellen vil variere fra browser til browser, for eksempel har Netscape Navigator v4.x sin egen proprietære objektmodell mens Mozilla hovedsaklig benytter W3Cs Document Object Model.  Microsoft Internet Explorer tilbyr både deres egen proprietære modell samt mesteparten av W3Cs DOM, og det er mange likheter mellom disse to.</p>

<p>La oss se på et eksempel på bruk av disse tre objektmodellene.  Gitt at vi har følgende element i et HTML-dokument:</p>
<pre><code>&lt;form name="mittSkjema" id="mittSkjema"&gt; ... &lt;/form&gt;</code></pre>
<p>Vi har så en variabel 'mittSkjema' og vi ønsker at denne skal være en referanse til skjemaet. Kjernen av språket tilbyr ikke noe om skjemaer, men objektmodellene gjør det. For å opprette referansen kan vi for eksempel gjøre:</p>
<pre><code>var mittSkjema; // variabel for skjemaet

if(document.all) {
  // I Internet Explorers proprietære objektmodell har vi metoden document.all()
  // for å hente ut enkelt-elementer av dokumentet.
  mittSkjema = document.all('mittSkjema');
} else if(document.getElementById) {
  // I W3Cs Document Object Model level 1 tilbys getElementById()
  mittSkjema = document.getElementById('mittSkjema');
} else if(document.forms) {
  // Netscape Navigator 4.x (og DOM level 0) benytter arrayet document.forms[]
  // og krever at skjemaet er navngitt gjennom name-attributtet
  mittSkjema = document.forms['mittSkjema']
}</code></pre>
<p>Mens objektmodellen er veldig omfattende er kjernen av språket ikke voldsomt stor.  Tar vi en titt på Netscapes dokumentasjon for kjernen av JavaScript v1.5 ser vi at den består av noen få objekter, globale egenskaper, funksjoner, statements, kommentarer samt de forskjellige operatorene.  Det er ikke voldsomt stort og derfor rimelig lett å lære.</p>

<p>Når vi lager Date()-objekter arbeider vi med kjernen av språket. Et eksempel er bruken av disse objektene for å finne ut hvor lang tid det tok å gjøre noe:</p>
<pre><code>var start = new Date();

// ...
// Her ligger koden vi vil vite tidsforbruket for
// ...

var end = new Date();
// Tidsforbruket regnet ut i millisekunder
var timeUsed = end.getTime() - start.getTime();</code></pre>

<p>Dette skillet mellom kjerne og objektmodell er viktig når vi søker svar på spørsmål.  Kjernen er dokumentert for seg selv og problemer med den delen av språket må således sjekkes opp mot den dokumentasjonen.  Likeledes er vi nødt til å sjekke dokumentasjon for objektmodellen når problemet ligger der. Unntaket fra denne regelen er Netscapes dokumentasjon for JavaScript frem til og med v1.3, hvor de ikke har noe skille overhodet og koker suppe på alt sammen. Det kan være lett forvirrende.</p>]]>
   </content>
</entry>

<entry>
   <title>IE scope problem</title>
   <link rel="alternate" type="text/html" href="http://javascript.kakeboksen.org/2003/02/ie_scope_problem.html" />
   <id>tag:javascript.kakeboksen.org,2003://3.308</id>
   
   <published>2003-02-11T14:19:00Z</published>
   <updated>2007-09-05T08:16:26Z</updated>
   
   <summary>I går fikk jeg et interessant problem fra en tidligere arbeidskollega. Jeg har lagt opp test-caset som viser problemet, eventuelt mangelen på sådann (en takk til Øyvind som lagde caset). Mozilla takler dette helt fortreffelig og mener at tall fortsatt...</summary>
   <author>
      <name>morten</name>
      <uri>http://www.kakeboksen.org/</uri>
   </author>
   
   
   <content type="html" xml:lang="no" xml:base="http://javascript.kakeboksen.org/">
      <![CDATA[I går fikk jeg et interessant problem fra en tidligere arbeidskollega.  Jeg har lagt opp <a href="/javascript/files/ie-iframe-scope-problem.html" target="_blank">test-caset</a> som viser problemet, eventuelt mangelen på sådann (en takk til Øyvind som lagde caset).  Mozilla takler dette helt fortreffelig og mener at tall fortsatt er tall.  IE påstår derimot at et tall er ikke et tall, men et objekt.  Hvilket selvfølgelig er interessant da dette problemet ikke inntreffer dersom du forsøker deg på:
<pre><code>var foo = new Number(8);<br>alert(foo instanceof Number);</code></pre>
(Men legg merke til at <code>var foo = 8; alert(foo instanceof Number);</code> gir 'false' som svar)

Problemet er altså at en objektreferanse til et Number-objekt sendt som et argument til en funksjon i et annet vindu (rammer er jo også vindusobjekter) ikke lenger er et skikkelig Number-objekt.  Efter mye frem og tilbake samt en tur med gravemaskin i Microsofts JScript-dokumentasjon bestemte vi oss for at det beste var kanskje å finne en egenskap som identifiserte tallet.  Ikke overraskende mener IE at konstruktøren til 'foo' er et tall, slik at følgende lille kodesnutt funker i IE:
<pre><code>if(n.constructor.toString().indexOf("Number") != -1) { }</code></pre>
Ordentlig bakvendt i mine øyne, men det fungerer.]]>
      
   </content>
</entry>

<entry>
   <title>timer-lib.js</title>
   <link rel="alternate" type="text/html" href="http://javascript.kakeboksen.org/2003/02/timerlibjs.html" />
   <id>tag:javascript.kakeboksen.org,2003://3.307</id>
   
   <published>2003-02-02T11:42:05Z</published>
   <updated>2007-09-05T08:16:36Z</updated>
   
   <summary>[English summary: timer-lib.zip is a multithreaded JavaScript timer library aiming for 25ms intervals on Win95/98/Me, where such an interval is not available (reference: Smooth animation using DHTML)] For noen år siden ble jeg bedt om å programmere en tickertape i...</summary>
   <author>
      <name>morten</name>
      <uri>http://www.kakeboksen.org/</uri>
   </author>
   
   
   <content type="html" xml:lang="no" xml:base="http://javascript.kakeboksen.org/">
      <![CDATA[[English summary: <a href="/javascript/files/timer-lib.zip">timer-lib.zip</a> is a multithreaded JavaScript timer library aiming for 25ms intervals on Win95/98/Me, where such an interval is not available (reference: <a href="http://www.webreference.com/dhtml/column28/">Smooth animation using DHTML</a>)]

For noen år siden ble jeg bedt om å programmere en tickertape i JavaScript. En slik applikasjon krever litt animasjon, noe jeg fant ut var vanskelig å få til. Efter mye testing skrev jeg en rapport om temaet, og denne ble senere publisert på DHTML Lab: <a href="http://www.webreference.com/dhtml/column28/">Smooth animation using DHTML</a>

Jeg hadde identifisert et problem, men det hjelper lite uten en løsning.  Den enkleste løsningen er selvfølgelig å ignorere problemet, men jeg finner ofte mer tilfredsstillelse i å finne løsningen og da helst en jeg syns er vakker.  Resultatet denne gangen ble et flertrådet lite bibliotek som kunne erstatte <code>setInterval()</code>.

Biblioteket ligger ute på filen <a href="/javascript/files/timer-lib.zip">timer-lib.zip</a>.  Det er rimelig godt dokumentert i kildekoden og burde således være relativt lett å ta i bruk.  Jeg har hatt det liggende tilgjengelig på web ganske lenge efter at det var interesse for det på DynApi2s mailing-liste "dynapi-help".  Mottakelsen der var delt da animasjonene viste seg å gå dobbelt så fort som normalt, men det var jo liksom meningen. :)

Er løsningen vakker?  Ikke godt å si, men jeg syns nå den i det minste kan kalles "elegant".  Selv-korrigerende og flertrådet og allikevel rimelig enkel i bruk.  Det er slikt jeg finner glede i å skrive.]]>
      
   </content>
</entry>

<entry>
   <title>Ekstrahere script-kode</title>
   <link rel="alternate" type="text/html" href="http://javascript.kakeboksen.org/2002/11/ekstrahere_scriptkode.html" />
   <id>tag:javascript.kakeboksen.org,2002://3.306</id>
   
   <published>2002-11-29T15:50:49Z</published>
   <updated>2007-09-05T08:16:47Z</updated>
   
   <summary>(English summary: I&apos;ve written a Perl-script to extract JavaScript-code from an HTML document. You can download a .zip-file with it with this link) En kort kommentar: Såvidt meg bekjent er antallet virkelig gode norsk-språklige nettsteder som omhandler JavaScript lavt. Veldig...</summary>
   <author>
      <name>morten</name>
      <uri>http://www.kakeboksen.org/</uri>
   </author>
   
   
   <content type="html" xml:lang="no" xml:base="http://javascript.kakeboksen.org/">
      <![CDATA[(English summary: I've written a Perl-script to extract JavaScript-code from an HTML document.  You can download a .zip-file with it with <a href="/files/getscripts.zip">this link</a>)

En kort kommentar:
Såvidt meg bekjent er antallet virkelig gode norsk-språklige nettsteder som omhandler JavaScript lavt.  Veldig lavt, faktisk.  Et søk på "javascript" begrenset til .no-domener på Google gir interessante resultater.  Jeg skal søke å rette opp dette og har derfor laget en egen blogg kalt "JavaScript på norsk".

Jeg starter ballet med å legge ut et Perl-script som viser all script-kode i et HTML-dokument.]]>
      <![CDATA[Scriptet kan du laste ned med <a href="/files/getscripts.zip">denne linken</a> og i .zip-filen finner du en README-fil som beskriver bruk og utskrift.

Opphavet til scriptet var et behov for å få oversikt over all script-kode i et større antall HTML-filer.  Jeg visste ikke om noe programvare som kunne gjøre dette og bestemte meg for å se om jeg kunne få Perl til å gjøre jobben.  Det viste seg å være ganske enkelt, og resultatet ligger nå ute for nedlasting.  Alt jeg så trengte å gjøre for å finne all script-kode var følgende kommando:
<pre><code>nice find . -type f -name "*.html" -exec ~/perl/getscripts.pl {} \;</code></pre>

(Kommandolinjen har innimellom sine store fordeler. :)

Perl-scriptet skriver ut alle &lt;script&gt;-elementer, alle events og enhver link som har en javascript:-URL.  Det skulle dekke de fleste bruksområder jeg vet om.

*Oppdatering 2003-12-15* : Linken for nedlasting refererer til versjon 1.0.1 hvor følgende også er støttet:

* Dokumentet kan være referert med en gyldig URL
* Hvis dokumentet er eksternt og det inneholder linkede .js-filer (gjennom &lt;script src=&quot;foo.js&quot;&gt;) vil disse filene også lastes ned og vises]]>
   </content>
</entry>

</feed>

