<?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>Creating The Web... &#187; ajax</title>
	<atom:link href="http://www.simon-jensen.net/tag/ajax/feed" rel="self" type="application/rss+xml" />
	<link>http://www.simon-jensen.net</link>
	<description>Internet entusiast og webprogrammør Simon Jensen</description>
	<lastBuildDate>Fri, 19 Aug 2011 14:22:38 +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>Når AJAX er bedst</title>
		<link>http://www.simon-jensen.net/naar-ajax-er-bedst.html</link>
		<comments>http://www.simon-jensen.net/naar-ajax-er-bedst.html#comments</comments>
		<pubDate>Tue, 23 Sep 2008 07:54:33 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Udvikling]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[akismet]]></category>
		<category><![CDATA[hijax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[kommentar]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/naar-ajax-er-bedst.html</guid>
		<description><![CDATA[Jeg har tidligere haft skrevet om Hijax og for nyligt om Hijax i praksis, emner hvor prædiken går på hvor vigtigt det kan være ikke at udelukke &#8220;dem som ikke kan afvikle Javascript&#8220;&#8230; men der findes dog også de modsatte eksempler &#8211; hvor &#8220;de&#8221; bare skal blive væk! Sidste gang jeg skiftede design m.m. her [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Jeg har tidligere haft skrevet om </strong><a type="Hijax" href="http://www.simon-jensen.net/hijax.html"><strong>Hijax</strong></a><strong> og for nyligt om </strong><a type="Hijax i praksis" href="http://www.simon-jensen.net/hijax-i-praksis.html"><strong>Hijax i praksis</strong></a><strong>, emner hvor prædiken går på hvor vigtigt det kan være ikke at udelukke &#8220;<span style="font-style: italic;">dem som ikke kan afvikle Javascript</span>&#8220;&#8230; men der findes dog også de modsatte eksempler &#8211; hvor &#8220;<em>de</em>&#8221; bare skal blive væk!</strong></p>
<p>Sidste gang jeg skiftede design m.m. her på bloggen tog jeg hijax-princippet til mig, hvilket f.eks. har gjort, at man nu kan søge &#8220;live&#8221; <span style="font-style: italic;">med</span> Javascript og &#8220;almindeligt&#8221; <span style="font-style: italic;">uden</span> Javascript. Jeg ville have brugt samme teknik til kommentering, men kom aldrig længere end til at man kunne kommentere via et &#8220;normalt&#8221; POST.</p>
<h3>Blog spam helvede <img src="/admin/editors/fckeditor/editor/images/smiley/msn/angry_smile.gif" alt="" /></h3>
<p>At have en ganske almindelig standard HTML-formular er, nu til dags, næsten det samme som at sige &#8220;<em>Jeg vil gerne være offer for al jeres lorte-spam &#8211; bare fyr løs</em>&#8220;. Det var i hvert hvad resultatet for mig&#8230;</p>
<p><span id="more-119"></span></p>
<p>Heldigvis havde jeg implementeret <a type="Akismet Antispam" href="http://www.simon-jensen.net/akismet-antispam.html">Akismet Antispam</a>, og havde i min administration rimelig nem mulighed for at se hvilke kommentarer der var spam&#8230; men ærlig talt, det er sku liiiidt irriterende at være nød til konstant at slette spam-kommentarer! Man kunne selvfølgelig bare lade være med at gemme de kommentarer Akismet tror er spam &#8211; men man kan jo aldrig vide sig sikker?</p>
<p>Følgende screenshot var resultatet af ikke at have været ved computeren en ellers så stille og rolig søndag &#8211; Mandag morgen; vær så god at slette spam!</p>
<p style="text-align: center;"><a href="http://www.simon-jensen.net/admin/uploads/image/ajax-comment/60-spam-comments.png"><img title="60 nye spam kommentare!" src="http://www.simon-jensen.net/admin/uploads/image/ajax-comment/60-spam-comments.png" border="1" alt="60 nye spam kommentare!" width="490" height="459" /></a></p>
<h3>Spam kan mindskes med AJAX!</h3>
<p>Nu har jeg endelig fået taget mig sammen til at få implementeret <span style="font-style: italic;">kommentering med AJAX</span>, ligesom i det gamle design. Men ikke nok med det &#8211; <span style="font-weight: bold;">jeg har nu helt fjernet muligheden for at kommentere, hvis man ikke har Javascript understøttet</span>! Jeps, det er grove løjer, men jeg har set mig nødsaget til det → se ovenstående screenshot <img src="/admin/editors/fckeditor/editor/images/smiley/msn/tounge_smile.gif" alt="" />.</p>
<p>Faktisk har jeg haft det nye &#8220;setup&#8221; til at kører i et par dage nu, og indtil nu er der ikke kommet en eneste spam-kommentar igennem &#8211; Herligt!</p>
<p>Kommenteringen er testet i IE 6 og 7 + Firefox 3 til Windows samt Firefox 3 og Safari 3 til Mac &#8211; skulle der være nogen derud, som ikke synes at kunne få det til at virke må I MEGET GERNE skrive mig en mail på &#8220;admin[snabela]simon-jensen.net&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/naar-ajax-er-bedst.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hijax i praksis</title>
		<link>http://www.simon-jensen.net/hijax-i-praksis.html</link>
		<comments>http://www.simon-jensen.net/hijax-i-praksis.html#comments</comments>
		<pubDate>Thu, 11 Sep 2008 08:06:54 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Udvikling]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[hijax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/hijax-i-praksis.html</guid>
		<description><![CDATA[Tilbage i april fandt jeg frem til hijax princippet, og i den forbindelse lovede jeg at der ville komme en mere praktisk gennemgang &#8211; det vil jeg så forsøge mig med nu. Mens sidste post om hijax kort fortalte princippet bag hijax, og snakken mere gik på &#8220;hvorfor&#8221; man burde bruge det, har jeg nu [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-weight: bold;">Tilbage i april fandt jeg frem til </span><a title="Hijax" href="http://www.simon-jensen.net/hijax.html"><span style="font-weight: bold;">hijax</span></a><span style="font-weight: bold;"> princippet, og i den forbindelse lovede jeg at der ville komme en mere praktisk gennemgang &#8211; det vil jeg så forsøge mig med nu.</span></p>
<p>Mens sidste post om hijax kort fortalte princippet bag hijax, og snakken mere gik på &#8220;hvorfor&#8221; man burde bruge det, har jeg nu haft mulighed for rent faktisk at lege lidt med hijax, og mener nu der skulle være basis for at skrive endnu en post herom.</p>
<h3>Hijax super kort</h3>
<p>Jeg har taget udgangspunkt i et simpelt eksempel, som jeg selv synes forklare det praktiske bag princippet. Super kort fortalt, så går hijax ud på at &#8220;hijacke&#8221; (overtage) funktionalitet på din hjemmeside og udføre denne via AJAX, men <span style="font-style: italic;">SAMTIDIG</span> skal det være muligt at afvikle samme funktionalitet <span style="font-style: italic;">UDEN</span> brug af Javascript &#8211; grundtanken i <a title="Læs mere om denne ide på Wikipedia" href="http://en.wikipedia.org/wiki/Fault-tolerant_system" target="_blank">graceful degradation</a>.</p>
<p><span id="more-110"></span></p>
<h3>Hijax en formular</h3>
<p>Hijax kan f.eks. bruges i forbindelse med en formular &#8211; I denne post har jeg taget udgangspunkt i en simpelt udgave af en tilmeldingsformular til et tænkt nyhedsbrev, men i princippet kan hijax bruges til en hvilken som helst formular.</p>
<p><span style="font-weight: bold;">HTML formularen:</span></p>
<p>Formularen er meget standard med to inputs og postering via POST-metoden. Vi kan bruge <span style="font-family: Courier New;">onsubmit</span>-attributten til at hijacke formularen. <span style="font-family: Courier New;">onsubmit</span> giver os nemlig mulighed for at udføre en stump Javascript <em>før</em> dataen vil blive postet til serveren. I eksemplet herunder tager jeg hele formularen med som parameter til Javascript funktionen <span style="font-family: Courier New;">hijax(form)</span>. For at være sikker på at det &#8220;almindelige&#8221; POST ikke bliver udført returnerer vi <span style="font-family: Courier New;">false</span> efterfølgende&#8230; da dette faktisk er direkte Javascripting i formularen vil dennes postering <em>kun</em> stoppes hvis Javascript er understøttet.</p>
<pre>&lt;form method="post" action="<strong>signup.php</strong>" onsubmit="<strong>hijax(this); return false;</strong>"&gt;
    &lt;label&gt;Name:&lt;/label&gt;
    &lt;input type="text" name="name"   /&gt;
    &lt;label&gt;E-mail:&lt;/label&gt;
    &lt;input type="text" name="email"   /&gt;
    &lt;input type="submit"   /&gt;
&lt;/form&gt;</pre>
<p><strong>Javascriptet:</strong></p>
<p>Selve Javascriptet behøver ikke være mere indviklet end vist herunder. Jeg har endnu engang taget udgangspunkt i et AJAX request med <a title="Prototype JS" href="http://www.prototypejs.org/" target="_blank">Prototype JS</a>.</p>
<p>Her serializerer jeg hele formularen, og tilføjet en ekstra parameter <span style="font-family: Courier New;"><strong>hijax=true</strong></span>. Selve værdien er denne parameter bruger jeg faktisk ikke til noget, hvilket du vil kunne se i understående PHP-script. Vi poster det hele til PHP-filen <span style="font-family: Courier New;">signup.php</span>, hvilken også var action-fil i HTML-formularen ovenfor.</p>
<pre>hijax = function(formular) {
    var url = <strong>signup.php</strong>;
    var params = Form.serialize(formular) + <strong>&amp;hijax=true</strong>;
    new Ajax.Request(url, {method:post, postBody:params});
}</pre>
<p><strong>PHP serveren:</strong></p>
<p>Som programmør forsøger jeg at være doven!? Jeg vil gerne have et optimalt resultat af min kode, og jeg vil skrive så få linier som muligt. Og her er hijax fantastisk, for ligemeget om vi posterer formularen &#8220;almindeligt&#8221; eller via AJAX, kan vi bruge samme fil til at håndtere posteringen.</p>
<p>Da jeg også forsøger at være lidt af en sucker for brugervenlighed, vil jeg gerne have mulighed for at give brugeren et response ligemeget om denne har Javascript-understøttelse eller ej. Tricket er altså at kunne adskille de to posteringer fra hinanden. Jeg har brugt den ekstra parameter ved AJAX-posteringer, men du vil sikkert selv kunne komme på andre løsninger (<em>tilføj dem gerne i kommentaren</em>)?</p>
<pre>&lt;?php
session_start();
$name = mysql_real_escape_string($_POST[name]);
$email = mysql_real_escape_string($_POST[email]);
<strong>$isHijax = $_POST[hijax];</strong>
mysql_query("INSERT INTO signups (name, email) VALUES ($name, $email)");
if(isset(<strong>$isHijax)</strong>) {
    <strong>echo</strong> Saved using AJAX...;
} else {
    <strong>$_SESSION[message]</strong> = Saved using normal post...;
    $redirect = $_SERVER[HTTP_REFERER];
    header("Location: $redirect");
}
?&gt;</pre>
<p>Med ovenstående metode vil du kunne &#8220;hijaxe&#8221; en formular, og med lidt få ændringer i formularens action-fil, vil du også have mulighed for at give brugerene et response, ligemeget om de bruger AJAX eller ej &#8211; Det er skudda smart <img src="/admin/editors/fckeditor/editor/images/smiley/msn/wink_smile.gif" alt="" />.</p>
<h3>Download</h3>
<p align="center"><a href="http://www.simon-jensen.net/admin/plugins/download_manager/download.php?ID=5"><img title="Download" src="http://www.simon-jensen.net/admin/uploads/image/download.png" alt="Download" width="119" height="104" align="absMiddle" /></a> <a title="Download kode-eksempel på hijax" href="http://www.simon-jensen.net/admin/plugins/download_manager/download.php?ID=5">Hijax af en formular (.zip)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/hijax-i-praksis.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>AJAX request til andet domæne</title>
		<link>http://www.simon-jensen.net/ajax-request-til-andet-domaene.html</link>
		<comments>http://www.simon-jensen.net/ajax-request-til-andet-domaene.html#comments</comments>
		<pubDate>Wed, 04 Jun 2008 15:40:32 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Udvikling]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[proxy]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/ajax-request-til-andet-domaene.html</guid>
		<description><![CDATA[Har du leget med AJAX har du muligvis også fundet ud af, at det ikke bare kan lade sig gøre at lave et request til et andet domæne? Rent faktisk, kan det ikke engang (bare sådan lige) lad sig gøre, at lave et request til en anden server på samme domæne! Og dog &#8230; Grunden [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Har du leget med AJAX har du muligvis også fundet ud af, at det ikke bare kan lade sig gøre at lave et <em>request</em> til et andet domæne? Rent faktisk, kan det ikke engang (bare sådan lige) lad sig gøre, at lave et request til en anden server på samme domæne! Og dog &#8230;</strong></p>
<p>Grunden til at du måske har siddet og mumlet lidt i skægget, skal findes hos webbrowseren, det er nemlig her restriktionen ligger. Jeg tror ikke jeg kan forklare det meget bedre end <a title="Beskrivelse af Cross-domain AJAX hos Yahoo!" href="http://developer.yahoo.com/javascript/howto-proxy.html" target="_blank">Yahoo!</a>, som skriver følgende:</p>
<blockquote><p>All modern web browsers impose a security restriction on network connections, which includes calls to XMLHttpRequest. This restriction prevents a script or application from making a connection to any web server other than the one the web page originally came from.</p></blockquote>
<p>But fear not &#8211; der selvfølgelig en løsning &#8230;</p>
<p><span id="more-86"></span></p>
<h3>No-go scenariet</h3>
<p>Lad os starte med at forklare <em>no-go</em> scenariet visuelt (tak til Yahoo! for allerede at have lavet grafiken <img src="http://www.simon-jensen.net/admin/editors/fckeditor/editor/images/smiley/msn/tounge_smile.gif" alt="" width="19" height="19" />).</p>
<p>Har du en webapplikation, som findes på en webserver, og afvikles i en browser hos den besøgende, kan det altså ikke lade sig gøre, at lave et request til en ekstern server/service som f.eks. Yahoo! via XMLHttpRequest (AJAX) &#8211; Dette sørger browseren for, vha. den omtalte restiktion ved denne type kald.</p>
<p>Et sådanne forsøg, vil se ud som herunder:</p>
<p><img src="http://www.simon-jensen.net/admin/uploads/image/cross-domain-ajax/proxy2.gif" border="1" alt="No-go scenarie for et cross domain AJAX request." width="347" height="284" /></p>
<h3>Do-go scenariet</h3>
<p>Vi ved altså at restiktionen ligger hos browseren &#8211; Samtidig kan jeg så fortælle, at det <em>godt kan lade sig gøre</em> at lave et request fra domænets server til en anden ekstern server/service/domæne. Når det er sagt, så kan du vel næsten gætte dig til, hvordan vi kan overkomme at lave et AJAX-request til et andet domæne?!</p>
<p>Jeps &#8211; I stedet for at lave AJAX-requestet direkte til den eksterne server, kalder vi en <em>proxy</em>, på vores egen server. Med proxy, menes faktisk bare et script som sender kaldet videre til den eksterne server, samt leverer responset herfra tilbage til browseren.</p>
<p>Scenariet ser ud som herunder:</p>
<p><img src="http://www.simon-jensen.net/admin/uploads/image/cross-domain-ajax/proxy3.gif" border="1" alt="Do-go scenarie for et cross domain AJAX request." width="525" height="201" /></p>
<p>En sådanne proxy kan laves på flere måder. Hos Yahoo! kan du <a title="Simpel Web Proxy til cross domain requests fra Yahoo!" href="http://developer.yahoo.com/javascript/samples/proxy/php_proxy_simple.txt" target="_blank">downloade en version som benytter CURL</a>. Jeg har leget med en version som benytter sig af <a title="PEAR :: The PHP Extension and Application Repository." href="http://pear.php.net/" target="_blank">PEAR</a>.</p>
<h3>Proxy med PEAR HTTP/Request</h3>
<p>PEAR er et stort framework som fungerer som et pakke-system. PEAR leverer pakker/klasser til mere eller mindre alt, hvad du kunne tænke dig &#8211; men for at lave vores omtalte proxy, skal vi faktisk ikke bruge andet, end en standard PEAR-error-klasse samt en Request-klasse til en HTTP pakke &#8211; det lyder indviklet?! Bare rolig, du kan <a href="#download">downloade det hele </a>i slutningen af denne post <img src="http://www.simon-jensen.net/admin/editors/fckeditor/editor/images/smiley/msn/regular_smile.gif" alt="" width="19" height="19" />.</p>
<p><strong>Server proxy</strong></p>
<p>Et lidt simplificeret eksempel på en proxy med PEAR, ser ud som herunder:</p>
<pre>&lt;?php
require_once "HTTP/Request.php";

$url = $_REQUEST[url];
$req =&amp; new HTTP_Request($url);

if (!PEAR::isError($req-&gt;sendRequest())) {
    print $req-&gt;getResponseBody();
}
?&gt;</pre>
<p><strong>Klienten / Javascriptet</strong></p>
<p>Proxy-scriptet skal altså modtage den URL som den skal hente. Der oprettes et objekt af typen HTTP_Request, som vi kan bruge til at sende requestet videre med, samt &#8220;print&#8221; responset. Responset skal herefter modtages på klient-siden, og endelig udskrives &#8211; dette kunne se ud som herunder:</p>
<pre>proxy_request = function()
{
    $("loading").toggle();
    var info = function(t) {
        $("loading").toggle();
        $("status").innerHTML = t.responseText;
    };

    var url = proxy.php?reg_url=   encodeURIComponent("http://flickr.com/photos/simon_jensen/");
    new Ajax.Request(url, {method:get, onSuccess:info, onFailure:info});
}</pre>
<h3><a name="download"></a>Download</h3>
<p align="center"><a href="http://www.simon-jensen.net/admin/plugins/download_manager/download.php?ID=4"><img src="http://www.simon-jensen.net/admin/uploads/image/download.png" alt="Download" width="119" height="104" align="absMiddle" /></a> <a title="Download" href="http://www.simon-jensen.net/admin/plugins/download_manager/download.php?ID=4">Cross Domain AJAX Request (.zip)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/ajax-request-til-andet-domaene.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hijax</title>
		<link>http://www.simon-jensen.net/hijax.html</link>
		<comments>http://www.simon-jensen.net/hijax.html#comments</comments>
		<pubDate>Sat, 05 Apr 2008 21:22:52 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Udvikling]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[gracefull degredation]]></category>
		<category><![CDATA[hijax]]></category>
		<category><![CDATA[standarder]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/hijax.html</guid>
		<description><![CDATA[Forleden faldt jeg over en artikel af Jeremy Keith, et medlem af The Web Standard Project. Artiklen handler, sjovt nok, om hvordan man bør og kan, designe sin webapplikation, sådan at flest muligt får mulighed for at bruge den &#8211; en teknik Jeremey har valgt at  kalde &#8220;Hijax&#8221;. Problematikken med at visse applikationer udelukker visse [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Forleden faldt jeg over </strong><a title="Læs artiklen her." href="http://domscripting.com/blog/display/41" target="_blank"><strong>en artikel af Jeremy Keith</strong></a><strong>, et medlem af </strong><a title="Gå til http://webstandards.org/." href="http://webstandards.org/" target="_blank"><strong>The Web Standard Project</strong></a><strong>. Artiklen handler, sjovt nok, om hvordan man bør og kan, designe sin webapplikation, sådan at flest muligt får mulighed for at bruge den &#8211; en teknik Jeremey har valgt at  kalde &#8220;Hijax&#8221;.</strong></p>
<p>Problematikken med at visse applikationer udelukker visse brugere, har længe fundet sted, og specielt opstår dette problem ved brugen af Javascripts, Flash eller andet scripting, som stille specielle krav til browseren. <em>AJAX is all about Javascript</em>, og med den store fremgang denne &#8220;teknik&#8221; har fået, er problemet, selvsagt, ikke blevet mindre.</p>
<p><em>Vi</em> hopper på Javascript-vognen uden at tænke over at der stadig kan komme brugere til, som ikke har mulighed for at afvikle de smarte features man kan opnå med AJAX, og i værste fald ødelægger dette mere, end den vundne feature ville have givet.</p>
<p>Dette er lige nøjagtig hvad man med Hijax vil forsøge at komme til livs! I denne post vil jeg forklare lidt mere grundlæggende, hvad der ligger i Hijax, for snarest at komme med en mere praktisk gennemgang.</p>
<p><span id="more-106"></span></p>
<h3>Hvorfor er det så vigtigt?</h3>
<p>Den aller vigtigste grund er, som beskrevet ovenfor, <em>at der faktisk stadig er brugere der ikke kan afvikle Javascript</em>! Jeps, den er god nok, og selvom det er brugergrupper som vi måske ikke tænker så meget på i det daglige, er de faktisk pænt store og med voksende indflydelse.</p>
<p>Den største gruppe af disse er vel stadig <em>søgemaskinernes søgerobotter</em>! Søgerobotter &#8220;taler&#8221; ganske simpelt ikke Javascript sproget. Robotterne læser bedst ren (X)HTML, og det er som om de bare springer over, hvor der står noget med <span style="font-family: Courier New;">&lt;script&#8230;&gt;</span>.</p>
<p>En anden stor, og voksende, gruppe er <em>brugere på mobiltelefoner</em>! At designe en webapplikation til mobiltelefoner er et større kapitel, og Javascript er langt fra den eneste ting man skal tage højde for her &#8211; Men mobile browsere der understøtter Javascripts er pt., efter min bedste overbevisning, stadig i undertal! iPhonen er (officielt) ikke kommet til Danmark endnu, men når det sker vil jeg tro, at man vil kunne måle et stigning i søgninger/besøg med mobiltelefonerne på de danske sider. Der findes selvfølgelig <a title="Firefox til mobilen" href="http://www.simon-jensen.net/firefox-til-din-mobiltelefon.html">mobile</a> <a title="Opera Mini" href="http://www.simon-jensen.net/opera-mini-4.0.html">løsninger</a> derude, men det skal ikke være nødvendigt at installere en 3. parts browser, for at kunne surfe (ordentligt) på nettet vel?</p>
<p>Specielt er du i farvezonen, hvis du bruger Javascript til navigation på din hjemmeside! Tags som <span style="font-family: Courier New;">onclick</span>, <span style="font-family: Courier New;">window.localtion.href</span>, bør ikke være <em>nødvendige</em> at kunne afvikle, for at navigere din side. I henhold til mobiltelefonen, bør man huske på, at langt de fleste ikke har den samme måde at navigere på &#8211; musen mangler! Jo, nogle har touchscreen, og nogle kan til dels bruge en pen &#8211; men <span style="font-family: Courier New;">mouseover</span>, og ligeledes CSS tagget <span style="font-family: Courier New;">:hover</span>, bør du ikke regne med virker specielt godt på en mobiltelefon!</p>
<h3>Test hvad der virker uden Javascript</h3>
<p>Den letteste måde at teste din sides funktionalitet, som den vil være på en mobiltelefon er ganske simpelt, at slå Javascript fra i din browser &#8211; noget langt de fleste browser har mulighed for. Den funktionalitet der efterfølgende kan afvikles, vil højst sandsynligt være den samme som du vil kunne bruge på en mobiltelefon.</p>
<p>For at se hvad søgemaskinernes søgerobotter møder og kan, på din side, findes den tekstbaserede browser Lynx. Lynx findes både til <a title="Lynx til Windows." href="http://www.vordweb.co.uk/standards/download_lynx.htm" target="_blank">Windows</a>, <a title="Lynx til Mac." href="http://www.apple.com/downloads/macosx/unix_open_source/lynxtextwebbrowser.html" target="_blank">Mac</a> og <a title="Mere om Lynx på Wikipedia." href="http://en.wikipedia.org/wiki/Lynx_%28web_browser%29#External_links" target="_blank">Linux</a>, og afvikles i en kommandoprompt som vist på billedet herunder.</p>
<p><a title="www.simon-jensen.net set gennem Lynx." href="http://www.simon-jensen.net/admin/uploads/image/hijax/lynx.png"><img style="width: 469px; height: 244px;" title="www.simon-jensen.net set gennem Lynx." src="http://www.simon-jensen.net/admin/uploads/image/hijax/lynx.png" alt="www.simon-jensen.net set gennem Lynx." /></a></p>
<p>Man skal lige vende sig til at navigere i &#8220;browseren&#8221;, men når det er på plads, kan du få et ret godt billede af, hvordan en søgerobot kan &#8220;benytte&#8221; din side. Besøger du min side, vil du sikkert ligge mærke til at det ikke er muligt at søge via min <a title="Læs posten &quot;Live Search med Prototype JS og PHP&quot;" href="http://www.simon-jensen.net/live-search-med-prototype-js-og-php.html">Live Search</a>, da denne udelukkende aktiveres via Javascript.</p>
<h3>Kernen i Hijax: Graceful degradation</h3>
<p>Kernen til at undgå at udelukke en håndfuld besøgende i at kunne bruge dit site ordenligt, skal findes i teknikken <em>Graceful degradation &#8211; </em>som også er kernen i Hijax.</p>
<p>Graceful degradation er en meget logisk en simpel tanke &#8211; kort fortalt, levere du et alternativ, til de brugere som ikke har mulighed for at afvikle Javascript. Den letteste måde at forklare graceful degradataion på, er gennem et lille eksempel. Du bruger faktisk browserens mulighed for at checke understøttelsen af Javascript. Hvis browseren ikke understøtter Javascript &#8220;falder den tilbage&#8221; til en standard funktionalitet.</p>
<p>Kodestumpen nedenfor vil udføre Javascript-funktionen <span style="font-family: Courier New;">popUp(url)</span>, som tænkt vil åbne www.simon-jensen.net i et popup-vindue &#8211; hvis ellers Javascript er understøttet. Hvis Javascript <em>ikke</em> er understøttet, vil brugeren på normal vis blive videresendt til adressen.</p>
<pre>&lt;a href="http://www.simon-jensen.net/" onclick="popUp(http://www.simon-jensen.net); return false;"&gt;Simon Jensen&lt;/a&gt;</pre>
<h3>Hijax i en nødeskald</h3>
<p>Tankegangen i Hijax er, på samme måde som Gracefull degradation, meget logisk og simpel.</p>
<p>Som Jeremy beskriver Hijax, går dette i praksis ud på, at ud først udvikler en &#8220;normal/klassisk&#8221; version af din webapplikation. Med normal menes der, en version som ikke udelukker søgemaskinerobotter og andet godtfolk, som ikke kan afvikle Javascript. Herefter kan du &#8220;pakke&#8221; dine formulare, og evt. andet, ind i Javascript-funktionalitet &#8211; Med andre ord &#8220;<strong><em>hijacke dine formulare med AJAX</em></strong>&#8220;.</p>
<p>Denne &#8220;overtagelse&#8221; skal selvfølgelig gøres efter Gracelfull degradation, således at vi ikke bare ender med en Javascript baseret løsning, men biholder den klassiske version, så alle kan være med.</p>
<h3>Hijax i praksis</h3>
<p>Jeg har endnu ikke haft leget med Hijax i praksis, men forventer at komme igang med det snarrest &#8230; herefter vil der, som skrevet i starten, komme en lille opfølger på teknikken. Nu skulle de vigtigste pointer være slået fast, og jeg er pændt sikker på at jég, for eftertiden, vil tænke mere over, at levere alternativer til Javascript-baseret funktionaliter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/hijax.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Live Search med Prototype JS og PHP</title>
		<link>http://www.simon-jensen.net/live-search-med-prototype-js-og-php.html</link>
		<comments>http://www.simon-jensen.net/live-search-med-prototype-js-og-php.html#comments</comments>
		<pubDate>Sun, 09 Mar 2008 11:03:41 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Udvikling]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[live search]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[script.aculo.us]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/live-search-med-prototype-js-og-php.html</guid>
		<description><![CDATA[Update 28/04-08: Live-search understøtter nu ÆØÅ &#8211; download ny version i slutningen af denne post! I forbindelse med det sidste nye redesign, har jeg oprettet en &#8220;Live search&#8221;. Nåhhh ja, den er måske ikke så live som en definition vil have det &#8211; men det er da en fed feature &#8211; og funktionaliteten bag den, vil [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.simon-jensen.net/admin/uploads/image/information.png" alt="Update" width="16" height="16" /> <span style="text-decoration: underline;"><strong>Update 28/04-08: Live-search understøtter nu ÆØÅ &#8211; </strong></span><a title="Download Live-Search" href="http://www.simon-jensen.net/live-search-med-prototype-js-og-php.html#download"><span style="text-decoration: underline;"><strong>download ny version</strong></span></a><span style="text-decoration: underline;"><strong> i slutningen af denne post!</strong></span></p>
<p><strong>I forbindelse med det sidste nye redesign, har jeg oprettet en &#8220;Live search&#8221;. Nåhhh ja, den er måske ikke så <em>live</em> som en definition vil have det &#8211; men det er da en fed feature &#8211; og funktionaliteten bag den, vil jeg da gerne dele med jer.</strong></p>
<p><a title="Live Search" href="http://www.simon-jensen.net/admin/uploads/image/live-search/live-search.jpg"><img style="width: 184px; height: 86px;" title="Live Search" src="http://www.simon-jensen.net/admin/uploads/image/live-search/live-search.jpg" border="1" alt="Live Search" align="right" /></a>Denne post består således af en gennemgang, af de vigtigste punkter i implementeringen, det være sig lidt XHTML, CSS, Javascript samt PHP.</p>
<p>I slutningen af posten, kan du desuden <a title="Gå direkte til download af &quot;Live search&quot;." href="http://www.simon-jensen.net/live-search-med-prototype-js-og-php.html#download">downloade</a> en lille demo-version af funktionen.</p>
<p>For at benytte koden i denne post kræves det, at du har downloaded og inkluderet Javascript frameworket <a title="Læs mere og download Prototype her." href="http://www.prototypejs.org/" target="_blank">Prototype JS</a>, samt effektbiblioteket <a title="Læs mere og download script.aculo.us her." href="http://script.aculo.us" target="_blank">script.aculo.us</a>. Disse skal inkluderes i sidens <span style="font-family: Courier New;">&lt;head&gt;</span>-sektion, som med et hvert andet Javascript.</p>
<p><span id="more-91"></span></p>
<h3>XHTML</h3>
<p>Jeg har gjort det til god skik, at oprette en &#8220;container&#8221;-div. Dette div er ikke nødvendig, men her er det taget med for at få bare en smule design med.</p>
<p>Inde i denne container findes et billede, som er stylet til at være skjuldt. Dette er hvad jeg bruger som loading animation &#8211; altså en animation der skal vise, at et script arbejder. Input feltet skulle gerne tale for sig selv. Straks herunder er der, i endnu et div, oprettet en ul/li-liste &#8211; det er denne vi vil fremvise resultater i. Resultaterne skal ligeledes fremkommet/tilføjes som li-elementer til listen.</p>
<pre>&lt;div id="container"&gt;
    &lt;img src="loading.gif" id="lsloading" align="right" alt="" style="display:none;"  /&gt;
    &lt;input type="text" value="Type and you´ll find..." id="lsquery"  /&gt;
    &lt;br  /&gt;
    &lt;div id="lsresults" style="display:none;"&gt;
        &lt;ul id="lsResList"&gt;
            &lt;li&gt;&lt;i&gt;Type and you´ll find...&lt;/i&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<h3>CSS</h3>
<p>CSS delen af dette script, taler også lidt for sig selv. Det er muligt, at designer kan laves en hel del nemmere (læs: med mind css), men her er indsat hvad du finder i demoen.</p>
<p>Det vigtigste her, vil nok være at påpege, at resultatlisten er sat til absolut positionering. Dvs. vi kan vise den ovenpå andre elementer, hvorfor den ikke skal til at &#8220;skubbe&#8221; rundt på designet. Du har måske bemærket at resultatlisten er en smule gennemsigtigt &#8211; Dette ER en CSS feature, men den bliver udført gennem Javascript-delen.</p>
<pre>body {
    font-family: "Trebuchet MS";
    font-size: 1em;
    background: #333;
}

#container {
    background: #fff;
    width: 400px;
    padding: 20px;
    margin: 0 auto;
}

#container #lsloading {
    position: relative;
    top: 5px;
}

#container input {
    font-family: "Trebuchet MS";
    font-size: 1em;
    width: 350px;
    margin-left: 20px;
}

#container #lsresults {
    position: absolute;
    background: #fff;
    color: #333;
    width: 354px;
    margin-left: 20px;
}

#container #lsresults ul {
    list-style: none;
    margin: 0px;
    padding: 0px;
}

#container #lsresults ul li {
    list-style: none;
    margin: 10px;
    padding: 0px;
}</pre>
<h3>Javascript</h3>
<p>Javascriptet er den største del af denne &#8220;applikation&#8221;. JS-delen består af et Live Search objekt (<span style="font-family: Courier New;">ls</span>) med metoderne <span style="font-family: Courier New;">init()</span>, <span style="font-family: Courier New;">search()</span>, <span style="font-family: Courier New;">showResults()</span> og <span style="font-family: Courier New;">hideResults()</span>. Derudover bliver der, når en side er loaded,  initialiseret nogle observer eventhandlers på søgefelter.</p>
<p>Humlen ligger i <span style="font-family: Courier New;">init()</span> og <span style="font-family: Courier New;">search()</span> metoderne. <span style="font-family: Courier New;">init()</span> bliver kaldt hver gang der tastes i søgefeltet, og denne kalder <span style="font-family: Courier New;">search()</span> som udføre et AJAX-kald til serveren, som levere selve søgningen. For ikke at spamme serveren er der indbygget en timer i init() metoden som gør, at <span style="font-family: Courier New;">search()</span> metoden kun bliver kaldt hvis der ikke er tastet noget i søgefeltet i 0.5 sekunder.</p>
<pre>/**
 * Live search
 */
var ls = {
	queryField: "lsquery", //id name of queru input-field
	results: "lsresults", //id name of result-list
	loading: "lsloading", //id name for loading animation
	timer: null,

	/**
	 * Initialize a search:
	 * reset timer, and performe search
	 * if nothing has been typed in 0.5 sec.
	 */
	init: function(event) {
		var query = Event.element(event).value;
		ls.timer = clearTimeout(ls.timer);
		if(query != "" || query != "Type and you´ll find...") {
			ls.timer = setTimeout("ls.search(" query ");", 500);
		}
	},

	//start a search using AJAX
	search: function(query) {
		if(query != "") {
			$(ls.loading).show();
			var done = function(t) {
				$(ls.loading).hide();
			}
			var url = php-backend.php;
			var pars = action=search&amp;query=   query;
			new Ajax.Updater(lsResList, url,
			{
				method: post,
				parameters: pars,
				onSuccess:done,
				onFailure:done,
				inserting:Insertion.Before
			});
		}
	},

	//show the result list
	showResults: function() {
		if($(ls.results).getStyle(opacity) != 0.9)
			new Effect.Appear(ls.results, {duration:0.2, from:0.0, to:0.9});
	},

	//hide the result list
	hideResults: function() {
		new Effect.Opacity(ls.results, {duration:0.2, from:0.9, to:0.0});
	}
}

/**
 * Initialize key-observers for search input field.
 */
Event.observe(window, load, function() {
	$(ls.queryField).observe(keyup, ls.init);
	$(ls.queryField).observe(keydown, ls.init);

	//remove input field value when first focused
  	$(ls.queryField).onfocus = function() {
  		if($(ls.queryField).value == "Type and you´ll find...")
			$(ls.queryField).value = "";
		ls.showResults();
	}

	//reset input field when not focused and value is ""
  	$(ls.queryField).onblur = function() {
  		if($(ls.queryField).value == "")
  			$(ls.queryField).value = "Type and you´ll find...";
  		ls.hideResults();
  	}
});</pre>
<h3>PHP</h3>
<p>PHP delen, er hvad jeg ovenfor har kaldt &#8220;serveren&#8221;. Hvordan du vil udføre selve søgningen er mere eller mindre op til dig selv. Vælger du at benytte dette script, skal resultaterne dog returneres som én streng. Hvert resultat skal, for at designet holder stik, leveres som et <span style="font-family: Courier New;">&lt;li&gt;</span>-element.</p>
<p>Bare for at give en ide, leveres scriptet med følgende PHP backend.</p>
<pre>&lt;?php
/************************************************************************
 * Here you would probably perform som DB-search.
 * In this example, you will only find a hit, when typing a string that -
 * is in the array $results.
 ************************************************************************/
if($_POST["action"] == "search") :
	$query = utf8_decode(urldecode($_POST["query"]));
	$results = array("","webprogrammering","blog","ajax","javascript","php","css");
	$key = array_search($query, $results);
	if($key) :
		echo "&lt;li&gt;&lt;a href="#"&gt;"".utf8_encode($results[$key])."" found with key: ".$key."&lt;/a&gt;&lt;/li&gt;";
	else :
		echo "&lt;li&gt;&lt;i&gt;Intet resultat&lt;/i&gt;&lt;/li&gt;";
	endif;
endif;
?&gt;</pre>
<p>Som beskrevet i kommentaren, vil man selvfølgelig lave en reel database søgning eller lignende, hvilket lige nøjagtig er hvad jeg gør her på sitet.</p>
<p>Sååå &#8211; uden yderligere forklaringer skal du være velkommen til at downloade, modificere osv. følgende version af Live Search. Skulle der opstå problemer, eller mangler du yderligere forklaring, skal du endelig kommentere nedenfor.</p>
<p><a name="download"></a></p>
<h3>Download</h3>
<p><a title="Download &quot;Live search&quot; (Zip)" href="http://www.simon-jensen.net/admin/plugins/download_manager/download.php?ID=3"><span style="text-decoration: line-through;">Live Search med Prototype JS og PHP</span></a><span style="text-decoration: line-through;"> (.zip)</span></p>
<p><a title="Download &quot;Live search&quot; (Zip)" href="http://www.simon-jensen.net/admin/plugins/download_manager/download.php?ID=2">Live Search med Prototype JS og PHP</a> (Æ,Ø,Å understøttet) (.zip)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/live-search-med-prototype-js-og-php.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>En lille opdatering</title>
		<link>http://www.simon-jensen.net/en-lille-opdatering.html</link>
		<comments>http://www.simon-jensen.net/en-lille-opdatering.html#comments</comments>
		<pubDate>Tue, 30 Oct 2007 18:13:54 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Udvikling]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[brows]]></category>
		<category><![CDATA[news]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/en-lille-opdatering.html</guid>
		<description><![CDATA[Jeg har i længere tid gået og tænkt lidt over, om jeg ikke kunne få lidt mere indhold ind på min blog&#8230; Jeg kommer forbi mange blogs som f.eks. har et plugin der viser personens sidst afspilede musik numre, eller posters af de spil personen spiller pt., projekter som en udvikler arbejder på osv. &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har i længere tid gået og tænkt lidt over, om jeg ikke kunne få lidt mere indhold ind på min blog&#8230;</p>
<p>Jeg kommer forbi mange blogs som f.eks. har et plugin der viser personens sidst afspilede musik numre, eller posters af de spil personen spiller pt., projekter som en udvikler arbejder på osv. &#8211; Lidt ligesom jeg har min <a title="Gå til min Flickr profil." href="http://flickr.com/photos/simon_jensen/" target="_blank">Flickr Feed</a>, altså små widgets som kan være med til at der sker lidt mere på siden.</p>
<p>Og så har jeg længe ikke rigtig vidst hvorfor jeg har den &#8220;nyheds post&#8221; som du pt. finder nederst på siden. For læææænge side, da jeg besluttede mig for at lave dette site, brugte jeg den lidt som en todo/updater, altså et sted hvor jeg kunne skrive et par linier om de sidste nye tiltag jeg havde lavet på sitet &#8211; dette bliver den vel til dels også brugt til stadigvæk, men nu tror jeg nok, at den skal til at have et lidt andet formål.</p>
<p><span id="more-88"></span></p>
<p>Jeg har oplevet flere gange, at falde over en artikkel på nettet, som jeg i gennemlæsningens rus, synes at have en masse at skrive om. Jeg er efter et sådanne trip gået til min administration og oprettet en klade-post, men er sjældent blevet færdig med at skrive posten. En tid senere, kan jeg så komme tilbage til administrationen og finde adskillige påbegyndte klader, som jeg nu ikke har den fjerneste anelse om, hvor jeg ville hen med?!</p>
<p>Dette skal være &#8220;<em>In other news&#8230;</em>&#8220;s nye job &#8211; en slags shout-out felt, hvor jeg kan skrive alverden hjernegas, så det ikke bare går tabt. På denne måde kan jeg vedligeholde de egentlige blogpost til lidt længere poster, stadig med mulighed for at kommenterer, og samtidig få de mindre betydningsfulde ting med. I den anledning har jeg oprettet en mulighed for at browse frem og tilbage mellem de skrevne &#8220;nyheder&#8221;, og håber på den måde at kunne få presset lidt mere ind her.</p>
<p>Og ja, så er jeg vel ved at have taget bare en lille smule skade af alt den projektskrivning, diagram designen, og ellers generelt at skulle dokumenterer hvad jeg laver &#8211; så her er et diagram, der skulle fortælle hvordan jeg har opbygget funktionaliteten <img src='http://www.simon-jensen.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  &#8211; Jeg har forresten brugt <a title="Læs mere om Dia." href="http://live.gnome.org/Dia/Screenshots" target="_blank">OpenSource programmet Dia</a>, som er et let og anvendeligt alternativ til M$ Visio, hvis nogen skulle være interesseret.</p>
<p><a title="Sekvensdiagram for browsing af &quot;nyheder&quot; på www.simon-jensen.net" rel="lightbox" href="http://www.simon-jensen.net/admin/uploads/image/BrowsNews-diagram.png"><img title="Sekvensdiagram for browsing af &quot;nyheder&quot; på www.simon-jensen.net" src="http://www.simon-jensen.net/admin/uploads/image/BrowsNews-diagram.png" border="1" alt="Sekvensdiagram for browsing af &quot;nyheder&quot; på www.simon-jensen.net" width="90%" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/en-lille-opdatering.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simon-Jensen.net re-reloaded</title>
		<link>http://www.simon-jensen.net/simon-jensen-net-re-reloaded.html</link>
		<comments>http://www.simon-jensen.net/simon-jensen-net-re-reloaded.html#comments</comments>
		<pubDate>Tue, 31 Jul 2007 14:23:14 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Alt Andet]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/Simon-Jensen.net-re-reloaded.html</guid>
		<description><![CDATA[Jeps, så skete det igen &#8230; jeg kunne ikke holde ud at se på mit gamle design mere. Lidt om det nye design Der er faktisk ikke så meget at sige til det &#8211; jeg har ikke selv designet denne gang, hvilket vidst kun er for det bedre. Jeg er endnu engang blevet bekrætet i, [...]]]></description>
			<content:encoded><![CDATA[<p>Jeps, så skete det igen &#8230; jeg kunne ikke holde ud at se på <a title="Se hvordan siden så ud før..." href="http://www.flickr.com/photo_zoom.gne?id=959712516&amp;size=l" target="_blank">mit gamle design</a> mere.</p>
<h3>Lidt om det nye design</h3>
<p>Der er faktisk ikke så meget at sige til det &#8211; jeg har <em>ikke</em> selv designet denne gang, hvilket vidst kun er for det bedre. Jeg er endnu engang blevet bekrætet i, ikke at være designer.</p>
<p>URLerne, og selve navigationen, er den samme som før &#8211; læs evt. <a title="Om navigationen på Simon-Jensen.net" href="http://www.simon-jensen.net/Simon-Jensen.net-reloaded.html">her</a>. Til gengæld har jeg fået en del øvelse i at kode administrationen (CMS om man vil). Som jeg kort forklarede <a title="Læs posten: &quot;Simon-Jensen.net Reloaded&quot;." href="http://www.simon-jensen.net/Simon-Jensen.net-reloaded.html">sidste gang jeg lavede om</a>, var jeg ude i noget vældig smart &#8220;on site&#8221; AJAX redigering &#8211; men det holdt ikke, så nu har jeg lavet en blog administration fra bunden &#8211; og den er jeg faktisk riiiimelig tilfreds med.</p>
<p>Alt dette kan I, i-og-for-sig være ligeglade med &#8211; men jeg har også tænkt på jer <img src='http://www.simon-jensen.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><span id="more-76"></span></p>
<h3>Reader Appreciation</h3>
<p>Af en eller anden grund tog en kommentar-diskusion om &#8220;<a href="http://www.simon-jensen.net/AJAX-og-ae-oe-aa.html#comments">AJAX og Æ,Ø,Å</a>&#8221; pludselig en drejning overmod optimering af et websites størrelse. Ikke noget der kom bag på mig, da jeg havde fået det at vide før, men nu har jeg også fået gjort noget ved det. Sitet er nu GZip komprimeret &#8211; Tak til <a title="Tak for tippet om GZip :D" href="http://www.simon-jensen.net/AJAX-og-ae-oe-aa.html#comment_1702">Joseph</a>, for links og opfordring (PS. vi bruger PHP 5 nu <img src='http://www.simon-jensen.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).</p>
<p><a title="Download Safari Webbrowser." href="http://www.apple.com/safari/" target="_blank">Safari</a> Webbrowser er pt. i beta til Windows &#8211; og med et stigende antal brugere med Macintosh, har jeg taget mig mere sammen mht. browser kompatibilitet. Jeg har således verficeret at sitet ser udemærket ud (og fungerer) i både IE, Firefox, Opera og Safari &#8211; også med kommentarer! Var faktisk ikke klar over det, men det var ikke muligt at kommenterer i browsere som ikke understøttede <a title="Læs mere om FCKeditor - en WYSIWYG editor til Internettet." href="http://www.simon-jensen.net/fckeditor.html">FCKeditoren</a> (f.eks. Safari og Opera).</p>
<h3>Mere til kommentarer</h3>
<p>Da jeg den sidste tid har fået en del henvendinger omkring scripting (programmering generelt), har jeg tilføjet muligheden for at bruge lidt typografi. Jeg har oprettet mulighed for at markerer en tekst som enten citat eller kode, foruden de normale <strong>fed</strong>, <em>kursiv</em>, og <span style="text-decoration: underline;">understreget</span>.</p>
<p><a title="Nye features til kommentering." rel="lightbox" href="http://www.simon-jensen.net/admin/uploads/image/new_comment_features.jpg"><img title="Nye features til kommentering." src="http://www.simon-jensen.net/admin/uploads/image/new_comment_features.jpg" border="0" alt="Nye features til kommentering." width="351" height="115" /></a></p>
<p>Håber I kan bruge det til noget &#8211; Jeg er i hvert fald allerede blevet glad for det <img src='http://www.simon-jensen.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/simon-jensen-net-re-reloaded.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>AJAX og Æ,Ø,Å.</title>
		<link>http://www.simon-jensen.net/ajax-og-ae-oe-aa.html</link>
		<comments>http://www.simon-jensen.net/ajax-og-ae-oe-aa.html#comments</comments>
		<pubDate>Sat, 05 May 2007 00:07:34 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Udvikling]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/ajax-og-ae-oe-aa.html</guid>
		<description><![CDATA[I den tid jeg har arbejdet hos Reklamebureauet ReFocus A/S, har min interesse for AJAX for alvor taget til. Med en god blanding af prototype og Script.aculo.us og andre visuelle scripts, har vi mulighed for at lave hjemmesider, der ligner og fungerer mere og mere som &#8220;almindelige&#8221; dekstop applikationer &#8211; Men der er et catch [...]]]></description>
			<content:encoded><![CDATA[<p>I den tid jeg har arbejdet hos Reklamebureauet ReFocus A/S, har min interesse for <a title="Læs tidligere post om AJAX." href="http://www.simon-jensen.net/ajax.html">AJAX</a> for alvor taget til. Med en god blanding af <a title="Gå til prototype.conio.net." href="http://prototype.conio.net/" target="_blank">prototype</a> og <a title="Gå til http://script.aculo.us/." href="http://script.aculo.us/" target="_blank">Script.aculo.us</a> og andre visuelle scripts, har vi mulighed for at lave hjemmesider, der ligner og fungerer mere og mere som &#8220;almindelige&#8221; dekstop applikationer &#8211; Men der er et <em>catch</em> eller flere!</p>
<p>Et af de første problemer jeg hørte om, var problemet med browsers <em>back-buttons</em>, hvilket der heldigvis findes <a title="Læs hvordan du fixer back-buttons med AJAX." href="http://www.contentwithstyle.co.uk/Articles/38/fixing-the-back-button-and-enabling-bookmarking-for-ajax-apps" target="_blank">en løsning</a> på &#8211; og lad os ikke glemme, at dette faktisk kun finder sted, når vi bruger AJAX til navigation, eller fjerner/opdaterer et element, så det gamle indhold forsvinder.</p>
<p><a title="Gå til Alex Bosworths Blog." href="http://swik.net/User:alex/Alex Bosworths Weblog" target="_blank">Alex Bosworth</a> har skrevet et par artikler om <a title="En artikel om problemer med AJAX." href="http://sourcelabs.com/ajb/archives/2005/05/ajax_mistakes.html" target="_blank">diverse</a> <a title="En anden artikel om problemer med AJAX." href="http://alexbosworth.backpackit.com/pub/67688" target="_blank">problemer</a>, som folk enten overser eller ikke kender til &#8211; Meget interessant og relevant læsning, for folk der vil igang, eller er igang med AJAX.</p>
<p><strong>AJAX og Æ,Ø,Å</strong></p>
<p>I de to nævnte artikler ovenfor, kan du læse meget mere om diverse små problemer. Jeg har i mellemtiden fundet mit eget problem &#8211; og det er der nu mange der har, hvis man googler det lidt. Problemet er <strong>Æ, Ø, Å</strong> og muligvis også andre specielteng i forbindelse med request i AJAX.</p>
<p>I resten af denne post vil jeg tage udgangspunkt i at lave et <em>request</em> med <a title="Gå til prototypejs.org" href="http://www.prototypejs.org/" target="_blank">prototypes AJAX objekt</a>.</p>
<p><span id="more-39"></span></p>
<p>Men prototype, kan vi lave et AJAX-request på følgende måde:</p>
<div class="Code">var url = some-file.php;</p>
<p>var pars = action=MyActionQuery;</p>
<p>new Ajax.Request(url,{method:post, postBody:pars});</p></div>
<p>Vi kan også definerer en eventhandler funktion til at hånterer requestet. Dette gøres med Prototype, ved at definerer funktionen, og tilføje denne til onSucess-propertien, således:</p>
<div class="Code">var <strong>mySuccess</strong> = funktion(request) {</p>
<p>//gør noget med responset fra requestet</p>
<p>alert(request.responseText);</p>
<p>}</p>
<p>new Ajax.Request(url, {method:post, postBody:pars, <strong>onSuccess: mySucess</strong>});</div>
<p>Problemet er nu, at hvis det respons vi modtager, indeholder Æ, Ø eller Å, vil disse tegn komme til at se rimelig underlige ud, hvis du bruger det dansk tegnsæt ISO-8859-1. <span style="text-decoration: underline;">Grunden til dette er, at request-metoden (som sendes som XML) som standard benytter UTF-8</span>!</p>
<p>Løsningen kan findes ganske simpelt ved at sætte det korrekte charset i den action fil du benytter (<span style="font-family: Courier New;">some-file.php</span> i ovenstående).</p>
<p>Jeg har kun prøvet dette af i PHP, men her kan det lade sig gøre, hvis du i starten af filen indsætter følgende:</p>
<div class="Code">header(Content-Type: text/html; charset=ISO-8859-1);</div>
<p>Herefter kan du bruge Æ, Ø og Å lige så tosset du vil, og de vil blive vist om forventet gennem dit AJAX request.</p>
<p>Skal du bare sende en enkelt streng, kan du nøjes med at benytte PHPs UTF8 dekoder: <span style="font-family: Courier New;">string : utf8_decode(string)</span>. Du kan læse mere om <a title="Læs mere om korrekt brug af tegnsæt." href="http://www.ae35-unit.dk/standard/encoding.html" target="_blank">korrekt brug af tegnsæt her</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/ajax-og-ae-oe-aa.html/feed</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Ajax.Updater og IE Cache</title>
		<link>http://www.simon-jensen.net/ajax-updater-og-ie-cache.html</link>
		<comments>http://www.simon-jensen.net/ajax-updater-og-ie-cache.html#comments</comments>
		<pubDate>Fri, 20 Apr 2007 15:52:05 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Udvikling]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[ie]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/Ajax.Updater-og-IE-Cache.html</guid>
		<description><![CDATA[Her sidder jeg så, helt alene en fredag eftermiddag på arbejdspladsen og døjer med AJAX &#8230; hold da kæft en nørd jeg er blevet : &#8212; Nå, men jeg har faktisk fundet ud af noget idag, og det vil jeg lige dele med jer. Problemet ligger i Prototypes Ajax.Updater funktion, mere specifikt er det AJAX.Updater [...]]]></description>
			<content:encoded><![CDATA[<p>Her sidder jeg så, helt alene en fredag eftermiddag på arbejdspladsen og døjer med <a title="Læs mere om AJAX her." href="http://www.simon-jensen.net/category/ajax/">AJAX</a> &#8230; hold da kæft en nørd jeg er blevet : &#8212; Nå, men jeg har faktisk fundet ud af noget idag, og det vil jeg lige dele med jer.</p>
<p>Problemet ligger i <a title="Gå til http://www.prototypejs.org/ og download deres AJAX framework" href="http://www.prototypejs.org/" target="_blank">Prototypes</a> Ajax.Updater funktion, mere specifikt er det AJAX.Updater og Internet Explorers cache. Løsningen skulle vise sig at være noget så simpel.</p>
<h3>Ajax.Updater</h3>
<p><a title="Læs mere om Ajax.Updater hos Protorype." href="http://www.prototypejs.org/api/ajax/updater" target="_blank">Ajax.Updater</a> er en funktion i Prototypes framework, som hurtigt og nemt lader dig updaterer et valgt <span style="font-family: 'Courier New';">div</span>-tag med en valgt fil, metodekaldet se ud som følgende:</p>
<pre>new Ajax.Updater(myDivTag, /some_url,
{ method: get }
);</pre>
<p>Funktionen er en forenkling af deres <span style="font-family: 'Courier New';">Ajax.Request</span> funktion, i hvilket du ofte vil definerer ekstra funktion til at hånderer responset. <span style="font-family: 'Courier New';">Ajax.Updater</span> gør det hele for dig, opretter et requets til filen (anden parameter) og placerer responset i dit <span style="font-family: 'Courier New';">div</span>-tag (første parameter) &#8211; Det var i hvert fald meningen.</p>
<p><span id="more-67"></span></p>
<h3>Internet Explorer super cache?!</h3>
<p>Af en eller anden grund, som jeg ikke har undersøgt nærmere, lader IE 7.0 til at have en super cache. Jeg brugte Updater-funktionen til at hente en fil, som genererede en drop-down box ud fra et database kald. Når jeg opdaterede databasen (tilføjede til drop-down boxen) kunn IE ikke opfatte at der var foretaget ændringer? I hvertfald ikke når jeg bare kaldte filen uden parametre.</p>
<h3>Ajax.Updater cache løsning</h3>
<p>Løsningen er utrolig simpel. Du skal ganske simpelt tilføje en (ekstra) mere eller mindre tilfældig (i hvertfald ligegyldig) parameter til dit kald &#8211; vær dog sikker på at denne ikke skal bruges i dit kald.</p>
<p>Jeg havde en funktion der så ud som følgende:</p>
<pre>function reloadFile(fileName, divID, pars) {
    new Ajax.Updater(divID, fileName,{
        method: get, parameters: pars</pre>
<pre>    });
}</pre>
<p>Denne funktion kom til at se ud som følgende, og alt var nu godt i IE:</p>
<pre>function reloadFile(fileName, divID, pars) {
<strong>    pars = pars+&amp;cacheFix=+Math.random();</strong>
    new Ajax.Updater(divID, fileName, {
        method: get, parameters: pars
    });
}</pre>
<p>Ved at bruge <span style="font-family: 'Courier New';">Math.random()</span> er du mere eller mindre sikker på at dit fil-kald er forskelligt fra gang til gang &#8211; hvilket åbenbart er hvad der skal til, før IE fatter AJAX?! Meget simpelt, men en fantastik lettelse for mig, da jeg fandt ud af det =;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/ajax-updater-og-ie-cache.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Simon-Jensen.net reloaded</title>
		<link>http://www.simon-jensen.net/simon-jensen-net-reloaded.html</link>
		<comments>http://www.simon-jensen.net/simon-jensen-net-reloaded.html#comments</comments>
		<pubDate>Fri, 30 Mar 2007 08:50:56 +0000</pubDate>
		<dc:creator>Simon Jensen</dc:creator>
				<category><![CDATA[Alt Andet]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[web programmering]]></category>

		<guid isPermaLink="false">http://www.simon-jensen.net/Simon-Jensen.net-reloaded.html</guid>
		<description><![CDATA[Weeee&#8230; så fik jeg endelig det nye design i luften! Men det er nu også langt fra kun designet der er skiftet, faktisk har jeg skrevet hele &#8220;maskineriet&#8221; bag sittet om. Du har måske lagt mærke til at der har være lidt stille her den seneste tid, hvilket langt hen af vejen grunder i arbejde [...]]]></description>
			<content:encoded><![CDATA[<p>Weeee&#8230; så fik jeg endelig det nye design i luften! Men det er nu også langt fra kun designet der er skiftet, faktisk har jeg skrevet hele &#8220;maskineriet&#8221; bag sittet om.</p>
<p>Du har måske lagt mærke til at der har være lidt stille her den seneste tid, hvilket langt hen af vejen grunder i arbejde med at få de mange idéer implementeret. Til sidst var jeg knap nok inde og se på mit gamle site, da jeg allerede så på det med gamle øjne. Det resulterede i et væld af spam (Tjaa, fik aldrig rigtigt mit spam-filter til at virke ordentligt), og jeg endte med at fjerne muligheden for at kommentere.</p>
<p>Nu er der nye tider på vej &#8211; jeg har lavet en hel del ændringer, og her kommer så en kort introduktion til det nye site.</p>
<p><span id="more-63"></span></p>
<h3>Design</h3>
<p>Design er selvfølgelig noget af det mest bemærkelsesværdige. <span style="text-decoration: line-through;">Jeg har beholdt de grønne grundfarver, mest af alt fordi jeg er vild med grøn, men jeg synes heller ikke man ser så mange grønne sites omkring på nettet, hvilket man skulle mene ville være med til at gøre mit site lidt mere specielt =;)</span>. Jeg startede med at beholde de grønne farver, er stadig glad for grønt, men på et tidspunkt blev det dog for meget, hvilket jeg nu har prøvet at gøre noget ved. Designet er <em>table-less</em> og benytter sig i særdeleshed af CSS, hvilket gør det meget nemt at skifte ud =;).</p>
<p>Alt skal jo være <em>transparent and lass-like</em> idag, og jeg falder lige i den fælde. Til at starte med, brugete jeg faktisk et filter i CSS som gjorde det meste af sitet gennemsigtigt, men det tog samtigt en helvedes masse CPU-kraft, så jeg lavede det om til statiske billeder &#8211; men det blev da heller ikke så ringe endda?!</p>
<h3>Layout</h3>
<p>Jeg har længe ville af med det klassiske blog-layout, med en banner, sidebar, og en liste poster. Og lige så længe har ikke været i tvivl om at jeg ville over til et 3-spaltet layout &#8211; og indholdet passer jo meget godt. Navigation og feed til venstre i en farve der er til at se, nyeste blog-post i midten, og andre nyheder, links og meta til højre i en mindre prangende farve.<br />
Derudover har jeg fået min <a title="Se mine billeder på Flickr.com." href="http://flickr.com/photos/simon_jensen/" target="_blank">Flickr-feed</a> op i toppen af sitet, denne var næsten gemt helt væk i <a title="Se det gamle design hos Flickr." href="http://flickr.com/photos/simon_jensen/436824924/" target="_blank">sidste design</a>.</p>
<h3>Navigation</h3>
<p>Jeg har igen været ved at se på <a title="Læs mere om ReWrite-rules og mod_rewrite." href="http://www.simon-jensen.net/mod-rewrite.html">rewrite-links</a>, hvilket problematikken bl.a. gik på i <a title="Læs mere om 301-redirects." href="http://www.simon-jensen.net/Flyt-dit-site-med-omtanke.html">sidste post</a>, og er kommet frem til følgende regler:</p>
<ul>
<li><strong>Side</strong>: www.simon-jensen.net/side-navn-her/</li>
<li><strong>Kategori</strong>: www.simon-jensen.net/category/categori-navn-her/</li>
<li><strong>Tags</strong>: www.simon-jensen.net/tags/tag-navn-her/</li>
<li><strong>Poster</strong>: www.simon-jensen.net/post-title-her.html</li>
</ul>
<p>Reglerne ligger tæt op af de gamle, og med 301-redirects på plads, skulle evt. links og bookmarks fra det gamle design blive guided til deres rigtige destination på det nye &#8211; tak til <a title="Gå til http://www.fuursted.net/" href="http://www.fuursted.net/" target="_blank">Marcel</a>.</p>
<h3>Funktionalitet</h3>
<p>Jeg har selvfølgelig ikke kunne lade være med at lege bare en lille smule med <a title="Læs mere om AJAX." href="http://www.simon-jensen.net/category/ajax/">AJAX</a>, hvilket I f.eks. vil se, når I poster en kommentar, men langt størstedelen er det kun mig der får at se, da denne hører til administrationen. Hvorfor det? For jeres skyld &#8211; selvom jeg benytter <a title="Læs mere om Prototype JS Framework." href="http://www.prototypejs.org/" target="_blank">Prototype frameworket</a>, vil jeg være sikker på at alle kan læse hvad jeg skriver.</p>
<p>Derudover kan jeg nævne at jeg denne gang, har anvendt en objekt orienteret indgangsvikel til database håndtering, hvilket jeg tror jeg vil gøre fremover &#8211; fantastiskt nemt, og 1000 tak til skal lyde til <a title="Gå til download og info omkring DB klassen." href="http://slaout.linux62.org/php/index.html" target="_top">Sébastien Laoût</a> for at lave klassen.</p>
<p>Den største nyhed, i mit hovede, er det nye spamfilter. Denne gang er jeg gået hele vejen, og implementeret <a title="Læs mere om Akismet Antispam." href="http://miphp.net/pages/akismet_docs" target="_blank">Akismet Antispam</a>, som også bliver brugt i WordPress. Glæder mig vildt meget til at se om det virker som forventet!</p>
<p>Endelgt er <a title="Læs mere om FCK editoren." href="http://www.simon-jensen.net/fckeditor.html">FCK editoren</a> (den jeg skriver poster, og I kommenterer med) også blevet opdateret &#8211; og den er kun blevet bedere, Shift-Enter virker nu som en drøm!</p>
<h3>Andet</h3>
<p>Der er stadig en del til min backend, der ikke er på plads, hvilket I i-og-for-sig kan være ligeglade med. Muligheden for at skrive/rette og slette både poster og kommentarer er på plads, så vi skulle kunne kommunikerer, hvilket er det vigtigste &#8230; jeg kunne bare ikke vente længere.</p>
<p>Min reference-side er også lavet helt om &#8211; Eller er i hvert fald igang med det. Den var efterhånden temmelig <em>outdated</em>. I stedet for at skrive om de projekter jeg har være en del af, vil denne side i fremtiden komme til at fungerer som en reel reference-side til de folk jeg har arbejdet sammen med, og hvilke kvalifikationer de har givet til mine projekter.</p>
<p>Når tiden kommer til mig, skal jeg også have implementeret en søgefunktion, og måske et arkiv med alle bloggens poster &#8211; I mellemtiden må I nøjes med kategorierne og tagclouden herunder. Indtil da &#8211; velkommen til det nye simon-jensen.net!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-jensen.net/simon-jensen-net-reloaded.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

