<?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>AJAX | Nerdpress.org</title>
	<atom:link href="https://nerdpress.org/category/js/ajax-js/feed/" rel="self" type="application/rss+xml" />
	<link>https://nerdpress.org</link>
	<description>...dev, tech problems and solutions.</description>
	<lastBuildDate>Mon, 04 Apr 2011 12:49:38 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Ajax Deeplinks mit jQuery Address</title>
		<link>https://nerdpress.org/2011/04/04/ajax-deeplinks-mit-jquery-address/</link>
		
		<dc:creator><![CDATA[Ivo Bathke]]></dc:creator>
		<pubDate>Mon, 04 Apr 2011 12:49:38 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Ajax]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=1443</guid>

					<description><![CDATA[<p>Aus der Reihe: feine jQuery Plugins, um nicht zu sagen essentielle jQuery Plugins, heute: jQuery Address Damit kann man sehr einfach Deeplinks in Ajax getriebenen Seiten realisieren. So lassen sich zum Beispiel verschiedene Zustände in einer Ajax Seite navigierbar machen, wie zum Beispiel einzelne Tabs via Link öffnen oder auch Akkordion Zustände. Oder man kann &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2011/04/04/ajax-deeplinks-mit-jquery-address/" class="more-link">Continue reading<span class="screen-reader-text"> "Ajax Deeplinks mit jQuery Address"</span></a></p>
The post <a href="https://nerdpress.org/2011/04/04/ajax-deeplinks-mit-jquery-address/">Ajax Deeplinks mit jQuery Address</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Aus der Reihe: feine jQuery Plugins, um nicht zu sagen essentielle jQuery Plugins, heute:<br />
<a href="https://github.com/asual/jquery-address">jQuery Address</a></p>
<p>Damit kann man sehr einfach Deeplinks in Ajax getriebenen Seiten realisieren.</p>
<p>So lassen sich zum Beispiel verschiedene Zustände in einer Ajax Seite navigierbar machen, wie zum Beispiel einzelne Tabs via Link öffnen oder auch Akkordion Zustände.<br />
Oder man kann Ajax Bereiche SEO technisch erfassbar machen.</p>
<p><span id="more-1443"></span></p>
<p>Das Plugin nutzt auch die HTML5 History API, damit werden Ajax Zustände in die Browser History geschrieben, womit sich der Zurück Button dann auch damit nutzen läßt ohne die Seite neu laden zu müssen.<br />
Auch kann man einfach die Url im Address Bar ändern.</p>
<p>Am besten schaut man sich mal die Beispiele auf der <a href="http://www.asual.com/jquery/address/samples/">Demo Seite</a> an.</p>
<p>Tolle Sache.  </p>The post <a href="https://nerdpress.org/2011/04/04/ajax-deeplinks-mit-jquery-address/">Ajax Deeplinks mit jQuery Address</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Debuggin JSON mit JSON Views</title>
		<link>https://nerdpress.org/2010/11/17/debuggin-json-mit-json-views/</link>
		
		<dc:creator><![CDATA[Ivo Bathke]]></dc:creator>
		<pubDate>Wed, 17 Nov 2010 15:37:32 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[JSON]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=1214</guid>

					<description><![CDATA[<p>Wer kennt das nicht: man entwickelt mit JSON, will die AJAX Rückgabe kontrollieren und macht, wie gewohnt, im Firefox den Firebug auf und checkt unter Console den AJAX Request und sieht folgendes: Nicht sehr erhellend! Total unübersichtlich! Nicht gut! Wird JSON mit dem richtigen Header ausgeliefert, unter PHP geht der so: Dann kann man ein &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/11/17/debuggin-json-mit-json-views/" class="more-link">Continue reading<span class="screen-reader-text"> "Debuggin JSON mit JSON Views"</span></a></p>
The post <a href="https://nerdpress.org/2010/11/17/debuggin-json-mit-json-views/">Debuggin JSON mit JSON Views</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Wer kennt das nicht: man entwickelt mit JSON, will die AJAX Rückgabe kontrollieren und macht, wie gewohnt, im Firefox den Firebug auf und checkt unter Console den AJAX Request und sieht folgendes:<br />
<a href="https://nerdpress.org/wp-content/uploads/2010/11/json_firebug_raw.png"><img decoding="async" src="https://nerdpress.org/wp-content/uploads/2010/11/json_firebug_raw-300x70.png" alt="" title="JSON Firebug Raw View" width="300" height="70" class="alignnone size-medium wp-image-1215" /></a><br />
Nicht sehr erhellend! Total unübersichtlich! Nicht gut!</p>
<p>Wird JSON mit dem richtigen Header ausgeliefert, unter PHP geht der so:</p>
<pre class="brush: php; title: ; notranslate">
header('Content-type: application/json');
</pre>
<p><span id="more-1214"></span></p>
<p>Dann kann man ein feines Feature von Firebug nutzen:<br />
den JSON View, dieser versteckt sich unter der Response als JSON Tab.<br />
<a href="https://nerdpress.org/wp-content/uploads/2010/11/Json_view_firebug.png"><img decoding="async" src="https://nerdpress.org/wp-content/uploads/2010/11/Json_view_firebug-300x141.png" alt="" title="JSON View Firebug" width="300" height="141" class="alignnone size-medium wp-image-1216" /></a></p>
<p>Ja schon besser! Aber, ich wiederhole, nur mit dem richtigen Header, mit <em>text/html</em> o.ä. ist dieser Tab nicht zu sehen.</p>
<p>Nun gut, trotzdem ein bißchen eng da alles in der FireBug Hülle.<br />
Ich mach ja ganz gerne den Ajax Call in einem neuen Tab auf, um zu sehen ob alles drin ist.<br />
Dann empfiehlt sich ein Firefox AddOn: <a href="https://addons.mozilla.org/de/firefox/addon/10869/">JSONView</a></p>
<p>Dies rendered das JSON schön im Firefox, wenn , Ihr habts erraten, der Header stimmt: <strong>application/json</strong> !<br />
<a href="https://nerdpress.org/wp-content/uploads/2010/11/JSONViewer.png"><img fetchpriority="high" decoding="async" src="https://nerdpress.org/wp-content/uploads/2010/11/JSONViewer-300x183.png" alt="" title="JSONView Firefox AddOn" width="300" height="183" class="alignnone size-medium wp-image-1217" /></a><br />
So ist gut!</p>The post <a href="https://nerdpress.org/2010/11/17/debuggin-json-mit-json-views/">Debuggin JSON mit JSON Views</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Selenium functional tests mit PHPUnit</title>
		<link>https://nerdpress.org/2010/11/14/selenium-functional-tests-mit-phpunit/</link>
					<comments>https://nerdpress.org/2010/11/14/selenium-functional-tests-mit-phpunit/#comments</comments>
		
		<dc:creator><![CDATA[Max Girkens]]></dc:creator>
		<pubDate>Sun, 14 Nov 2010 15:03:14 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[PHP 5.3]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[sfPhpunitPlugin]]></category>
		<category><![CDATA[test driven developement]]></category>
		<category><![CDATA[testing]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=1193</guid>

					<description><![CDATA[<p>PHPUnit hat coolerweise eine Extension für Selenium Tests. Dafür braucht man noch den PHP Client für die Selenium Remote Control. pear install Testing_Selenium-0.4.3 Bei mir auf Debian Lenny, bzw. Mac OSX musste ich noch den include_path dafür anpassen, damit phpunit Testing/Selenium.php gefunden hat. Damit kann man mit PHP komfortabel einen Selenium Test Server über die &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/11/14/selenium-functional-tests-mit-phpunit/" class="more-link">Continue reading<span class="screen-reader-text"> "Selenium functional tests mit PHPUnit"</span></a></p>
The post <a href="https://nerdpress.org/2010/11/14/selenium-functional-tests-mit-phpunit/">Selenium functional tests mit PHPUnit</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.phpunit.de/">PHPUnit</a> hat coolerweise eine <a href="https://github.com/sebastianbergmann/phpunit-selenium">Extension</a> für <a href="http://seleniumhq.org/">Selenium</a> Tests.</p>
<p>Dafür braucht man noch den PHP Client für die Selenium Remote Control.</p>
<pre class="brush: bash; title: ; notranslate">
pear install Testing_Selenium-0.4.3
</pre>
<p>Bei mir auf Debian Lenny, bzw. Mac OSX musste ich noch den include_path dafür anpassen,<br />
damit phpunit Testing/Selenium.php gefunden hat.</p>
<p>Damit kann man mit PHP komfortabel einen Selenium Test Server über die <a href="http://seleniumhq.org/docs/05_selenium_rc.html">Selenium RC</a> ansprechen,<br />
der dann beliebige Browser für functional Tests benutzt.</p>
<p>Der Selenium Server ist auch im Prinzip <a href="http://seleniumhq.org/docs/05_selenium_rc.html#installation">schnell</a> installiert<br />
und lokal ist das ganze einigermaßen unproblematisch, weil man ja schon mal die Browser seines OS zur Verfügung hat.</p>
<p>In einem Continuous Integration Setup möchte man aber vielleicht Selenium lieber auf einem Web Server laufen lassen.</p>
<p>Da sieht es dann erstmal weniger gut aus mit Browser executables.<br />
Was also tun?</p>
<p><span id="more-1193"></span></p>
<p>Eine Möglichkeit ist <a href="http://saucelabs.com/">saucelabs.com</a>.<br />
Die bieten &#8220;Cross browser testing with Selenium in the cloud&#8221; an.<br />
Sogar gratis für Firefox unter Linux.<br />
Für die anderen Browser und OS muss man dann schon auf einen bezahlten Account umsteigen.</p>
<p>Dann einfach den saucelabs Selenium Server mit oben erwähnter Extension aus PHPUnit ansprechen:</p>
<p><em>Das Example.php Script von saucelabs</em></p>
<pre class="brush: php; title: ; notranslate">
require_once 'Testing/Selenium.php';
require_once 'PHPUnit/Framework/TestCase.php';

class Example extends PHPUnit_Framework_TestCase
{
    private $selenium;

    public function setUp()
    {
        $this-&gt;selenium = new Testing_Selenium(
            json_encode(array(
                &quot;username&quot; =&gt; &quot;YOUR_USERNAME&quot;,
                &quot;access-key&quot; =&gt; &quot;YOUR_ACCESS_KEY&quot;,
                &quot;os&quot; =&gt; &quot;Windows 2003&quot;, 
                &quot;browser&quot; =&gt; &quot;firefox&quot;,
                &quot;browser-version&quot; =&gt; &quot;3.6.&quot;,
                &quot;name&quot; =&gt; $this-&gt;getName()
            )),
            &quot;http://saucelabs.com&quot;, 
            &quot;ondemand.saucelabs.com&quot;,
            80,
            90000);
        $this-&gt;selenium-&gt;start();
    }

    public function tearDown()
    {
        $this-&gt;selenium-&gt;stop();
    }

    public function testSauce()
    {
        $this-&gt;selenium-&gt;open(&quot;/&quot;);
        $this-&gt;assertEquals(&quot;Cross browser testing with Selenium - Sauce Labs&quot;,
                            $this-&gt;selenium-&gt;getTitle());
    }

}
</pre>
<p>und PHPUnit macht Selenium Tests:</p>
<pre class="brush: bash; title: ; notranslate">
phpunit Example.php
</pre>
<p>:)</p>The post <a href="https://nerdpress.org/2010/11/14/selenium-functional-tests-mit-phpunit/">Selenium functional tests mit PHPUnit</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2010/11/14/selenium-functional-tests-mit-phpunit/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Ajax (Fake) Push: Long Polling mit HTML 5 WebWorker</title>
		<link>https://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/</link>
					<comments>https://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 11 Jun 2010 11:28:23 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[Html5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Long Poll]]></category>
		<category><![CDATA[Push]]></category>
		<category><![CDATA[Threads]]></category>
		<category><![CDATA[WebWorker]]></category>
		<category><![CDATA[Worker]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=1037</guid>

					<description><![CDATA[<p>Push-Mechanismen im Web sind mittlerweile weit verbreitet &#8211; die Anforderungen an die Infrastruktur aber recht hoch. Nichts geht ohne Plugins (Flash, Applet, WebSocket) &#8211; dann braucht man mindestens einen zweiten Server, der via persistenter Verbindung Nachrichten verteilt. Bedient man sich herkömmlicher JavaScript-Technik, muss man mit aynchronen Ajax-Requests herumkaspern, sich mit Timeouts, Memory-Leaks und Cross-Domain-Sicherheitspolicen herumschlagen. &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/" class="more-link">Continue reading<span class="screen-reader-text"> "Ajax (Fake) Push: Long Polling mit HTML 5 WebWorker"</span></a></p>
The post <a href="https://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/">Ajax (Fake) Push: Long Polling mit HTML 5 WebWorker</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Push-Mechanismen im Web sind mittlerweile weit verbreitet &#8211; die Anforderungen an die Infrastruktur aber recht hoch. Nichts geht ohne Plugins (Flash, Applet, WebSocket) &#8211; dann braucht man mindestens einen zweiten Server, der via persistenter Verbindung Nachrichten verteilt. </p>
<p><span id="more-1037"></span></p>
<p>Bedient man sich herkömmlicher JavaScript-Technik, muss man mit aynchronen Ajax-Requests herumkaspern, sich mit Timeouts, Memory-Leaks und Cross-Domain-Sicherheitspolicen herumschlagen. Und auch hier kommt man nicht herum, den Server zu tweaken oder gleich einen zweiten aufzusetzen, der ausschließlich auf Polls oder Long-Polls trainiert ist.</p>
<p>Gerade in der PHP-Welt ist es nicht einfach, einen üblichen LAMP-Stack soweit zu bringen, dass so etwas auch unter Last funktioniert &#8211; Java ist da wie immer weiter und bietet mit <a href="http://java.sun.com/products/jms/">JMS</a> ein einheitliches Interface &#8211; da gibt es Software für den gewöhnlichen Servletcontainer, im Anwendungsserver muss das laut Spezifikation sogar im Lieferumfang enthalten sein.</p>
<p>Möchte man trotzdem mit &#8220;Bordmitteln&#8221; mal schnell eine Chatbox aufsetzen, führt Longpolling + Ajax eigentlich schnell zu einem akzeptablen Ergebnis &#8211; nichts für Millionen konkurrierende Zugriffe, aber immerhin eine nette Spielerei für zwischendurch. Wäre da nicht ständiges Warten auf die Response, das sich nach einiger Zeit einerseits mit einer merklichen Ruckelorgie bemerkbar macht oder gar den Mauszeiger in eine ewiglich drehende Sanduhr verwandelt.</p>
<h4>HTML 5 to the rescue&#8230;</h4>
<p>HTML 5 kann sogenannte Dedicated Worker &#8211; &#8220;echte&#8221; Workerthreads auf Betriebssystemebene, die man mit einer Zeile spawnen kann.</p>
<pre class="brush: jscript; title: ; notranslate">
new Worker('meinScript.js')
</pre>
<p>Innerhalb eines Threads kann man lang laufende Rechenoperationen im Hintergrund verstecken &#8211; warum also nicht auch einen Ajax-Request? Allerdings haben diese Threads einen Nachteil: Aus Sicherheitsgründen laufen sie in einem klar abgegrenzten Scope, in dem sozusagen nichts vorhanden ist. Auch keine Referenz auf das document-Object der Elternseite. Das stoppt die meisten Javascript-Bibliotheken, wie bspw. JQuery. Man muss sich also mit Bordmitteln begnügen.</p>
<p>Eine Methode, die einen Worker initialisiert, könnte so aussehen:</p>
<pre class="brush: jscript; title: ; notranslate">
    _initializeLongPoll: function()
    {
      var messenger = this;

      var worker = new Worker('my-ajax-worker.js');
        worker.onmessage = function(event)
        {
          var json = jQuery.parseJSON(event.data);
            
          // NEUE CHAT-NACHRICHT ERZEUGEN
          messenger.$_list.append($('&lt;li class=&quot;messenger-list-item&quot;&gt;'
            + '&lt;strong class=&quot;messenger-list-item-author&quot;&gt;' + json.author + '&lt;/strong&gt;'
            + '&lt;span class=&quot;messenger-list-item-message&quot;&gt;' + json.text + '&lt;/span&gt;&lt;/li&gt;'));
        };
    }
</pre>
<p>&#8220;my-ajax-worker.js&#8221; ist ausschließlich für den Ajax-Request zuständig. Hier wird ein dynamisches Javascript in einem Symfony-Projekt generiert:</p>
<pre class="brush: jscript; title: ; notranslate">
    
    var onLoad = function()
    {
      var output = httpRequest.responseText;
      if (output) {
       
        // DELEGIERT DIE RESPONSE ZURÜCK.
        postMessage(output.trim());
        
        // ERZEUGE NEUEN XmlHttpRequest
        httpRequest = initRequest();
      }
    };

    // WIR SPAREN UND DEN X-BROWSER XmlHttpRequest-KRAM
    var httpRequest = initRequest();
</pre>
<p>Details zum serverseitigen Script möchte ich an dieser Stelle vernachlässigen, im Grunde funktioniert es folgendermaßen: Es arbeitet so lange, bis eine Änderung festzustellen ist. Erst bei Änderung wird die Response an den Client ausgeliefert (darum heißt es &#8220;Long-Polling&#8221;, weil ein Request ganz schön lange dauern kann):</p>
<pre class="brush: java; title: ; notranslate">
while(true)
{
  if(newData())
  {
    return getNewData()
  }
  sleep(5);
}
</pre>
<p>Der Kram funktioniert natürlich nur in HTML5-Browsern, die das Worker-Objekt unterstützen. Dazu zählen Firefox 3.6, Google Chrome und natürlich Safari. Ob Opera es beherrscht, weiß ich nicht, ob der IE 8 es beherrscht, bezweifle ich. Aber wie gesagt: Es ist nur eine Spielerei und keine produktiv geeignete Anwendung. Demnächst schau ich mir auch mal die WebSocket API an&#8230;</p>
<h4>Known Issues</h4>
<p>Vorsicht mit <a href="http://php.net/manual/de/function.session-start.php">session_start()</a> und konkurrierenden (asynchronen) HTTP-Zugriffen. Im User-Sessionscope wird der Apache immer auf das Schließen einer Session warten, bis er dem nächsten Request erlaubt, die Session wieder &#8220;aufzunehmen&#8221;. Und im Normalfall dauert eine User-Session genau so lange wie die Request-Lifetime. Das führt dazu, dass bei 4 gleichzeitig abgefeuerten XmlHttpRequests diese trotzdem als Stack nach dem FIFO-Prinzip abgehandelt werden. Man verliert somit den Vorteil der Asynchronität. Es ist also zwingend erforderlich, die Session bereits vor dem Long-Poll-Loop abzuschließen (durch den Aufruf von <a href="http://php.net/manual/en/function.session-write-close.php">session_write_close()</a>;</p>The post <a href="https://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/">Ajax (Fake) Push: Long Polling mit HTML 5 WebWorker</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>[Jquery]Namespaces via CSS-Selector adressieren</title>
		<link>https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/</link>
					<comments>https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 29 Apr 2010 21:38:59 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[Selektor]]></category>
		<category><![CDATA[xml]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=952</guid>

					<description><![CDATA[<p>Vielleicht braucht es mal jemand, jedenfalls lassen sich &#8220;genamespacete&#8221; Tags in einer DOM (XML)document Instanz recht einfach mittels \: als Separator adressieren. Ein Beispiel: Ich möchte ein Dublin-Core Metadatum aus einem beliebigen Feed lesen: (function($) { $('item').each(function() { $(arguments&#x5B;1]).find('dc\:creator').&#x5B;...]() } ); })(jQuery); Dies entspricht wohl rein syntaktisch nicht ganz dem entsprechendem CSS3-Proposal (einzusehen unter http://www.w3.org/TR/css3-selectors/#typenmsp). &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/" class="more-link">Continue reading<span class="screen-reader-text"> "[Jquery]Namespaces via CSS-Selector adressieren"</span></a></p>
The post <a href="https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/">[Jquery]Namespaces via CSS-Selector adressieren</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Vielleicht braucht es mal jemand, jedenfalls lassen sich &#8220;genamespacete&#8221; Tags in einer DOM (XML)document Instanz recht einfach mittels \: als Separator adressieren. Ein Beispiel: Ich möchte ein <a href="http://dublincore.org/">Dublin-Core</a> Metadatum aus einem beliebigen Feed lesen:</p>
<pre class="brush: jscript; title: ; notranslate">
(function($) {

  $('item').each(function() { $(arguments&#x5B;1]).find('dc\:creator').&#x5B;...]() } );

})(jQuery);
</pre>
<p>Dies entspricht wohl rein syntaktisch nicht ganz dem entsprechendem CSS3-Proposal (einzusehen unter <a href="http://www.w3.org/TR/css3-selectors/#typenmsp">http://www.w3.org/TR/css3-selectors/#typenmsp</a>). Ich habe beide Möglichkeiten interessehalber auch einmal in einem aktuellen FF3.6 und Chromium  getestet:</p>
<pre class="brush: css; title: ; notranslate">
&lt;style type=&quot;text/css&quot;&gt;
/*&lt;!&#x5B;CDATA&#x5B;*/
  @namespace hanswurst url(https://www.meins.int)

  hanswurst|kaese
  {
    color: red;
  }
/*]]&gt;*/
&lt;/style&gt;
&lt;hanswurst:kaese&gt;
  Hanswurst liebt käse
&lt;/hanswurst:kaese&gt;
</pre>
<p>Ergebnis: Naja, klappt nicht. Eventuell hat jemand eine Idee oder kann mich korrigieren?</p>The post <a href="https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/">[Jquery]Namespaces via CSS-Selector adressieren</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Next Level Javascript Error Tracking</title>
		<link>https://nerdpress.org/2010/04/10/next-level-javascript-error-tracking/</link>
					<comments>https://nerdpress.org/2010/04/10/next-level-javascript-error-tracking/#comments</comments>
		
		<dc:creator><![CDATA[Max Girkens]]></dc:creator>
		<pubDate>Sat, 10 Apr 2010 12:11:03 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Error]]></category>
		<category><![CDATA[Exceptionhub]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tracking]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=914</guid>

					<description><![CDATA[<p>Exceptionhub protokolliert clientseitig auftretende Javascript Fehler. * Logs all JavaScript errors (local or remote) * Provides a stack trace to find the cause in all browsers * Groups errors by cause * Development and Production modes * RSS feeds for errors Einfach einbinden via Javascript im Seitenheader. Dann kriegt man schöne Statistiken über Javascript Fehler &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/04/10/next-level-javascript-error-tracking/" class="more-link">Continue reading<span class="screen-reader-text"> "Next Level Javascript Error Tracking"</span></a></p>
The post <a href="https://nerdpress.org/2010/04/10/next-level-javascript-error-tracking/">Next Level Javascript Error Tracking</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.exceptionhub.com/">Exceptionhub</a> protokolliert clientseitig auftretende Javascript Fehler.</p>
<blockquote><p>
    *  Logs all JavaScript errors (local or remote)<br />
    * Provides a stack trace to find the cause in all browsers<br />
    * Groups errors by cause<br />
    * Development and Production modes<br />
    * RSS feeds for errors
</p></blockquote>
<p>Einfach einbinden via Javascript im Seitenheader. Dann kriegt man schöne Statistiken über Javascript Fehler mit Browser und OS Infos, Mail-Notifications usw.<br />
<span id="more-914"></span><br />
Ein bißchen wie Google Analytics.</p>
<p>Das ganze ist (noch) kostenlos während der betaPhase.</p>
<p>Auf die Idee clientseitige Fehler via Ajax auf dem Server zu loggen, wäre ich irgendwie garnicht gekommen. <a href="http://www.the-art-of-web.com/javascript/ajax-onerror/">Andere</a> <a href="http://www.codeproject.com/kb/Ajax/LogClientSideJSErrors2Srv.aspx">Leute schon</a>.<br />
Trotzdem wundert es mich in Nachhinein fast dass es da nichts verbreiteteres gibt.<br />
Das schreit ja eigentlich nach einem Symfony Plugin, oder?</p>
<p>:)</p>The post <a href="https://nerdpress.org/2010/04/10/next-level-javascript-error-tracking/">Next Level Javascript Error Tracking</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2010/04/10/next-level-javascript-error-tracking/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Symfony und das Dojo Build System</title>
		<link>https://nerdpress.org/2010/01/30/symfony-und-das-dojo-build-system/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sat, 30 Jan 2010 15:18:47 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Dojo Toolkit]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Dojo 1.4]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Javascript]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=787</guid>

					<description><![CDATA[<p>Das Dojo Toolkit bietet neben den offensichtlichen Features eines Full-Stack-Frameworks unter anderem mehrere &#8220;environment aware&#8221; Debug-Modi und eine Sammlung vonBuild-Scripten, die es dem Entwickler erlauben, das Framework zusammen mit den eigenen Frontend-Scripten und Stylesheets zu &#8220;kompilieren&#8221; und somit Bandbreite zu sparen bzw. Ladezeiten zu minimieren. Dojo Baukausten Standardmäßig lädt der Dojo-Core alle benötigten Pakete, die &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/01/30/symfony-und-das-dojo-build-system/" class="more-link">Continue reading<span class="screen-reader-text"> "Symfony und das Dojo Build System"</span></a></p>
The post <a href="https://nerdpress.org/2010/01/30/symfony-und-das-dojo-build-system/">Symfony und das Dojo Build System</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Das <a href="http://www.dojotoolkit.org/">Dojo Toolkit</a> bietet neben den offensichtlichen Features eines Full-Stack-Frameworks unter anderem mehrere &#8220;environment aware&#8221; Debug-Modi und eine Sammlung vonBuild-Scripten, die es dem Entwickler erlauben, das Framework zusammen mit den eigenen Frontend-Scripten und Stylesheets zu &#8220;kompilieren&#8221; und somit Bandbreite zu sparen bzw. Ladezeiten zu minimieren.</p>
<p><span id="more-787"></span></p>
<h3>Dojo Baukausten</h3>
<p>Standardmäßig lädt der Dojo-Core alle benötigten Pakete, die mittels dojo.require() angefordert werden, via XmlHttpRequest vom Server. Das kann je nach Projektumfang schonmal einige Sekunden in Anspruch nehmen, wenn plötzlich gefühlte 200 Sub-Requests beim Pageload abgefeuert werden.</p>
<p>Wenn es generell ans Deployment eines Web-Projekts geht, ist man daran interessiert, die Ladezeit von Scriptdateien oder Stylesheets zu minimieren, indem man zum Beispiel im ersten Schritt alle referenzierten Script-/CSS-Dateien in eine große Datei überträgt und damit konsolidiert. Dies kann mitunter mit Aufwand verbunden sein, wenn viele Scripte copied &amp; pasted werden müssen, außerdem scheint diese Vorgehensweise nicht besonders elegant, noch dazu Fehleranfällig.</p>
<p>Im zweiten Schritt nutzt man üblicherweise so etwas wie Code-Obfuscating oder Code-Minimizing. Diese Techniken dienen in erster Linie dazu, die Datenmenge von Script-Quellen zu minimieren und damit die Downloadzeiten zu beschleunigen. Dies geschieht wiederum mit Hilfe von Shellscripten oder Mini-Programmen, die Quelltexte parsen und dann je nach Voreinstellung White-Spaces und Kommentare entfernen oder den ganzen Code überarbeiten, indem bspw. Variablennamen durch möglichst kleine Buchstabenkombinationen ersetzt werden um die Zeilenlänge zu begrenzen. Der Betrachter sieht dann in der Quelltextansicht nur noch eine lange, einzeilige &#8220;Code-Wurst&#8221;.   &#8220;Disassembling&#8221; ist hier nur mit Aufwand möglich, aber prinzipiell eben das: möglich.</p>
<p>Die Dojo-Build-Tools automatisieren beide Schritte, wobei Schritt 1, die Code-Konsolidierung, durch das Dojo-Pakagesystem ermöglicht wird und Schritt 2 durch einen eingebauten Obfuscator, alternativ kann der <a href="http://code.google.com/closure/compiler/">Google Closure Compiler</a> verwendet werden. Die Werkzeuge bestehen aus einigen .jar-Dateien, die in jeder halbwegs aktuellen <a href="http://java.com/en/download/">Java Virtual Machine</a> laufen und mittels $ java &#8211;classpath &#8230; aufgerufen werden. Ein paar freundlicherweise beigelegte Shellscripte bzw. .bat-Dateien vereinfachen den Aufruf.</p>
<p>Die Datei build.sh beispielsweise benötigt mindestens einen Zielparameter &#8220;profile&#8221;, der den Pfad zur Profildatei enthält. Diese Datei besteht aus einem JSON-Objekt und konfiguriert die Projektumgebung. Hier kann der Entwickler alle Dateien bzw. Namensräume angeben, die der Compiler berücksichtigen soll.</p>
<p>Optional anzugeben ist die Behandlung von CSS-Dateien, die Code-Minimierungsstrategie und so weiter. Ein $ build.sh liefert eine gut dokumentierte Liste der möglichen Argumente.</p>
<p>Somit lassen sich automatisiert alle eigenen Javascripts und die des Dojo Frameworks zusammen mit CSS-Stylesheets für die Produktionsumgebung &#8220;fit machen&#8221; und optimieren. Dokumentiert ist das ganze wie immer mäßig auf dem <a href="http://dojocampus.org">dojocampus</a>.</p>
<h3>Dojo und Symfony</h3>
<p>Im Entwickleralltag möchte man seine Entwicklungsumgebungen zentral verwalten. Im Symfony-Kontext gibt es bspw. standardmäßig die Environments &#8220;Prod&#8221;, &#8220;Int&#8221; und &#8220;Dev&#8221;. Alle drei Umgebungen nutzen unterschiedliche Datenbanken, Loggingeinstellungen und so weiter. Natürlich liegt es nahe, die einzelnen Dojo-Builds ebenfalls &#8220;environment-aware&#8221; zu konfigurieren. Dies ist mit einigen einfachen Schritten erledigt, so könnte man bspw. das Script-Verzeichnis umgebungsabhängig verwalten. Doch so richtig optimal ist das nicht, und vor allem: Die Dojo-Build-Tools haben in der Form keine Entsprechnung als Symfony-Task, die Verheiratung wirkt also etwas widerwillig.</p>
<p>In so einem Fall lohnt sich natürlich der Blick ins Symfony Plugin Repository, und siehe da, das <a href="http://www.symfony-project.org/plugins/sfDojoPlugin">sfDojoPlugin</a> erledigt den Job. Installieren, Dojo als Dependency herunterladen (ein großer Vorteil, somit ist man nicht auf eine eventuell veraltete bundled Version angewiesen), Filter einfügen, fertig. Schon gibt es einen neuen Symfony Task Namespace &#8220;dojo&#8221;.</p>
<p>$ symfony dojo:build-for-prod</p>
<p>kompiliert dann die Javascripts für die Produktionsumgebung, ohne dass zusätzlicher Konfigurationsaufwand anfällt. Das ganze funktioniert durch eine Namensraum-Konvention der Ordner, in denen das Plugin einerseits die Dojo-Sourcen erwartet und andererseits die komplierten Scriptdateien ablegt.</p>
<p>Ein weiteres Killer-Feature ist das einfache Injizieren von PHP-Variablen in den Javascript-Context, das hier weitestgehend automatisiert abläuft. Interessant in diesem Zusammenhang wäre vielleicht noch zu wissen, in wie weit die I18N-Features des Symfony-Frameworks mit denen der Dojo-Welt verheiratet sind.</p>
<p>Dojo passt also ab Werk bereits hervorragend in jedes Symfony-Projekt, und mit dem sfDojoPlugin lässt sich die Integration nahtlos bewerkstelligen. Hat man sich einmal an die schlechte Dokumentation und die wirklich steile Lernkurve gewöhnt, lässt man mit Dojo meiner Meinung nach in Punkto Stabilität, Funktionsumfang und Projektunterstützung erstmal so ziemlich alles andere hinter sich.</p>
<h3>Links</h3>
<p>Dojo Toolkit: <a href="http://www.dojotoolkit.org/">http://www.dojotoolkit.org/</a></p>
<p>sfDojoPlugin: <a href="http://www.symfony-project.org/plugins/sfDojoPlugin">http://www.symfony-project.org/plugins/sfDojoPlugin</a></p>
<p>Eine Beispielimplementierung einer Webbasierten GUI-Komponente für die Build-Tools, leider auf Basis einer veralteten Version : <a href="http://build.dojotoolkit.org/0.4.2/web/buildscripts/webbuild/">http://build.dojotoolkit.org/0.4.2/web/buildscripts/webbuild/</a></p>
<p>Ebenfalls veraltet, aber sicher einen Blick wert: GUI für die Dojo Build Tools, Eclipse-basiert: <a href="http://shaneosullivan.wordpress.com/2007/01/29/second-beta-of-dojobuilder-released/">http://shaneosullivan.wordpress.com/2007/01/29/second-beta-of-dojobuilder-released/</a></p>The post <a href="https://nerdpress.org/2010/01/30/symfony-und-das-dojo-build-system/">Symfony und das Dojo Build System</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Symfony-Plugin: ein FormWidget mit eigenen Ajax Actions</title>
		<link>https://nerdpress.org/2010/01/17/symfony-plugin-widget-mit-ajax-actions/</link>
		
		<dc:creator><![CDATA[Max Girkens]]></dc:creator>
		<pubDate>Sun, 17 Jan 2010 19:24:35 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[FormFramework]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Widget]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=686</guid>

					<description><![CDATA[<p>Wenn man versucht mit Symfony/Doctrine/Generator Bordmitteln &#8220;related&#8221; Objekte in Formularen darzustellen, wird das schnell schwierig bei etwas mehr Daten. &#8220;Ein Projekt wird mehreren Mitarbeitern zugewiesen. Es gibt aber 500.000 Mitarbeiter.&#8221; Schon rendert sich das generierte multi-select im Projekt-Formular den sprichwörtlichen Wolf. Hier braucht man eigentlich schon was mit Ajax/Pagination. Hier ein Entwurf für ein FormWidget, &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/01/17/symfony-plugin-widget-mit-ajax-actions/" class="more-link">Continue reading<span class="screen-reader-text"> "Symfony-Plugin: ein FormWidget mit eigenen Ajax Actions"</span></a></p>
The post <a href="https://nerdpress.org/2010/01/17/symfony-plugin-widget-mit-ajax-actions/">Symfony-Plugin: ein FormWidget mit eigenen Ajax Actions</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Wenn man versucht mit Symfony/Doctrine/Generator Bordmitteln &#8220;related&#8221; Objekte in Formularen darzustellen, wird das schnell schwierig bei etwas mehr Daten.<br />
&#8220;Ein Projekt wird mehreren Mitarbeitern zugewiesen. Es gibt aber 500.000 Mitarbeiter.&#8221;<br />
Schon rendert sich das generierte multi-select im Projekt-Formular den sprichwörtlichen Wolf.<br />
Hier braucht man eigentlich schon was mit Ajax/Pagination.</p>
<p>Hier ein Entwurf für ein <a href="http://www.symfony-project.org/more-with-symfony/1_4/en/05-Custom-Widgets-and-Validators">FormWidget</a>, Plugin das seine eigenen Ajax Actions haben soll.<span id="more-686"></span><br />
Also erstmal</p>
<pre class="brush: bash; title: ; notranslate">
/plugins/myMightyWidget 
</pre>
<p>anlegen.</p>
<p>Die Struktur <strong>darin</strong> sieht dann nachher so aus:</p>
<pre class="brush: bash; title: ; notranslate">
./lib/myMightyWidget.class.php            
./modules/myMightyWidget/actions/actions.class.php
./modules/myMightyWidget/templates/_myMightyWidget.php       
./modules/myMightyWidget/templates/myajaxactionSuccess.php
( ./web/css/myMightyCSSFile.css )
( ./web/js/myMightyExternalJSFile.js )
</pre>
<p>als erstes:</p>
<pre class="brush: bash; title: ; notranslate">
/plugins/myMightyWidget/lib/myMightyWidget.class.php
</pre>
<p>Das Template HTML schreiben wir in ein Partial das wir dann nachher in der render-Methode holen.<br />
Dafür müssen wir uns eben den  Partial Helper laden, von Haus aus gibt es die Funktion nicht in der Widget Klasse.<br />
Falls unser Widget einen eigenen Stylesheet und auch eine eigene JS Datei haben möchte, könnten wir die beiden auch bequem im entsprechenden myMightyWidget/web Ordner unterbringen. Und auch via den getStylesheet/ getJavascripts Methoden laden lassen.</p>
<pre class="brush: bash; title: ; notranslate">
/plugins/myMightyWidget/lib/myMightyWidget.class.php
</pre>
<pre class="brush: php; title: ; notranslate">
class myMightyWidget extends sfWidgetForm
{
	
  public function configure( $options = array(), $attributes = array() )
  {
  	
  	$this-&gt;addOption(  &quot;someOption&quot; );
  	
  	$this-&gt;addOption(  &quot;someOtherOption&quot;, &quot;default&quot; );
  }
  
  public function getStylesheets()
  {
    return array(
    	&#039;/myMightyWidget/css/myMightyWidget.css&#039; =&gt; &#039;&#039;
    );
  }
  
  public function getJavascripts()
  {
    return array(
    	&#039;/myMightyWidget/js/myMightyWidget.js&#039;
    );
  }
  
  public function render($name, $value = null, $attributes = array(), $errors = array())
  {
  	
        //load partial Helper as we want to outsource the Template
	sfContext::getInstance()-&gt;getConfiguration()-&gt;loadHelpers(&#039;Partial&#039;);
  	
  	
    $options = array(
        &#039;someOption&#039;           =&gt; $this-&gt;getOption(&#039;someOption&#039;),
        &#039;someOtherOption&#039;  =&gt; $this-&gt;getOption(&#039;someOtherOption&#039;)
    );
    
  	return  get_partial( &#039;myMightyWidget/myMightyWidget&#039;, $options );
  }
  
}
</pre>
<p>dann brauchen wir den modules Ordner, hier schonmal für das Partial template<br />
also den Ordner</p>
<pre class="brush: bash; title: ; notranslate">
/plugins/myMightyWidget/modules/myMightyWidget
</pre>
<p> anlegen.</p>
<p>Darin dann das Partial &#8220;_myMightyWidget.php&#8221; anlegen:</p>
<p>(ich setze aus Schreibfaulheit einfach mal jQuery voraus &#8230;)</p>
<pre class="brush: php; title: ; notranslate">

&lt;script type=&quot;text/javascript&quot;&gt;

	$(document).ready(function() {
            $(&quot;#myMightyWidget&quot;).find(&quot;.ajaxResults&quot;)load( &#039;&lt;?php echo url_for( &quot;myMightyWidget/myAjaxAction&quot; ); ?&gt;&#039; );
        });
		
&lt;/script&gt;

&lt;div id=&quot;myMightyWidget&quot;&gt;

    Hello ...

    &lt;div class=&quot;ajaxResults&quot;&gt;&lt;/div&gt;

&lt;/div&gt;

</pre>
<p>Für die Ajax Daten dann Action und Template anlegen:</p>
<pre class="brush: bash; title: ; notranslate">
/plugins/myMightyWidget/modules/myMightyWidget/actions/actions.class.php
</pre>
<pre class="brush: php; title: ; notranslate">
class myMightyWidgetActions extends sfActions
{
	
	public function executeMyAjaxAction( sfWebRequest $request )
 	{
 		$this-&gt;world = &quot;World&quot;;
    	}
	
 }
</pre>
<p>und das Template:</p>
<pre class="brush: bash; title: ; notranslate">
/plugins/myMightyWidget/modules/myMightyWidget/templates/myajaxactionSuccess.php
</pre>
<pre class="brush: php; title: ; notranslate">
&lt;strong&gt;
    &lt;?php echo $world; ?&gt;
&lt;/strong&gt;
</pre>
<p>Dann in der app, wo wir das Widget benutzen möchten einfach das Modul &#8220;myMightyWidget&#8221; aktivieren (settings.yml).<br />
Und das Widget im Template oder direkt in einer Formklasse einbinden.<br />
Und man kann sich mitten im Formular durch irgendwelche Ajax Listen blättern, oder was einem eben einfällt.</p>
<p>Um die Ergebnisse dem generierten Formular &#8220;unterzuschmuggeln&#8221; muss man nur via JS inputs mit den entsprechenden Namen erzeugen, dann wird das ganz normal mitverarbeitet.<br />
zB.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;input type=&quot;hidden&quot; name=&quot;project&amp;#91;mitarbeiter_list&amp;#93;&amp;#91;&amp;#93;&quot; value=&quot;&lt;?php echo $mitarbeiter_id ?&gt;&quot; /&gt;
</pre>The post <a href="https://nerdpress.org/2010/01/17/symfony-plugin-widget-mit-ajax-actions/">Symfony-Plugin: ein FormWidget mit eigenen Ajax Actions</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DOJO 1.4 final</title>
		<link>https://nerdpress.org/2009/12/11/dojo-1-4-final/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 11 Dec 2009 10:35:06 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Dojo Toolkit]]></category>
		<category><![CDATA[JS]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=657</guid>

					<description><![CDATA[<p>Dojo 1.4 ist &#8216;raus. Fast ein Jahr wurde darauf verwendet, die bestehende Version 1.3 zu härten und schneller zu machen. Daher erwarten den Benutzer zwar keine großen Neuerungen, dafür aber volle Abwärtskompatiblität zur Version 1.3 und eine menge Bugfixes. Alle Änderungen und Verbesserungen sind den Release Notes zu entnehmen. Ich habe direkt mal ein größeres &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2009/12/11/dojo-1-4-final/" class="more-link">Continue reading<span class="screen-reader-text"> "DOJO 1.4 final"</span></a></p>
The post <a href="https://nerdpress.org/2009/12/11/dojo-1-4-final/">DOJO 1.4 final</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.dojotoolkit.org/">Dojo 1.4</a> ist &#8216;raus. Fast ein Jahr wurde darauf verwendet, die bestehende Version 1.3 zu härten und schneller zu machen. Daher erwarten den Benutzer zwar keine großen Neuerungen, dafür aber volle Abwärtskompatiblität zur Version 1.3 und eine menge Bugfixes.</p>
<p><span id="more-657"></span>Alle Änderungen und Verbesserungen sind den <a href="http://docs.dojocampus.org/releasenotes/1.4">Release Notes</a> zu entnehmen. Ich habe direkt mal ein größeres Projekt angehoben, und siehe da &#8211; es läuft, von zwei kleinen <span style="text-decoration: line-through;">Fehlern</span>Eigentoren abgesehen: 1.) Nach dem Update unbedingt den Cache leeren. 2.) Manche Dinge werden jetzt strikter gehandhabt, so kann eine DOJO-Class nicht mehr von einem &#8220;undefined&#8221; erben. So gibt die Migration Gelegenheit, seinen eigenen Müll zu erkennen und aufzuräumen. Um nicht missverstanden zu werden. Das Update klappte hervorragend, die Probleme resultierten ausschließlich aus der Unfähigkeit des Users ;)</p>
<p>Der erste Eindruck ist ein tatsächlich ein (gefühlter) Geschwindigkeitsvorteil, und vor allem die Dijits/Dojox-Layoutwidgets rendern nun augenscheinlich sauberer. Mein ziemlich aufgebohrtes dojox.grid.DataGrid beispielsweise berücksichtigt nun seine Scrollbalken, auch wenn der unterliegende Datastore &#8220;LazyLoad&#8221; kann. Das Accordion ist um einiges stabiler geworden &#8211; eventuell kann man es nun doch wagen, nach dem Rendern &#8211; zur Laufzeit &#8211; neue Knoten einzufügen bzw. zu löschen. Der Rest wie gehabt, unglaublich mächtig und leider weiterhin unglaublich schlecht dokumentiert. Aber immerhin:</p>
<blockquote>
<p>We&#8217;ve not fully resolved the &#8220;where the docs live&#8221; question, so are providing them as offline static HTML in the downloads section for 1.4.0.</p>
</blockquote>
<p>Quelle: http://www.dojotoolkit.org/2009/12/10/new-dojo-release-ready-consumption-1-4-0</p>
<p>Jedenfalls viel Spaß beim Testen, bei aller Malaise ist Dojo meiner Meinung nach weiterhin <em>das</em> ganzheitlichste, quelloffene Javascript-Framework wo gibt.</p>The post <a href="https://nerdpress.org/2009/12/11/dojo-1-4-final/">DOJO 1.4 final</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
