<?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>Anders Fjeldstads blogg &#187; Javascript</title>
	<atom:link href="http://blogg.fjeldstad.se/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogg.fjeldstad.se</link>
	<description>Välkommen hit</description>
	<lastBuildDate>Fri, 11 Jun 2010 12:56:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Kom ihåg att ange en path för dina cookies!</title>
		<link>http://blogg.fjeldstad.se/2009/05/27/kom-ihag-att-ange-en-path-for-dina-cookies/</link>
		<comments>http://blogg.fjeldstad.se/2009/05/27/kom-ihag-att-ange-en-path-for-dina-cookies/#comments</comments>
		<pubDate>Wed, 27 May 2009 09:49:52 +0000</pubDate>
		<dc:creator>Anders Fjeldstad</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Webbutveckling]]></category>

		<guid isPermaLink="false">http://blogg.fjeldstad.se/?p=321</guid>
		<description><![CDATA[Har du problem med mystiska dubbletter av cookies du skapat på en sajt dyker upp när du förväntar dig att de ska vara unika? Då kanske du gjort samma misstag som jag gjorde &#8211; missat att ställa in en path för varje cookie. Detta gäller oavsett om du använder dig av Javascript eller .NET-ramverkets WebBrowser-kontroll [...]]]></description>
			<content:encoded><![CDATA[<p>Har du problem med mystiska dubbletter av cookies du skapat på en sajt dyker upp när du förväntar dig att de ska vara unika? Då kanske du gjort samma misstag som jag gjorde &#8211; missat att ställa in en path för varje cookie. Detta gäller oavsett om du använder dig av Javascript eller .NET-ramverkets <code>WebBrowser</code>-kontroll för att skapa cookies. Fixen är lyckligtvis mycket simpel.</p>
<p><span id="more-321"></span></p>
<p>Jag skulle häromdagen skapa en cookie i .NET <code>WebBrowser</code>-kontrollen via <code>WebBrowser.Document.Cookies</code> och gjorde så här (min <code>WebBrowser</code>-instans heter &#8221;browser&#8221; i exemplen nedan):</p>
<pre><code>browser.Document.Cookies = "MyCookie=My value";</code></pre>
<p>Den (interna) webbapplikation som browsern navigerade runt i kunde sedan verifiera att cookien fanns och göra vissa saker baserat på det, följt av att sätta cookien till ett annat värde. Det var bara det att ibland verkade cookien ha flera olika värden under samma request, vilket orsakade ett oönskat beteende. När jag tittade närmare på det insåg jag att det <em>ibland </em>fanns dubbletter av cookien. Vadan?</p>
<p>Jag började med att ägna en eftermiddag åt att testa olika varianter av &#8221;kolla-om-cookien-finns-i-så-fall-sätt-den-till-ditten-annars-sätt-den-till-datten-eller-ta-bort-den&#8221; och andra dumheter tills det var dags att gå hem för dagen med bultande huvudvärk och dåligt humör.</p>
<p>Nästa dag inledde jag istället med att googla efter typ &#8221;duplicate cookies&#8221; och hittade ett kort <a href="http://jenseng.com/archives/000040.html">blogginlägg</a> med budskapet:</p>
<blockquote><p>Kom ihåg att alltid sätta <strong>path</strong> för dina cookies, annars defaultar den till den aktuella sidans URL vilket kan leda till dubbletter.</p></blockquote>
<p>Inlägget handlade visserligen om att sätta cookies genom Javascript och document.cookies, men det är mer eller mindre precis samma sak som att göra det via <code>WebBrowser.Document.Cookies</code>. Så hur sätter man path för en cookie? En ny googling tog mig till <a href="http://www.quirksmode.org/js/cookies.html">en beskrivning av cookies på Quirksmode.org</a> och insikten:</p>
<pre><code>browser.Document.Cookies = "MyCookie=My value; path=/";</code></pre>
<p>Genom det enkla tillägget började min cookie gälla för hela sajten och alla dubbletter försvann hux flux.</p>
<p><strong>Slutsats:</strong> Sätt alltid path för dina cookies och ta en paus med lite frisk luft och kanske ett mellanmål när du försöker lösa ett problem men är för trött för att inse att Google har svaret&#8230;</p>
<br /><a href="http://blogg.fjeldstad.se/?p=321#comments" title="Comments on &quot;Kom ihåg att ange en path för dina cookies!&quot;"><img src="http://blogg.fjeldstad.se/wp-content/plugins/feed-comments-number/image.php?321" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://blogg.fjeldstad.se/2009/05/27/kom-ihag-att-ange-en-path-for-dina-cookies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mataffären.se får liv i Google Chrome</title>
		<link>http://blogg.fjeldstad.se/2008/09/17/mataffarense-far-liv-i-google-chrome/</link>
		<comments>http://blogg.fjeldstad.se/2008/09/17/mataffarense-far-liv-i-google-chrome/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 10:33:47 +0000</pubDate>
		<dc:creator>Anders Fjeldstad</dc:creator>
				<category><![CDATA[Allmänt]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Webbutveckling]]></category>

		<guid isPermaLink="false">http://blogg.fjeldstad.se/?p=217</guid>
		<description><![CDATA[Jag och Anna brukar använda Mataffären.se för våra veckohandlingar. Tjänsten är bra, men själva webbplatsen är stundtals ohyggligt frustrerande att navigera runt på. Framförallt är den långsam, vilket beror på att den överanvänder och missbrukar funktionerna i MS AJAX &#8211; när man exempelvis ändrar antalet för en vara (innan man lagt den i varukorgen) görs [...]]]></description>
			<content:encoded><![CDATA[<p>Jag och Anna brukar använda Mataffären.se för våra veckohandlingar. Tjänsten är bra, men själva webbplatsen är stundtals ohyggligt frustrerande att navigera runt på. Framförallt är den långsam, vilket beror på att den överanvänder och missbrukar funktionerna i MS AJAX &#8211; när man exempelvis ändrar antalet för en vara (innan man lagt den i varukorgen) görs ett anrop till servern för att beräkna totalsumman för raden (!). Och inte nog med att den måste vänta på servern för att utföra triviala beräkningar, den skickar <em>samtliga </em>varor i det aktuella sökresultatet (kan vara många) till servern, även om den bara ska behandla en av dem.</p>
<p>Hursomhelst &#8211; eftersom sidan har mycket Javascript kopplade till rader i sökresultat och liknande så är den lite av ett lidande för de flesta webbläsare att rendera (särskilt IE6). På kul testade jag att göra vår senaste storhandling i Google Chrome istället för Firefox, och det var en ruskig skillnad! Istället för frustration gick allt faktiskt smidigt. Nästan så att jag glömde bort hur dumt de implementerat sin lösning&#8230;</p>
<p>Ett mycket hett tips till alla som använder Mataffären.se alltså.</p>
<br /><a href="http://blogg.fjeldstad.se/?p=217#comments" title="Comments on &quot;Mataffären.se får liv i Google Chrome&quot;"><img src="http://blogg.fjeldstad.se/wp-content/plugins/feed-comments-number/image.php?217" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://blogg.fjeldstad.se/2008/09/17/mataffarense-far-liv-i-google-chrome/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Streaming av tiles över webben</title>
		<link>http://blogg.fjeldstad.se/2007/05/29/streaming-av-tiles-over-webben/</link>
		<comments>http://blogg.fjeldstad.se/2007/05/29/streaming-av-tiles-over-webben/#comments</comments>
		<pubDate>Tue, 29 May 2007 20:47:20 +0000</pubDate>
		<dc:creator>Anders Fjeldstad</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Webbutveckling]]></category>

		<guid isPermaLink="false">http://blogg.fjeldstad.se/2007/05/29/streaming-av-tiles-over-webben/</guid>
		<description><![CDATA[Den något kryptiska titeln på inlägget kräver en förklaring. Vad jag syftar på är den form av &#8221;streaming&#8221; av bildinnehåll som man exempelvis kan se på Google Maps eller Microsoft Live Search, där användaren panorerar runt över en till synes oändligt stor bildyta som visas genom ett &#8221;titthål&#8221;. Istället för att låta användaren vänta på [...]]]></description>
			<content:encoded><![CDATA[<p>Den något kryptiska titeln på inlägget kräver en förklaring. Vad jag syftar på är den form av &#8221;streaming&#8221; av bildinnehåll som man exempelvis kan se på <a href="http://maps.google.com/">Google Maps</a> eller <a href="http://maps.live.com/">Microsoft Live Search</a>, där användaren panorerar runt över en till synes oändligt stor bildyta som visas genom ett &#8221;titthål&#8221;. Istället för att låta användaren vänta på att en jättestor bild laddas in så skickar servern några små bitar av bilden, så kallade &#8221;tiles&#8221;, i taget. Tilesen skickas allteftersom användaren panorerar, så att det normalt i princip ser ut som om man tittar på en bild som aldrig tar slut. Typiskt smart. Så vill jag också göra.  Ett hobbyprojekt är påbörjat.</p>
<p>Som jag ser det är problematiken indelad i ett par olika delar med olika klurighetsgrader. Först och främst måste jag komma på hur jag gör ett titthål (hädanefter kallad &#8221;viewport&#8221;) som man kan titta på en yta genom och som stödjer panorering med muspekaren. Detta visade sig vara helt okej enkelt. Grundprincipen är att lägga den stora ytan som man vill panorera över inuti ett element med CSS-attributet <code>overflow: hidden</code> (bland annat). Det betyder att även om ytan är jättestor så syns bara en så stor del som får plats i det yttre elementet. För att kunna panorera krävs även att det yttre elementet, viewporten, har <code>position: relative</code> och att det inre, canvasen, har <code>position: absolute</code>. Sedan kan man använda Javascript för att manipulera canvasens position relativt viewportens. Ganska rättframt.</p>
<p>De mer utmanande tankenötterna börjar rada upp sig när det kommer till att dynamiskt läsa in och visa upp tiles. En webbläsare fungerar så att den börjar ladda in en bildfil så snart som den får veta dess sökväg, exempelvis genom ett <code>src</code>-attribut på en <code>img</code>-tagg eller som värde på ett elements <code>background-image</code>-styleattribut. Detta innebär att bara vi vet URL:en till en given tile så tar webbläsaren hand om den &#8221;streaming&#8221; som behövs för att visa upp bilden. Mycket bekvämt.</p>
<p>Låt säga att vi har ett enkelt koordinatsystem där varje tile har unika koordinater. För enkelhetens skull (och det finns ju ingen anledning att inte hålla det enkelt) bestämmer jag att en tile exempelvis kan ha koordinaterna (0, 0). Motsvarande bildfil heter troligen <code>0-0.jpg</code> och ligger i mappen <code>Images/Tiles</code>. Eftersom strukturen är känd kan klienten själv lista ut URL:en till varje tile, och samtidigt beräkna vilken position den ska ha relativt canvasen. Men hur ska den veta vilka tiles som ska vara synliga vid ett givet tillfälle?</p>
<p>Klienten vet hur stor viewporten är, och kan därför veta hur många tiles den motsvarar. Man skulle kunna tänka sig att först ta reda på vilken tile som är &#8221;i mitten&#8221; av viewporten och sedan ladda in ett visst antal tiles relativt denna i både X och Y-led. När användaren sedan panorerar över canvasen så ändras den mittersta tilen, vilket ger en ny bas för beräkning av vilka tiles som ska vara synliga.</p>
<p>Gamla tiles, sådana som inte syns längre, tas bort från dokumentträdet för att det inte ska bli för stort och klumpigt. Eftersom webbläsaren i normalfallet cachar de bilder den laddar in kommer det ändå gå mycket snabbt att visa upp tiles som tidigare tagits bort om användaren skulle panorera tillbaka.</p>
<p>Det finns klara begränsningar som styr vad man kan göra samtidigt som en smidig resonsivitet i GUI:t bibehålls (kom ihåg att användaren kanske panorerar omkring helt godtyckligt, då duger det inte med en massa fördröjningar och lagg). Ett s¥dant exempel är att det faktiskt tar tid att skapa noder i DOM-trädet (vilket är vad man gör när man lägger till en tile). Ju mindre tiles, desto fler ska synas samtidigt vilket betyder fler aktiva noder för varje givet tillfälle. Responsiviteten minskar. Det hela blir en avvägning &#8211; vilken är den bästa tilestorleken i förhållande till prestanda och syfte? Detta är bara en av de frågor som jag stött på under mitt experimenterande hittills.</p>
<p>Den approach till problemet som jag skrivit helt kort om här är såklart bara <em>en </em>variant, kanske läroböcker i dynamiska webbapplikationer (finns det sådana?) skulle kalla den naiv. Men det är klart att jag inte kan skriva om alla finesser och knep nu direkt, då blir det ju inget roligt! Detta är ett löpande hobbyprojekt som jag har tänkt lägga en hel del tid på. Jag kommer säkert att skriva mer om olika detaljer framöver. Till sist har jag förhoppningsvis ett schysst resultat att visa, med en grundlig teknisk &#8221;bakom kulisserna&#8221;-genomgång som bonus.</p>
<p>Då och då kommer jag (kanske) göra releaser av det jag åstadkommit hittills, och den senaste versionen hittar du alltid på http://koncept.fjeldstad.se. Tycker du att den ser konstig ut så beror det med stor sannolikhet på att den gör det.</p>
<br /><a href="http://blogg.fjeldstad.se/2007/05/29/streaming-av-tiles-over-webben/#comments" title="Comments on &quot;Streaming av tiles över webben&quot;"><img src="http://blogg.fjeldstad.se/wp-content/plugins/feed-comments-number/image.php?19" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://blogg.fjeldstad.se/2007/05/29/streaming-av-tiles-over-webben/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Javascript och minnesläckor</title>
		<link>http://blogg.fjeldstad.se/2007/04/03/javascript-och-minneslackor/</link>
		<comments>http://blogg.fjeldstad.se/2007/04/03/javascript-och-minneslackor/#comments</comments>
		<pubDate>Tue, 03 Apr 2007 16:54:26 +0000</pubDate>
		<dc:creator>Anders Fjeldstad</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blogg.fjeldstad.se/2007/04/03/javascript-och-minneslackor/</guid>
		<description><![CDATA[Idag satt jag och kodade i godan ro på jobbet, och hade varit mycket nöjd om det inte vore för en liten, halvt nedprioriterad rad på min uppgiftslista:
Webbapplikationen tycks gå långsammare när browsern varit igång länge. Finns det en minnesläcka på klientsidan? Undersök!
Jag ligger bra till tidsmässigt just nu i projektet så jag hade möjlighet [...]]]></description>
			<content:encoded><![CDATA[<p>Idag satt jag och kodade i godan ro på jobbet, och hade varit mycket nöjd om det inte vore för en liten, halvt nedprioriterad rad på min uppgiftslista:</p>
<blockquote><p>Webbapplikationen tycks gå långsammare när browsern varit igång länge. Finns det en minnesläcka på klientsidan? Undersök!</p></blockquote>
<p>Jag ligger bra till tidsmässigt just nu i projektet så jag hade möjlighet att titta närmare på frågan. Det visade sig att minnesläckor i webbläsaren i samband med vissa Javascript/DOM-kopplingar är välkända, och diskuteras bland annat på <a href="http://jgwebber.blogspot.com/2005/01/dhtml-leaks-like-sieve.html">den här bloggen</a>, i <a href="http://www.codeproject.com/jscript/leakpatterns.asp">denna CodeProject-artikel</a> och hos <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp">Microsoft</a>.</p>
<p>Ett problem tycks vara eventhanterare, och att man alltid bör &#8221;koppla bort&#8221; dem då sidan avslutas (vid window-objektets unload-event). Spontant känner jag att detta automatiskt borde hanteras av den funktionalitet som från början kopplar upp eventhanterarna, exempelvis $addHandler om man använder AJAX Library. Kanske är det redan så? Jag tror dock inte det. Jag ska gräva lite djupare i det hela, blir väl till slut kanske tvungen att implementera något i stil med <a href="http://talideon.com/weblog/2005/03/js-memory-leaks.cfm">denna lösning för eventhantering</a>.</p>
<p>Sedan får man inte glömma bort alla andra mönster som kan framkalla de här minnesläckorna (som beskrivs mer noggrannt i ovan nämnda artiklar). Ibland, när det känns som att jag tvingas lägga tid på olika hack för att komma runt begränsningar i webbläsaren, önskar jag att hela termen &#8221;webbapplikation&#8221; aldrig uppstått&#8230;tacka vet jag hederliga hemsidor!</p>
<br /><a href="http://blogg.fjeldstad.se/2007/04/03/javascript-och-minneslackor/#comments" title="Comments on &quot;Javascript och minnesläckor&quot;"><img src="http://blogg.fjeldstad.se/wp-content/plugins/feed-comments-number/image.php?13" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://blogg.fjeldstad.se/2007/04/03/javascript-och-minneslackor/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

