<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hinnerup Net &#187; JavaScript</title>
	<atom:link href="http://www.hinnerup.net/permanent/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hinnerup.net</link>
	<description></description>
	<lastBuildDate>Thu, 19 Jan 2012 12:35:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Autocomplete med Ajax på adresse med jQuery og OIO</title>
		<link>http://www.hinnerup.net/en/permanent/2011/06/23/autocomplete-med-ajax-paa-adresse-med-jquery-og-oio/</link>
		<comments>http://www.hinnerup.net/en/permanent/2011/06/23/autocomplete-med-ajax-paa-adresse-med-jquery-og-oio/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 12:04:52 +0000</pubDate>
		<dc:creator>Tobias Hinnerup</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Widget]]></category>

		<guid isPermaLink="false">http://www.hinnerup.net/?p=1470</guid>
		<description><![CDATA[Indtastning af adresseoplysninger er notorisk noget bøvlet: Der er flere indbyrdes forbundne felter og erfaringsvis opstår der meget hurtigt mangel på sammenhæng &#8211; hvilket fører til manuelle processer for opfølgning og fejlretning, for ikke at glemme muligheden for tabte forsendelser. Heldigvis har den offentlige digitalisering i danmark resulteret i gratis &#038; ubetinget adgang til services, [...]]]></description>
			<content:encoded><![CDATA[<p>Indtastning af adresseoplysninger er notorisk noget bøvlet: Der er flere indbyrdes forbundne felter og erfaringsvis opstår der meget hurtigt mangel på sammenhæng &#8211; hvilket fører til manuelle processer for opfølgning og fejlretning, for ikke at glemme muligheden for tabte forsendelser.</p>
<p>Heldigvis har den offentlige digitalisering i danmark resulteret i gratis &#038; ubetinget adgang til services, der kan sammensættes til en gevaldig hjælp i forhold til at ramme rigtigt: Med et par kombinationer af jQuery, Ajax, JSONP og autocomplete er det muligt ud fra et delvist vejnavn at få postnummer og bynavn givet, med samt en liste over gyldige vejnumre.</p>
<p>Herunder et eksempel på et sæt adressefelter der hjælper hvor hjælpes kan. Prøv eventuelt først at taste vejnavn og lade autocomplete klare &#8220;resten&#8221; &#8211; og derefter i postnummerfeltet at skrive et nyt/andet postnummer og derefter konstatér, at autocomplete i vejnavne-feltet nu kun giver navne i det pågældende postnummer.</p>
<style>  .wp-fuckup p, .wp-fuckup br  { display: none; } .ui-autocomplete-loading { background: white url('/2011/06/oiorest/ui-anim_basic_16x16.gif') right center no-repeat; }	#streetname { width: 25em; } </style>
<div class="wp-fuckup">
<link rel="stylesheet" href="http://code.jquery.com/ui/1.8.13/themes/base/jquery-ui.css">
<script src="http://code.jquery.com/jquery-latest.js"></script><br />
<script src="http://code.jquery.com/ui/1.8.13/jquery-ui.min.js"></script><br />
<script src="/2011/06/oiorest/jquery.ui.plugin_autocompleteAddress.js"></script><br />
<script>
	$().ready(function() {
		jQuery("#streetname").autocompleteAddress();
	});
</script></p>
<div class="ui-widget">
  <label for="streetname" >Vejnavn:</label></p>
<input type="text" name="streetname" id="streetname" />
  <label for="streetnumber">Nr.:</label></p>
<input type="text" name="streetnumber" id="streetnumber" size="4" />
</div>
<div class="ui-widget">
  <label for="zipcode">Postnummer: </label></p>
<input type="text" name="zipcode" id="zipcode" size="4"  />
<input type="text" name="city" id="city" size="45" disabled="disabled" /></div>
</div>
<p>Givet, at de rette inkludes er gjort, kan den fulde funktionalitet af ovenstående implementeres med et kald ala</p>
<pre class="prettyprint">
$().ready(function() {
  $(&#34;#streetname&#34;).autocompleteAddress();
});
</pre>
<p>Ovenstående under forudsætning af at der er defineret input felter i HTML&#8217;en som herunder.</p>
<pre class="prettyprint">
&lt;div class=&#34;ui-widget&#34;&gt;
	&lt;label for=&#34;streetname&#34;&gt;Vejnavn: &lt;&#47;label&gt;
	&lt;input type=&#34;text&#34; name=&#34;streetname&#34; id=&#34;streetname&#34;&#47;&gt;
	&lt;label for=&#34;streetnumber&#34;&gt;Nr.: &lt;&#47;label&gt;
	&lt;input type=&#34;text&#34; name=&#34;streetnumber&#34; id=&#34;streetnumber&#34; size=&#34;4&#34; &#47;&gt;
&lt;&#47;div&gt;
&lt;div class=&#34;ui-widget&#34;&gt;
	&lt;label for=&#34;zipcode&#34;&gt;Postnummer: &lt;&#47;label&gt;
	&lt;input type=&#34;text&#34; name=&#34;zipcode&#34; id=&#34;zipcode&#34; size=&#34;4&#34;  &#47;&gt;
	&lt;input type=&#34;text&#34; name=&#34;city&#34; id=&#34;city&#34; size=&#34;45&#34; disabled=&#34;disabled&#34; &#47;&gt;
&lt;&#47;div&gt;</pre>
<p>Såfremt det ønskes at benytte andre feltnavne/id&#8217;er en de her angivne, kan de angives eksplicit:</p>
<pre class="prettyprint">
  $(&#34;#streetname&#34;).autocompleteAddress({
    streetNumber: &#34;#streetnumber&#34;,
    zipCode : &#34;#zipcode&#34;,
    city: &#34;#city&#34;
});
</pre>
<p>Såfremt en eller flere af adresse-felterne ikke kan findes (eller angives med null i argumentet) udelades autocomplete-funktionaliteten for dét. Særligt er tilfældet, hvor det eksempelvis kun ønskes at benytte plugin&#8217;et til at lave autocomplete på postnummer/bynavn: Her skal blot sørges for, at instantiere fra et vilkårligt element der IKKE er et input felt (eksempelvis &#8220;body&#8221;).</p>
<p>Værd at bemærke er også følgende options:</p>
<p><b>matchAnywhere</b> Default: false<br />
Afgør hvorvidt det indtastede kan matche et vilkårligt sted i vejnavnet (true), eller kun i begyndelsen (false).</p>
<p><b>maxSuggestions</b> Default: 12<br />
Angiver hvor mange valgmuligheder der maksimalt vises. </p>
<p>De nødvendige inkludes er &#8220;de gængse&#8221; for brug af jQuery og tilhørende UI, med tilføjelse af en lille smule bogholderi (style) og den til formålet udviklede widget: <a href="/2011/06/oiorest/jquery.ui.plugin_autocompleteAddress.js">autocompleteAddress.js</a>.</p>
<pre class="prettyprint">
&lt;link rel=&#34;stylesheet&#34; href=&#34;http:&#47;&#47;code.jquery.com&#47;ui&#47;1.8.13&#47;themes&#47;base&#47;jquery-ui.css&#34;&gt;
&lt;script src=&#34;http:&#47;&#47;code.jquery.com&#47;jquery-latest.js&#34;&gt;&lt;&#47;script&gt;
&lt;script src=&#34;http:&#47;&#47;code.jquery.com&#47;ui&#47;1.8.13&#47;jquery-ui.min.js&#34;&gt;&lt;&#47;script&gt;
&lt;script src=&#34;http:&#47;&#47;www.hinnerup.net&#47;2011&#47;06&#47;oiorest&#47;jquery.ui.plugin_autocompleteAddress.js&#34;&gt;&lt;&#47;script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;jquery.ui.plugin_autocompleteAddress.css&#34;&gt;
</pre>
<p>Bag kulisserne er der tale om, at <a href="http://jqueryui.com/demos/autocomplete/#remote-jsonp">jQuery UI&#8217;s autocomplete er kædet til JSONP opslag</a> mod &#8220;.json&#8221;-udgaverne af OIO&#8217;s REST-baserede webservices, jævnfør deres dokumentation for henholdsvis <a href="http://geo.oiorest.dk/documentation/api/vej.aspx">Vejnavne</a>, <a href="http://geo.oiorest.dk/documentation/api/adresse.aspx">Adresser </a>og <a href="http://geo.oiorest.dk/documentation/api/postnummer.aspx">Postnummer</a>.</p>
<p>Værd at bemærke er, at OIO&#8217;s implementation af vejnavne-servicen returnerer resultater på matches hvorsomhelst i navnet &#8211; og i autocomplete sammenhæng er det mest intuitive for de fleste formentlig at det er starten af vejnavnet man søger på. Såfremt matchAnywhere er false, ganges maxSuggestions med to ved opslag til Geoservicen, for at tilstræbe at &#8220;have nok&#8221;, når overflødige resultater frasorteres (idet Geoservicen kun understøtter søgninger af typen &#8220;matchAnywhere&#8221;). Det har den uheldige effekt, at idet 2 og 3 bogstavskombinationer forekommer i rigtig mange vejnavne, vil de første (mange) resultater fra OIO ofte IKKE være med matches i begyndelsen &#8211; hvorfor autocomplete ikke altid udnyttes af plugin&#8217;et. Bemærk, at denne uhensigtsmæssighed vil kunne omgås ved blot at fjerne maxantal begrænsningen på kaldet mod OIO &#8211; med performance fald som den eneste pris. </p>
<p>Situationen kan eksemplificeres ved i ovenstående at lave søgning efter eksempelvis &#8220;Bygm&#8221; og &#8220;By&#8221; henholdsvis med og uden at have angivet postnummeret &#8220;2400&#8243;.</p>
<p>Rent praktisk håndteres sagen i koden med kald af .filter og derefter .slice som illustreret herunder.</p>
<pre class="prettyprint">
var serviceUri = &#34;http:&#47;&#47;geo.oiorest.dk&#47;vejnavne.json&#34;;
var serviceArguments = {
	&#47;* Note; Custom filtering on success may reduce this *&#47;
	maxantal: matchAnywhere ? maxSuggestions : eStreetName.val().length &lt; 4 ? 20*maxSuggestions : 2*maxSuggestions ,
	vejnavn: request.term
};

if(eZipCode.length) {
	var zipCode = eZipCode.val();
	if(zipCode.length == 4) {
		serviceArguments.postnr = zipCode;
	}
}

$.ajax({
	url: serviceUri,
	dataType: &#34;jsonp&#34;,
	data: serviceArguments,
	success: function( data ) {
		if(!matchAnywhere) {
			&#47;&#47;Remove matches that are not in the beginning of navn
			data = data.filter(function (vej) {
				var pattern = new RegExp(&#34;^&#34; + eStreetName.val(), &#34;i&#34;);
				return pattern.test(vej.navn);
			});
		}

		&#47;&#47;Reduce to max number of suggestions for display
		data = data.slice(0, maxSuggestions); 

		&#47;&#47;Map OIO object to label&#47;value for jQuery autocomplete
		data = $.map(data, function( vej ) {
			return {
				label: vej.navn + &#34; (&#34; + vej.postnummer.nr + &#34;)&#34;,
				value: vej.navn
			}
		})

		response(data);
	}
});
</pre>
<p>For optimering af brugeroplevelsen benyttes kun et enkelt opslag i forhold til autocomplete af vejnummeret &#8211; resultatet caches lokalt. Dette muliggør både en mere logisk sortering end den alfanumeriske (1, 10, 11, 2a, 20 &#8230;) som OIO leverer data i. Desuden omgås derved det &#8220;problem&#8221; der ligger i at adressse-servicen hos OIO matcher eksakt på husnummer-angivelse, og dermed ikke i udgangspunktet er synderligt velegnet til den nærværende autocomplete-anvendelse.</p>
<p>Dette <a href="http://plugins.jquery.com/project/autocompleteAddress">plugin er tilføjet jQuery repository med navnet autocompleteAddress</a>. </p>
<p>Øverst på listen over kommende features står:</p>
<ul>
<li><strong>Version 1.5 (?)</strong>
<ul>
<li>Forslag modtages gerne!</li>
</ul>
</li>
<li><strong>Version 1.4 (2011-08-22)</strong>
<ul>
<li>Sortering på vejnavn/postnummer tilføjet</li>
</ul>
</li>
<li><strong>Version 1.3 (2011-07-27)</strong>
<ul>
<li>Optimeret mapning og filtrering af vejnavne &#038; numre</li>
<li>Optimeret parsning og sortering af vejnumre</li>
<li>Optimeret logik omkring maxantal (tilføjet missFactor)
<li>Tilføjet &#8220;caller id&#8221; til alle requests mod Geoservien</li>
</ul>
</li>
<li><strong>Version 1.2 (2011-07-04)</strong>
<ul>
<li>Logisk sortering af husnumre (tak til Michael Schøler)</li>
<li>Mere intelligent håndtering af opslag til OIO vedrørende maxantal ved matchAnywhere = false</li>
<li>Stylesheet opsætning udtrukket til separat fil</li>
</ul>
</li>
<li><strong>Version 1.1 (2011-06-28)</strong>
<ul>
<li>Valgfri anvendelse af de 4 adressefelter </li>
<li>Valgfri angivelse af metode for selektion af vejnavne (start|alle)</li>
<li>Valgfri angivelse af maks antal indgange i dropdown</li>
</ul>
</li>
<li><strong>Version 1.0 (2011-06-23)</strong>
<ul>
<li>Første version</li>
</ul>
</li>
</ul>
<p>Yderligere forslag og kommentarer er meget velkomne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hinnerup.net/en/permanent/2011/06/23/autocomplete-med-ajax-paa-adresse-med-jquery-og-oio/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>(Dansk) Animeret Javascript menu</title>
		<link>http://www.hinnerup.net/en/permanent/2011/03/23/animeret-javascript-menu/</link>
		<comments>http://www.hinnerup.net/en/permanent/2011/03/23/animeret-javascript-menu/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 09:39:36 +0000</pubDate>
		<dc:creator>Jakob Justsen</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Cross Browser]]></category>
		<category><![CDATA[Widget]]></category>

		<guid isPermaLink="false">http://www.hinnerup.net/?p=1148</guid>
		<description><![CDATA[Sorry, this entry is only available in Dansk.]]></description>
			<content:encoded><![CDATA[<p>Sorry, this entry is only available in <a href="http://www.hinnerup.net/permanent/tag/javascript/feed/">Dansk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hinnerup.net/en/permanent/2011/03/23/animeret-javascript-menu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O3D &#8211; 3D in browsers</title>
		<link>http://www.hinnerup.net/en/permanent/2009/07/13/o3d-3d-i-browsereo3d-3d-in-browsers/</link>
		<comments>http://www.hinnerup.net/en/permanent/2009/07/13/o3d-3d-i-browsereo3d-3d-in-browsers/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 11:34:22 +0000</pubDate>
		<dc:creator>Asger Dam Hoedt</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[o3d]]></category>

		<guid isPermaLink="false">http://www.hinnerup.net/?p=395</guid>
		<description><![CDATA[Sorry, this entry is only available in Dansk.]]></description>
			<content:encoded><![CDATA[<p>Sorry, this entry is only available in <a href="http://www.hinnerup.net/permanent/tag/javascript/feed/">Dansk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hinnerup.net/en/permanent/2009/07/13/o3d-3d-i-browsereo3d-3d-in-browsers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Et par tricks med selvmodificerende JavaScript kode</title>
		<link>http://www.hinnerup.net/en/permanent/2009/02/18/self-modifying-javascript-code/</link>
		<comments>http://www.hinnerup.net/en/permanent/2009/02/18/self-modifying-javascript-code/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 15:05:46 +0000</pubDate>
		<dc:creator>Michael Schøler</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Self modifying code]]></category>

		<guid isPermaLink="false">http://www.hinnerup.net/?p=207</guid>
		<description><![CDATA[JavaScript sproget er dynamisk, hvilket vil sige at mens ens script afvikles kan alt modificeres. Har man et objekt, er det muligt at tilføje og fjerne properties på det. Sagt med andre ord er det muligt at modificere den kode der afvikles, både ved at tilføje, fjerne og overskrive funktioner samt variable. Note: I de [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScript sproget er dynamisk, hvilket vil sige at mens ens script afvikles kan alt modificeres. Har man et objekt, er det muligt at tilføje og fjerne <i>properties</i> på det. Sagt med andre ord er det muligt at modificere den kode der afvikles, både ved at tilføje, fjerne og overskrive funktioner samt variable.</p>
<div style="font-size:8pt;font-family:arial, sans-serif; padding-left:3em"><b>Note:</b> I de efterfølgende eksempler er der lagt vægt på at illustrere den selvmodificerende kode, og ikke på at opstille gyldig HTML (doctype angivelser med videre er udeladt for overblikkets skyld), og tilsvarende anvendes blot &#8220;onload&#8221; istedet for en mere <a href="http://www.quirksmode.org/js/events_advanced.html">korrekt cross browser metode</a>.</div>
<p>De fleste kender til selvmodificerende javascript kode fra event handlers. Når et DOM elements &#8220;onclick&#8221; sættes til at pege på en javascript funktion, udnyttes faktisk blot javascript sproget selvmodificerende egenskaber:</p>
<pre>
&lt;html&gt;
&lt;body&gt;
&lt;input type="button" id="knap" value="Tryk på mig" /&gt;
&lt;script type="text/javascript"&gt;
function haandterKnapKlik() {
  alert("Hehe - det kilder!");
}
var knapObjekt = document.getElementById("knap");
knapObjekt.onclick = haandterKnapKlik;
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<input type="button" id="knap" value="Tryk på mig" />
<p><script type="text/javascript">
function haandterKnapKlik() {
  alert("Hehe - det kilder!");
}
var knapObjekt = document.getElementById("knap");
knapObjekt.onclick = haandterKnapKlik;
</script>I ovenstående simple eksempel sættes onclick eventhandler funktionen ved hjælp af et inline script. Det samme resultat kan opnåes med dynamisk en tilføjet funktion som her:</p>
<pre>
&lt;html&gt;
&lt;body&gt;
&lt;input type="button" id="knap" value="Tryk på mig" /&gt;
&lt;script type="text/javascript"&gt;
var knapObjekt = document.getElementById("knap");
knapObjekt.onclick = function () {
  alert("Hehe - det kilder osse!");
}
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<input type="button" id="knap2" value="Tryk på mig" />
<p><script type="text/javascript">
var knapObjekt = document.getElementById("knap2");
knapObjekt.onclick = function () {
  alert("Hehe - det kilder osse!");
};
</script>Fordelen ved denne metode, er at global scopet ikke bliver &#8220;forurenet&#8221; med funktionsnavne og variable. Situationen kan nemt opstå hvor der er sammenfald på navne af funktioner og variable, og det kan være ganske lumsk at debugge frem til hvor sådanne fejl er begravet, da det er helt legalt at overskrive en funktion til blot at være en simpel variabel (eller et objekt) og omvendt.</p>
<p>Når man skal sikre at kode kun køres en gang, kan flere strategier anvendes. Typisk ser man implementationer svarende til:</p>
<pre>
&lt;html&gt;
&lt;body onload="initialiser()"&gt;
var initialiseret = false;
function initialiser() {
  if (initialiseret !== false) {
    return;
  }
  // udfør initialiseringen her ...
  initialiseret = true;
}
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Der er flere problemer med ovenstående. Dels ligger funktionen &#8220;initialiser&#8221; og variablen &#8220;initialiseret&#8221; i global scopet og er dermed i fare for at blive overskrevet af andre inkluderede scripts på siden, og der er intet der forhindrer at variablen &#8220;initialiseret&#8221; senere sættes til false, hvorefter koden fint kan genafvikles.</p>
<p>Istedet kan anvendes en anden strategi med selvmodificerende kode som angivet herunder:</p>
<pre>
&lt;html&gt;
&lt;body onload="hinnerupnet.initialiser()"&gt;
var hinnerupnet = {
  initialiser: function () {
    // udfør initialiseringen her ...
    delete this.initialiser;
  },
  variabelBar: "Hejsa",
  metodeFoo: function () {
    alert(this.variabelBar);
  }
};
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Funktionen &#8220;initialiser&#8221; er her pakket ind i et objekt kaldet &#8220;hinnerupnet&#8221;. Kun selve objekt variablen &#8220;hinnerupnet&#8221; er placeret i global scope. Både funktionen &#8220;initialiser&#8221;, &#8220;metodeFoo&#8221; og variablen &#8220;variabelBar&#8221; kan dermed kun tilgåes via objektet &#8220;hinnerupnet&#8221;. Chancerne for at andre scripts på siden skulle overskrive &#8220;hinnerupnet&#8221; objektet er minimale, og bør være under programmørens egen kontrol.</p>
<p>Ved første kald til &#8220;hinnerupnet.initialiser()&#8221; udføres koden og der afsluttes med helt at slette funktionen fra objektet. Eventuelle efterfølgende kald til funktionen leder til en exception:</p>
<pre>
&gt;&gt;&gt; hinnerupnet.initialiser is not a function</pre>
<p>Et alternativ fremt for helt at slette en funktion er at modificere koden heri, for eksempel:</p>
<pre>
&lt;html&gt;
&lt;body onload="hinnerupnet.initialiser()"&gt;
var hinnerupnet = {
  initialiser: function () {
    // udfør initialiseringen her ...
    this.initialiser = function () {
      alert("Fejl: 'hinnerupnet' objektet er allerede initialiseret!");
    };
  }
};
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Første kald til &#8220;hinnerupnet.initialiser()&#8221; vil udføre den tiltænkte initialiseringskode, og slutteligt overskrive initialiseringsfunktionen således &#8220;hinnerupnet&#8221; objektet efterfølgende er:</p>
<pre>
var hinnerupnet = {
  initialiser: function () {
    alert("Fejl: 'hinnerupnet' objektet er allerede initialiseret!");
  }
};</pre>
<p>Leg selv videre med mulighederne, de er mange!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hinnerup.net/en/permanent/2009/02/18/self-modifying-javascript-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiple redigerbare overlays til Google Maps API</title>
		<link>http://www.hinnerup.net/en/permanent/2008/11/05/google-maps-api-multiple-editable-overlays/</link>
		<comments>http://www.hinnerup.net/en/permanent/2008/11/05/google-maps-api-multiple-editable-overlays/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 19:58:29 +0000</pubDate>
		<dc:creator>Michael Schøler</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[Google maps]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.hinnerup.net/?p=130</guid>
		<description><![CDATA[Jeg har dags dato lagt sidste hånd på et lidt spændende proof-of-concept eksperiment. Vi skal til en opgave kunne vise valgfrie polygoner over et zoombart verdenskort. Disse opsatte og redigerbare kort-koordinat polygoner (længde og breddegrader) skal derefter nemt kunne anvendes som søgekriterier i en MS SQL database indeholdende en datatabel med blandt andet en GPS [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har dags dato lagt sidste hånd på et lidt spændende proof-of-concept eksperiment. Vi skal til en opgave kunne vise valgfrie polygoner over et zoombart verdenskort. Disse opsatte og redigerbare kort-koordinat polygoner (længde og breddegrader) skal derefter nemt kunne anvendes som søgekriterier i en MS SQL database indeholdende en datatabel med blandt andet en GPS koordinat kolonne.</p>
<p>Google Maps virkede som et fornuftigt udgangspunkt hertil, så der gik jeg igang.</p>
<p>Den indledende øvelse, du kan se resultatet af herunder, gik på at lave en minimalistisk webside hvor en bruger nemt kan opsætte en eller flere regioner og her skal være istand til at redigere og slette disse. Polygonerne skal slutteligt kunne &#8220;oversættes&#8221; til en række kort-koordinater til den videre database behandling (der ligger udenfor proof-of-concept eksemplets omfang).</p>
<div style="text-align:center">
<a href="http://www.hinnerup.net:10080/2008/10/gmaps/index.html"><img src="/wp-content/uploads/2008/11/gmaps_multi_overlay_js.png" alt="Multiple redigerbare overlays til Google Maps..." title="gmaps_multi_overlay_js" class="wp-image-131" style="border:none" /></a></div>
<p>Prøv selv dette eksempel med <a href="http://www.hinnerup.net:10080/2008/10/gmaps/index.html">multiple editerbare overlays</a>.</p>
<p>Hvert polygon brugeren definerer i ovenstående eksempel kan udtrækkes på JSON form, indeholdende alle koordinater som længde- og breddegrader, som for eksempel:</p>
<pre>
{
  'points': [
    { 'lat': 55.70685277146149, 'lng': 12.535314559936523 },
    { 'lat': 55.70685277146149, 'lng': 12.538447380065918 },
    { 'lat': 55.70571631025774, 'lng': 12.540678977966308 },
    { 'lat': 55.705184338337496, 'lng': 12.538447380065918 },
    { 'lat': 55.70426546069018, 'lng': 12.53763198852539 },
    { 'lat': 55.705184338337496, 'lng': 12.535314559936523 },
    { 'lat': 55.70685277146149, 'lng': 12.535314559936523 }
]};</pre>
<p>Disse koordinat data kan nu anvendes server-side som søgekriterier i MS SQL 2005, for eksempel ved brug af <a href="http://www.codeplex.com/MsSqlSpatial">MsSqlSpatial</a> udvidelsen. Eksempler på MS SQL GIS data indsættelse og forespørgsler findes på <a href="http://www.codeplex.com/MsSqlSpatial/Wiki/View.aspx?title=How%20to%20load%20data%20from%20non-spatial%20sources&#038;referringTitle=Tutorials">MsSqlSpatial</a> siden. MS SQL 2008 har indbygget understøttelse af GIS datatyper og søgning heri &#8211; <a href="http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx">Geometry (planar) og Geography (geodetic)</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hinnerup.net/en/permanent/2008/11/05/google-maps-api-multiple-editable-overlays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Klasser og klassenedarvning i JavaScript</title>
		<link>http://www.hinnerup.net/en/permanent/2008/04/11/javascript_classes/</link>
		<comments>http://www.hinnerup.net/en/permanent/2008/04/11/javascript_classes/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 10:51:20 +0000</pubDate>
		<dc:creator>Michael Schøler</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://www.hinnerup.net/2008/04/11/javascript_classes/</guid>
		<description><![CDATA[Jeg havde i dag behov for at lære fra mig med hensyn til prototype&#8217;s JavaScript klasse implementation. Der er nogle udemærkede eksempler at finde men de var ikke optimalt nemme at forklare alle begreberne udfra &#8211; man skulle have lidt baggrundsviden med sig i hvert fald. Det endte med at en mindre omskrivning af første [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.hinnerup.net/wp-content/uploads/2008/04/class_dog_animal1.jpg' alt='Klassediagram' style='float:right;margin-left:2em;margin-bottom:1em;margin-top:0.5em' />Jeg havde i dag behov for at lære fra mig med hensyn til <a href="http://www.prototypejs.org/api/class">prototype&#8217;s JavaScript klasse implementation</a>. Der er nogle udemærkede eksempler at finde men de var ikke optimalt nemme at forklare alle begreberne udfra &#8211; man skulle have lidt baggrundsviden med sig i hvert fald.</p>
<p>Det endte med at en mindre omskrivning af <a href="http://www.prototypejs.org/api/class/addMethods">første eksempel på prototype hjemmesiden</a> var alt der skulle til for at kunne formidle hvordan JavaScript klasser kan benyttes.</p>
<p>Her er det omskrevne eksempel, der blandt andet har flere instanser med og en lidt klarere constructor/super constructor illustration:</p>
<pre>
// Animal base class
var Animal = Class.create({
  initialize: function(type, name, sound) { // constructor
    this.type = type;
    this.name = name;
    this.sound = sound;
  },
  speak: function() {
    alert("The " + this.type + " named " +
      this.name + " says " + this.sound);
  }
});

// Extended class (inherits from Animal)
var Dog = Class.create(Animal, {
  initialize: function($super, name) { // constructor
    $super("Dog", name, "Woof Woof!"); // call super class constructor
  },
  sit: function() { // extended function
    alert("The " + this.type + " named " + this.name + " is now sitting.");
  }
});

var duck = new Animal("Duck", "Daffy", "Quack!");
var dog1 = new Dog("Pluto");
var dog2 = new Dog("King");
duck.speak();
<i style="color:#777;">// --> alerts "The Duck named Daffy says Quack!"</i>
dog1.speak();
<i style="color:#777;">// --> alerts "The Dog named Pluto says Woof Woof!"</i>
dog2.sit();
<i style="color:#777;">// --> alerts "The Dog named King is now sitting."</i>
dog2.speak();
<i style="color:#777;">// --> alerts "The Dog named King says Woof Woof!"</i></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.hinnerup.net/en/permanent/2008/04/11/javascript_classes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bug i JavaScript eller er weekenden bare for nær?</title>
		<link>http://www.hinnerup.net/en/permanent/2008/03/07/javascript_json_selfref_bug_or_not/</link>
		<comments>http://www.hinnerup.net/en/permanent/2008/03/07/javascript_json_selfref_bug_or_not/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 18:43:56 +0000</pubDate>
		<dc:creator>Michael Schøler</dc:creator>
				<category><![CDATA[JSON]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.hinnerup.net/2008/03/07/javascript_json_selfref_bug_or_not/</guid>
		<description><![CDATA[Jeg er stødt på noget rimelig besynderligt i dag &#8211; JavaScript fortolkeren i IE6, IE7 og FF2 opfører sig nemlig tilsyneladende sært når man opretter selvrefererende JavaScript Object Notation (JSON) objekter. Betragt den første variabeltilskrivning jeg udfører i Firebug konsollen i Firefox: >>> var json = { "foo": 42 }; Den evaluerer til et objekt [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg er stødt på noget rimelig besynderligt i dag &#8211; JavaScript fortolkeren i IE6, IE7 og FF2 opfører sig nemlig tilsyneladende sært når man opretter selvrefererende <a href="http://www.json.org">JavaScript Object Notation (JSON)</a> objekter.</p>
<p><img src='/wp-content/uploads/2008/03/json_selfref.jpg' alt='JSON screenshot fra Firebug' style="border:1px solid #aaa;padding:0.5em;" /></p>
<p>Betragt den første variabeltilskrivning jeg udfører i <a href="http://www.getfirebug.com/">Firebug</a> konsollen i <a href="http://www.mozilla.com/en-US/firefox/">Firefox</a>:</p>
<pre style="color:#1d1376">
>>> var json = { "foo": 42 };</pre>
<p>Den evaluerer til et objekt der indeholder:</p>
<pre style="color:#1d1376">
>>> json
<span style="color:#777781"><b style="color:#17571b">Object foo</b><i>=42</i></span></pre>
<p>Hvis vi gerne vil have oprettet et JSON objekt der refererer til sig selv, kan man angive f.eks.:</p>
<pre style="color:#1d1376">
>>> var json = { "foo": 42, "selfRef": json.foo };</pre>
<p>Hvilket evaluerer til et objekt der indeholder:</p>
<pre style="color:#1d1376">
>>> json
<span style="color:#777781"><b style="color:#17571b">Object selfRef</b><i>=42</i> <b style="color:#17571b">foo</b><i>=42</i></span></pre>
<p>Omskriver man det en smule, så property&#8217;en <tt>foo</tt> tilgås på array form bliver værditilskrivningen til:</p>
<pre style="color:#1d1376">
>>> var json = { "foo": 42, "selfRef": json["foo"] };</pre>
<p>Og det går det lige så fint med, da det også evaluerer til:</p>
<pre style="color:#1d1376">
>>> json
<span style="color:#777781"><b style="color:#17571b">Object selfRef</b><i>=42</i> <b style="color:#17571b">foo</b><i>=42</i></span></pre>
<p>Filmen lader dog til at knække helt hvis den nøgle man anvender er et tal, hvilket er fint gyldigt iøvrigt:</p>
<pre style="color:#1d1376">
>>> var json = { "2": 42, "selfRef": json["2"] };</pre>
<p>Nu har vi nemlig kun objektet:</p>
<pre style="color:#1d1376">
>>> json
<span style="color:#777781"><b style="color:#17571b">Object 2</b><i>=42</i></span></pre>
<p>Så jeg tænkte at jeg enten havde fundet en generel implementationsfejl i JavaScript fortolkerne i IE og FF (hvilket må siges at være overvejende usandsynligt), eller også er mine forsøg herover fejlbehæftede. Sidste mulighed viste sig at være årsagen.</p>
<p>Det går nemlig fint at erklære cykliske JSON strukturer hvis de basis data der skal indgå i selvreferencerne allerede er erklærede på forhånd. Og det er de netop hvis man afprøver dette forløb:</p>
<pre style="color:#1d1376">
>>> var json = { "foo": 42 };
>>> var json = { "foo": 42, "selfRef": json.foo };
>>> json
<span style="color:#777781"><b style="color:#17571b">Object selfRef</b><i>=42</i> <b style="color:#17571b">foo</b><i>=42</i></span></pre>
<p>Hvis <tt>json.foo</tt> ikke indledningsvist havde været erklæret fejler den selvreferende erklæring:</p>
<pre style="color:#1d1376">
>>> var json = { "foo": 42 };
>>> var json = "";
>>> var json = { "foo": 42, "selfRef": json.foo };
>>> json
<span style="color:#777781"><b style="color:#17571b">Object foo</b><i>=42</i></span></pre>
<p>Så det var udelukkende på grund af weekenden der var lige om hjørnet, og fordi forsøget på at indsætte en hidtil utilskrevet talnøgle i JSON strukturen gjorde at &#8220;fejlen&#8221; fremstod. Man kan dog fortsat være lidt tvivlende overfor hvordan en tilskreven property bare kan forsvinde ud i den blå luft. Man kunne forvente at <tt>selfRef</tt> som minimum var tilstede og blot indeholdt værdien <tt>"undefined"</tt> eller endnu bedre <tt>null</tt>. Alternativt havde en kastet <tt>exception</tt> også været ok.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hinnerup.net/en/permanent/2008/03/07/javascript_json_selfref_bug_or_not/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

