<?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>antaru.com</title>
	<atom:link href="http://antaru.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://antaru.com</link>
	<description>En blogg om webbutveckling, spel, TV och internet.</description>
	<lastBuildDate>Mon, 02 Jan 2012 17:50:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Custom Post Type Labels, bättre formatterade</title>
		<link>http://antaru.com/custom-post-type-labels-battre-formatterade/</link>
		<comments>http://antaru.com/custom-post-type-labels-battre-formatterade/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 08:22:12 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[copy]]></category>
		<category><![CDATA[efficiency]]></category>
		<category><![CDATA[paste]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://antaru.com/?p=289</guid>
		<description><![CDATA[När man lägger till nya post-typer i ett WordPress-tema eller plugin har man möjlighet att ändra texter som visas i admin-gränssnittet. Man kan även använda localization med dessa. Det här är bara ett template för att enkelt copy-pastea in alla labels och snabbt komma igång med att ändra deras värde. $labels = array( 'name' =&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>När man lägger till nya post-typer i ett WordPress-tema eller plugin har man möjlighet att <a title="Ugh, so bad formatting!" href="http://codex.wordpress.org/Function_Reference/register_post_type#Arguments">ändra texter som visas i admin-gränssnittet</a>. Man kan även använda localization med dessa. Det här är bara ett template för att enkelt copy-pastea in alla labels och snabbt komma igång med att ändra deras värde.</p>
<pre class="prettyprint">$labels = array(
 'name' =&gt; __('', 'domain'), // - general name for the post type, usually plural. The same as, and overridden by $post_type_object-&gt;label
 'singular_name' =&gt; __('', 'domain'), // - name for one object of this post type. Defaults to value of name
 'add_new' =&gt; _x('', 'domain'), // - the add new text. The default is Add New for both hierarchical and non-hierarchical types.
 // - When internationalizing this string, please use a gettext context matching your post type. Example: _x('Add New', 'product');
 'all_items' =&gt; __('', 'domain'), // - the all items text used in the menu. Default is the Name label
 'add_new_item' =&gt; __('', 'domain'), // - the add new item text. Default is Add New Post/Add New Page
 'edit_item' =&gt; __('', 'domain'), // - the edit item text. Default is Edit Post/Edit Page
 'new_item' =&gt; __('', 'domain'), // - the new item text. Default is New Post/New Page
 'view_item' =&gt; __('', 'domain'), // - the view item text. Default is View Post/View Page
 'search_items' =&gt; __('', 'domain'), // - the search items text. Default is Search Posts/Search Pages
 'not_found' =&gt; __('', 'domain'), // - the not found text. Default is No posts found/No pages found
 'not_found_in_trash' =&gt; __('', 'domain'), // - the not found in trash text. Default is No posts found in Trash/No pages found in Trash
 'parent_item_colon' =&gt; __('', 'domain'), // - the parent text. This string isn't used on non-hierarchical types. In hierarchical ones the default is Parent Page
 'menu_name' =&gt; __('', 'domain') // - the menu name text. This string is the name to give menu items. Defaults to value of name
 );</pre>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/custom-post-type-labels-battre-formatterade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Read More visas inte i WordPress</title>
		<link>http://antaru.com/read-more-visas-inte-i-wordpress/</link>
		<comments>http://antaru.com/read-more-visas-inte-i-wordpress/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 16:26:05 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[feature]]></category>
		<category><![CDATA[groan]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://antaru.com/?p=267</guid>
		<description><![CDATA[Tydligen finns det en feature i WordPress som hindrar Read More-länken från att renderas om man anropar the_content("Read more") i något annat sammanhang än där poster normalt sett förekommer, som shortcode-funktion anropad på en Page exempelvis. Den snabba enkla lösningen på detta är att i loopen explicit säga åt readmore att visas. global $more; $more [...]]]></description>
			<content:encoded><![CDATA[<p>Tydligen finns det en feature i WordPress som hindrar Read More-länken från att renderas om man anropar <code>the_content("Read more")</code> i något annat sammanhang än där poster normalt sett förekommer, som shortcode-funktion anropad på en Page exempelvis.</p>
<p><a href="http://wordpress.org/support/topic/read-more-not-working-2#post-1352898">Den snabba enkla lösningen</a> på detta är att i loopen explicit säga åt readmore att visas.</p>
<pre class="prettyprint php"><code> global $more; $more = 0; the_content('Read ALL the article...');</code></pre>
<p>Obviously.</p>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/read-more-visas-inte-i-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utvecklingsdomäner med Apache</title>
		<link>http://antaru.com/utvecklingsdomaner-med-apache/</link>
		<comments>http://antaru.com/utvecklingsdomaner-med-apache/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 06:30:32 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[utveckling]]></category>

		<guid isPermaLink="false">http://antaru.com/?p=260</guid>
		<description><![CDATA[För en webbutvecklare med många projekt igång samtidigt kan sökvägar ställa till problem. För att undvika sökvägsproblem när man utvecklar mot en lokal server (Mamp, Xampp eller liknande) och har http://localhost som root-katalog kan man skapa egna domäner som leder till ett specifikt projekt. Ett av de vanligaste problemen jag har dykt på med lokal [...]]]></description>
			<content:encoded><![CDATA[<p>För en webbutvecklare med många projekt igång samtidigt kan sökvägar ställa till problem. För att undvika sökvägsproblem när man utvecklar mot en lokal server (<a title="Lokal utvecklingsmiljö, mamp" href="http://www.mamp.info/en/index.html">Mamp</a>, <a title="Lokal utveckling, Xampp" href="http://www.apachefriends.org/en/xampp.html">Xampp</a> eller liknande) och har http://localhost som root-katalog kan man skapa egna domäner som leder till ett specifikt projekt.</p>
<p>Ett av de vanligaste problemen jag har dykt på med lokal utveckling är att root-katalogen är localhost och inte localhost/<em>projektnamn</em> som jag vill att det ska vara. På grund av det kommer absoluta sökvägar till stilmallar och javascript strula och inte hittas.</p>
<p>Lösningen på det problemet är självklart att skapa egna domäner som pekar till din lokala server och rätt projektkatalog.</p>
<p>För att lyckas med det behöver man lägga till lite saker på två ställen. Den ena är /etc/hosts-filen och den andra är Apache&#8217;s httpd.conf-fil. I det här exemplet kommer jag använda mig av en WordPress-installation som ligger installerad under katalogen http://localhost/wordpress och ska skapa domänen wordpress.dev.</p>
<h2>hosts</h2>
<p>Vissa saker skiljer sig mellan operativsystemet, och jag kommer lista OS X och Windows 7.</p>
<h3>Mac OS X</h3>
<p>Starta terminalen och skriv <code>sudo nano /etc/hosts</code></p>
<h3>Windows 7</h3>
<p>Windowstangent+r (kör) och skriv in <code>%WINDIR%\system32\drivers\etc\hosts </code>öppna med din favorit-editor.</p>
<p>Sist i filen, lägg till raden:</p>
<pre>127.0.0.1    wordpress.dev</pre>
<p>Stäng sedan filen.</p>
<h2>httpd.conf</h2>
<p>Filen httpd.conf ligger i katalogen där Apache installerades och bör inte vara alltför svår att hitta. Öppna med favorit-editorn. Längst ner i filen lägg dessa rader:</p>
<pre>&lt;VirtualHost 127.0.0.1&gt;
  ServerName wordpress.dev
  DocumentRoot "/Applications/MAMP/www/wordpress/"
&lt;/VirtualHost&gt;</pre>
<p>Din DocumentRoot skiljer sig nog.</p>
<p>Starta om Apache och testa sedan att navigera in till wordpress.dev. Om det inte fungerar, eller om du ska lägga till fler domäner, kan det behövas en extra rad i httpd.conf. Precis över den första <code>VirtualHost</code> lägg till det här:</p>
<pre>NameVirtualHost 127.0.0.1</pre>
<p>Det löste mina problem när det gällde flera domäner. Det finns säkert flera andra saker man kan göra med VirtualHost i Apache, som lokala subdomäner om man så vill, men det är inget jag har testat.</p>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/utvecklingsdomaner-med-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hitta storleken på ett Associativt Array</title>
		<link>http://antaru.com/hitta-storleken-pa-ett-associativt-array/</link>
		<comments>http://antaru.com/hitta-storleken-pa-ett-associativt-array/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 13:15:24 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programmering]]></category>

		<guid isPermaLink="false">http://antaru.org/?p=198</guid>
		<description><![CDATA[Robust och härlig metod för att få ut &#8220;längden&#8221; på ett associativt array. Hittat på StackOverflow. // http://stackoverflow.com/questions/5223/length-of-javascript-associative-array Object.size = function(obj) { var size = 0, key; for (key in obj) { if (obj.hasOwnProperty(key)) size++; } return size; }; //Används: var foo = { bar: true, oh: "hai" }; Object.size(foo); // 2 Tydligen är det [...]]]></description>
			<content:encoded><![CDATA[<p>Robust och härlig metod för att få ut &#8220;längden&#8221; på ett associativt array. Hittat på <a href="http://stackoverflow.com/">StackOverflow</a>.</p>
<pre class="prettyprint js"><code>
    //  http://stackoverflow.com/questions/5223/length-of-javascript-associative-array
    Object.size = function(obj) {
        var size = 0, key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) size++;
        }
        return size;
    };
    //Används:
    var foo = { bar: true, oh: "hai" };
    Object.size(foo); // 2
</code>
</pre>
<p>Tydligen är det farligt att lägga saker på Object.prototype, men att göra såhär skadar ingen.<br />
<strong>EDIT</strong><br />
Efter en kommentar och lite testning verkar det som att den här funktionen går att lägga direkt på Object.prototype. Det verkar som att funktionen gör vad den ska, även om man lägger på fler metoder eller egenskaper på Object.property.</p>
<p>Det skulle isåfall se ut såhär:</p>
<pre class="prettyprint js"><code>
    Object.prototype.size = function() { //Metoden size läggs till på alla objekt... Dvs alla typer
        var size = 0, key;
        for (key in this) {
            if (this.hasOwnProperty(key)) size++;
        }
        return size;
    };
    //Används:
    var foo = { bar: true, oh: "hai" };
    foo.size(); // 2 (size anropas direkt på objektet)
</code>
</pre>
<p>Man bör nog ändå tänka sig för innan man börjar lägga på saker på property-kedjor som är ömtåliga (Function, Object, Array osv), men om man har stor kontroll över sin kod och inga utomstående bibliotek som krockar så ska det här vara relativt ofarligt.</p>
<p>Tack <a href="http://socialagent.se/">Joacim</a> för kommentaren, alltid kul att få såna. :p</p>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/hitta-storleken-pa-ett-associativt-array/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>$.append i Internet Explorer 7</title>
		<link>http://antaru.com/append-i-internet-explorer-7/</link>
		<comments>http://antaru.com/append-i-internet-explorer-7/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 09:41:12 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programmering]]></category>

		<guid isPermaLink="false">http://antaru.org/?p=184</guid>
		<description><![CDATA[Gör inte såhär:
var span = $('&#60;span class='error'&#62;').text(\'No u\');
$('#errorcontainerthing').append(span);
Det fungerar inte i Internet Explorer 7 (och antagligen inga versioner under). Gör såhär istället:]]></description>
			<content:encoded><![CDATA[<p>Gör inte såhär:</p>
<pre>
<code>
var span = $("&lt;span class=\"error\"&gt;").text("No u");
$("#errorcontainerthing").append(span);
</code>
</pre>
<p>Det fungerar inte i Internet Explorer 7 (och antagligen inga versioner under). Gör såhär istället:</p>
<pre>
<code>
var span = $("&lt;span&gt;").addClass("error").text("No u");
$("#errorcontainerthing").append(span);
</code>
</pre>
<p>Det borde fungera fint. Nu har jag sparat en timme i ditt liv.</p>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/append-i-internet-explorer-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anonyma funktioner i JavaScript</title>
		<link>http://antaru.com/anonyma-funktioner-i-javascript/</link>
		<comments>http://antaru.com/anonyma-funktioner-i-javascript/#comments</comments>
		<pubDate>Mon, 11 Oct 2010 17:14:05 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programmering]]></category>

		<guid isPermaLink="false">http://antaru.org/?p=176</guid>
		<description><![CDATA[Anonyma funktioner kan man antingen älska eller hata. Eller tycka om sådär, eller inte bry sig om, eller, om man jobbar med JavaScript, bara använda utan att man själv vet om det. I jQuery används de flitigt som callbackfunktioner som körs när event har triggats, och har man lärt sig jQuery genom tutorials och inte [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Anonymous_function">Anonyma funktioner</a> kan man antingen älska eller hata. Eller tycka om sådär, eller inte bry sig om, eller, om man jobbar med JavaScript, bara använda utan att man själv vet om det.<br />
I jQuery används de flitigt som callbackfunktioner som körs när event har triggats, och har man lärt sig jQuery genom tutorials och inte riktigt hänger med kan man sitta och använda anonyma funktioner utan att ens tänka på det.</p>
<pre>
<code>
function foo() { return "Namngiven funktion"; };
var foo = function() { return "Variabel som tilldelas en anonym funktion som värde"; };
</code>
</pre>
<p>Till och med när man använder sig av jQuery&#8217;s event som triggas när DOMen är färdigladdad använder man en anonym funktion:</p>
<pre>
<code>
$(document).ready(function(){
    //DOM färdigladdad, inne i en anonym funktion
});

$(function(){
   //Gör exakt samma sak som koden ovan, men ger +12 sexy till ditt script
});
</code>
</pre>
<p>En av de första &#8220;avancerade&#8221; sakerna man lär sig i jQuery är att om man skickar med en anonym funktion till jQuery-konstruktorn så är det samma sak som att knyta <code>document</code>-objektet till ready-eventet.</p>
<p>Anonyma funktioner är alltså väldigt användbara när man ska utföra något en gång, och kanske inte behöver använda logiken i funktionen någon annanstans, eller när man jobbar med objekt och vill tilldela en funktion till en property.</p>
<pre>
<code>
//Utan att använda anonyma funktioner:
function Person(name, beard, greeting){
    this.name = name;
    this.beard = beard;
    this.greeting = greeting;
    function sayHello() {
        log(this.greeting);
    }
    this.sayHello = sayHello;    //Skapar en funktion enbart för att tilldela den till en property
}

//Man borde istället skriva såhär:
function Person(name, beard, greeting){
    this.name = name;
    this.beard = beard;
    this.greeting = greeting;
    this.sayHai = function() {    //En anonym funktion tilldelas till this.sayHai
        log(this.greeting);
    };
}
</code>
</pre>
<p>Som alltid med JavaScript kan det vara förvirrande till en början, men om man tänker på funktioner som objekt istället för funktioner kan det bli enklare att förstå.</p>
<pre>
<code>
//Tänk såhär:
var num = 230; //Är ett namngivet Number-objekt

alert(230);    //Alert-funktion med ett anonymt Number-objekt som har värdet 230
alert(num);    //Alert-funktion med en namngiven variabel

setTimeout(function(){
    alert("hai");
}, 2000);    //En anonym funktion skickas in som parameter till setTimeout och körs efter två sekunder

function oh(){
    alert("hai");
};

setTimeout(oh, 2000);    //Gör samma sak som koden ovan, fast i det här fallet används en namngiven funktion.
</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/anonyma-funktioner-i-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Praktiskt exempel av closure-funktion</title>
		<link>http://antaru.com/praktiskt-exempel-av-closure-funktion/</link>
		<comments>http://antaru.com/praktiskt-exempel-av-closure-funktion/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 09:54:20 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programmering]]></category>

		<guid isPermaLink="false">http://antaru.org/?p=167</guid>
		<description><![CDATA[Jag har stött på en honest-to-god användbar funktion som använder sig av closure och något som kallas currying. Jag påstår inte att jag förstår teorin bakom, men när det gäller klientsidevalidering i JavaScript hittade jag en användning för det. Det kan ibland vara nödvändigt att validera formulär på klientsidan med hjälp av JavaScript, och det [...]]]></description>
			<content:encoded><![CDATA[<p>Jag har stött på en honest-to-god användbar funktion som använder sig av closure och något som kallas <a href="http://en.wikipedia.org/wiki/Currying">currying</a>. Jag påstår inte att jag förstår teorin bakom, men när det gäller klientsidevalidering i JavaScript hittade jag en användning för det.<br />
Det kan ibland vara nödvändigt att validera formulär på klientsidan med hjälp av JavaScript, och det kan vara värt att skriva ett generellt valideringsobjekt med funktioner som man använder sig av, istället för att skriva omständliga valideringsregler per inputfält.<br />
validation-objektet bör vara del av något större, med vettiga closures. Det här är bara ett exempel.</p>
<pre><code>window.validaton = {
     //Returnerar olika funktioner beroende på om max är satt
    length: function(min, max){
        return function(input){
            if (max) {
                return function(input) {
                    if ($(input).val().length &lt; min || $(input).val().length &gt; max) {
                        return false;
                    }
                    return true;
                }
            }
            return function(input) {
                if ($(input).val().length &lt; min) {
                    return false;
                }
                return true;
            }
        }
    }
}</code></pre>
<p>Det här är praktiskt sett en funktionsgenerator. När man skriver sina valideringsregler för inputfält kan det se ut såhär:</p>
<pre>//Skapar en ny funktion för att se så värdet är längre än 5 men annars hur långt som helst.
var isLongEnough = validation.length(5); 

if (isLongEnough("#AwesomeTextInput")) { //Är man inne i en bind-funktion räcker det med this här
    log("Everything went better than expected");
} else {
   log("Needs atleast 5 characters");
}

//Alternativt
 //Anonym funktion skapas och anropas, inte reusable

if (validation.length(5)("#AwesomeTextInput")) {
    log("Everything went better than expected");
} else {
   log("Needs atleast 5 characters");
}</pre>
<p>Tack vare closures och svart magi vet den returnerade funktionen <code>isLongEnough</code> vad min är satt till.<br />
Enligt mig är det här ett snyggare sätt än att skriva specialanpassade valideringsregler för varje inputfält, plus att man får användning av currying och closures, vilket alltid är trevligt.</p>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/praktiskt-exempel-av-closure-funktion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En fjantig closure-funktion</title>
		<link>http://antaru.com/en-fjantig-closure-funktion/</link>
		<comments>http://antaru.com/en-fjantig-closure-funktion/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 07:41:45 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programmering]]></category>

		<guid isPermaLink="false">http://antaru.org/?p=160</guid>
		<description><![CDATA[var dostuff = function(x) { return function(y) { return function(t) { return function(z) { return x + y + t + z; } } } } dostuff(1)(2)(3)(4); //returnerar 10 Closures är awesome. Nu måste jag bara hitta ett ställe där jag kan använda den här funktionen skarpt&#8230;]]></description>
			<content:encoded><![CDATA[<pre>var dostuff = function(x) {
    return function(y) {
        return function(t) {
            return function(z) {
                return x + y + t + z;
            }
        }
    }
}
dostuff(1)(2)(3)(4); //returnerar 10</pre>
<p>Closures är awesome. Nu måste jag bara hitta ett ställe där jag kan använda den här funktionen skarpt&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/en-fjantig-closure-funktion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Håll den globala namnrymden ren</title>
		<link>http://antaru.com/hall-den-globala-namnrymden-ren/</link>
		<comments>http://antaru.com/hall-den-globala-namnrymden-ren/#comments</comments>
		<pubDate>Fri, 01 Oct 2010 10:21:40 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programmering]]></category>

		<guid isPermaLink="false">http://antaru.org/?p=142</guid>
		<description><![CDATA[Mina &#60;pre&#62;-taggar spiller över lite, så jag ska lösa det på något awesome sätt. Under tiden fungerar piljäveln som ligger uppe till höger för att förstora utrymmet :P JavaScript har inte, som alla andra vanliga programmeringsspråk, block-level-scope och det är inte alltid tydligt på vad this pekar på. Istället använder sig JavaScript av scope på [...]]]></description>
			<content:encoded><![CDATA[<p>Mina &lt;pre&gt;-taggar spiller över lite, så jag ska lösa det på något awesome sätt. Under tiden fungerar piljäveln som ligger uppe till höger för att förstora utrymmet :P</p>
<p>JavaScript har inte, som alla andra vanliga programmeringsspråk, <a href="http://en.wikipedia.org/wiki/Scope_(programming)">block-level-scope</a> och det är inte alltid tydligt på vad <code>this</code> pekar på. Istället använder sig JavaScript av scope på funktionsnivå, som kan förvirra när man börjar utveckla. För att koka ner det så långt jag kan:</p>
<pre>
function hello(){
    var foo = "bar";
}
hello();
alert(foo); //undefined
</pre>
<p>Eftersom att <code>foo</code> deklareras inne i funktionen <code>hello()</code> så har inte scopet utanför funktionen möjlighet att se <code>foo</code>. Det är alltså skillnad på lokalt scope och globalt scope (window-objektet).<br />
När man utvecklar plugins för jQuery kan det ibland vara värt att skapa variabler utanför pluginets scope, men ändå dölja det från det globala scopet, för att undvika konflikter, överskrivna variabler och ett onödigt stort window-namespace.<br />
Det enklaste sättet att göra det på är att lägga hela sitt plugin, med de variabler man behöver, i en anonym självanropande funktion.</p>
<pre>
(function($, window) { //http://antaru.org/self-invoking-functions-i-javascript
    //jQuery-plugins

    var foo = "bar"; //Variabel som kan kommas åt av alla plugins i scopet

    //Plugin utan closure
    $.fn.superPlugin = function() {
        //Pluginfunktionalitet
    }; 

    (function(){
        var hurr = "durr"; //Variabel som enbart existerar i det lokala scopet
        console.log(foo); //Skriver ut "bar"

        //Plugin med closure
        $.fn.closurePlugin = function() {
            //Pluginfunktionalitet
        };
    })();

    console.log(hurr); //undefined    

})(jQuery, this);
</pre>
<p>Man skulle kunna göra separata &#8220;jQuery&#8221;-closures för varje plugin, men jag gillar att ha dem samlade och sedan var för sig, om det skulle krävas, ha ett eget closure; sin egna lilla värld.<br />
Att definiera funktioner och globala variabler i JavaScript är oftast ingen bra idé.</p>
<h2>Tips till alla <a href="http://getfirebug.com/">Firebug</a>-användare</h2>
<p>Kör det här någon gång i början av era scripts:</p>
<pre>
window.log = function() {
    log.history = log.history || [];
    log.history.push(arguments);
    if (this.console) {
        console.log(Array.prototype.slice.call(arguments));
    }
};
</pre>
<p>De som har utvecklat för Firefox och använt Firebugs härliga <code>console.log</code>-funktion, sen testat det i någon annan webbläsare borde känna till problemet när funktionen anropas. Det går sönder. funktionen ovan löser det; plus, om den skapas den direkt kan man anropa log-metoden precis när som helst, och det går inte sönder, även om man råkar släppa koden skarpt.<br />
Scriptet hittade jag på <a href="http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/">Paul Irish hemsida</a>.<br />
<strong>Edit:</strong> Testade lite mer, och att kunna anropa <code>log.history</code> i firebug är faktiskt riktigt sweet.</p>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/hall-den-globala-namnrymden-ren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Associativa arrays är awesome</title>
		<link>http://antaru.com/associativa-arrays-ar-awesome/</link>
		<comments>http://antaru.com/associativa-arrays-ar-awesome/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 09:30:46 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programmering]]></category>

		<guid isPermaLink="false">http://antaru.org/?p=137</guid>
		<description><![CDATA[I JavaScript är allting objekt; strängar är objekt, siffror är objekt, till och med funktioner är objekt. Det härligaste objektet som finns är dock associativa arrayer, eller arrayer med en angiven nyckel istället för bara ett heltalsindex. Den enklaste formen av ett sånt här array är ett objekt med nycklar och värden tillsatta till den [...]]]></description>
			<content:encoded><![CDATA[<p>I JavaScript är allting objekt; strängar är objekt, siffror är objekt, till och med funktioner är objekt. Det härligaste objektet som finns är dock <a href="http://en.wikipedia.org/wiki/Associative_array">associativa arrayer</a>, eller arrayer med en angiven nyckel istället för bara ett heltalsindex. Den enklaste formen av ett sånt här array är ett objekt med nycklar och värden tillsatta till den nyckeln. (Key, Value-pair för de som vill ha den tekniska termen)</p>
<pre>var oh= { hai: "lol" };</pre>
<p>Här skapas ett nytt objekt <code>oh</code> som innehåller en nyckel <code>hai</code> som har värdet &#8220;lol&#8221;. För att senare komma åt värdet med nyckeln <code>hai</code> finns det en del sätt:</p>
<pre>oh.hai; //fungerar
oh["hai"] //fungerar
oh[0] //fungerar inte</pre>
<p>Det andra sättet att hitta värdet kan vara bra om nyckeln innehåller punkter, mellanslag eller andra konstiga tecken som skulle förstöra scriptet.</p>
<p>Syntaxen är väldigt enkel, skapa en variabel, indikera att det är ett objekt med måsvingar <code>({})</code>, sen ange värdet på nycklar i objektet med kolon istället för likamedtecken. Det är även möjligt att lagra objekt i objekt, och funktioner i nycklar, vilket gör det hela än mer awesome.<br />
Större objekt:</p>
<pre>var oh = {
    hai: "lol",
    foo: "bar",
    sayHi: function(){
        alert("Hi");
    },
    hello: {
        world : "Hello World"
    }
};</pre>
<p>Med det här objektet kan man säga hej till världen genom <code>oh.hello.world</code>, eller bara säga hej genom <code>oh.sayHi()</code>.</p>
<p>jQuery tar tillvara på associativa arrayer på väldigt många ställen, som exempelvis <code>css()</code>-funktionen, eller <code>bind()</code>, vilket gör det mycket lättare att manipulera utseendet och uppförandet av DOM-element.<br />
Kod för att knyta multipla events till ett element:</p>
<pre>$("#foo").bind({
    "mouseenter": function(){
        //Funktionalitet för hover in
    },
    "mouseleave": function(){
        //Funktionalitet för hover ut
    },
    "click": function(){
        //Funktionalitet för musklick
    }
});</pre>
<p>Associativa arrays är <strong>awesome</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://antaru.com/associativa-arrays-ar-awesome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: antaru.com @ 2012-02-05 11:57:48 -->
