<?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>dev.enekoalonso.com &#187; countdown</title>
	<atom:link href="http://dev.enekoalonso.com/tag/countdown/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.enekoalonso.com</link>
	<description>having fun with code</description>
	<lastBuildDate>Wed, 12 Oct 2011 21:40:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>MooTools classes with &#8220;Smart Start&#8221;</title>
		<link>http://dev.enekoalonso.com/2008/12/10/mootools-classes-with-smart-start/</link>
		<comments>http://dev.enekoalonso.com/2008/12/10/mootools-classes-with-smart-start/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 06:02:22 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[countdown]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[smartstart]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=117</guid>
		<description><![CDATA[A couple of days ago I was talking with my friend Karsten at work about one small but relevant issue we face when building websites: our beautiful MooTools classes cannot interact with elements on the DOM until the DOM has fully loaded. This, which is obvious, sometimes has some impact. For example, the typical case [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago I was talking with my friend Karsten at work about one small but relevant issue we face when building websites: our beautiful MooTools classes cannot interact with elements on the DOM until the DOM has fully loaded. This, which is obvious, sometimes has some impact.</p>
<p>For example, the typical case we face is with tabs. Usually you will see code that hides all tab panels but the first one with CSS classes. But what if your visitor has Javascript disabled? With no Javascript, all tabs should be visible. So we need to hide the tabs with Javascript, but now we face the problem: we cannot alter the elements until the DOM is ready. And that is to late for some browsers like IE6 &#038; IE7 which are not very fast processing Javascript. If we hide the tabs on the initialize method of our class, you will see them on the screen for a split of a second. That is not good.</p>
<p>The solution is simple: Use document.write to create the styles needed to hide the tabs as soon as the javascript is processed, this is, before the DOM is loaded. The problem is that we are not creating our classes until the DOM is loaded, so this code has to be placed somewhere else, breaking the encapsulation that object oriented programming gives us.</p>
<p>So we came up with an idea, more or less at the same time: Instantiate our classes with a &#8216;Smart Start&#8217;. This is, our objects will be created before the DOM is ready but will be smart enough to hold the interaction with the elements until that point. This will allow us to do other stuff if we want to, like hiding the tabs other than the first one.</p>
<p>As an example, I have modified <a href="http://davidwalsh.name/mootools-countdown-plugin">this cool CountDown class</a> that David Walsh has just published.</p>
<p>Here is the new code:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> CountDown = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; Implements: <span class="br0">&#91;</span>Options,Events<span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; domReady: <span class="kw2">false</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; startOnDomReady: <span class="kw2">false</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; fx: <span class="kw2">null</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; options: <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; element: <span class="kw2">null</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; start: <span class="nu0">10</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; finish: <span class="nu0">0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; startFont: <span class="st0">&#39;36px&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; finishFont: <span class="st0">&#39;12px&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; onComplete: $$empty,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; duration: <span class="nu0">1000</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">setOptions</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Smart objects can listen to domready</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; window.<span class="me1">addEvent</span><span class="br0">&#40;</span><span class="st0">&#39;domready&#39;</span>,<span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">domReady</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">element</span> = $<span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">element</span><span class="br0">&#41;</span>; <span class="co1">// Hook element</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">startOnDomReady</span><span class="br0">&#41;</span> <span class="kw1">this</span>.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; start: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// If DOM is not ready, wait</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">this</span>.<span class="me1">domReady</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">startOnDomReady</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Create FX object only once</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">fx</span> = <span class="kw2">new</span> Fx.<span class="me1">Tween</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">element</span>, <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; duration: <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">duration</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; link: <span class="st0">&#39;ignore&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; onComplete: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">start</span> <span class="sy0">&gt;</span>= <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">finish</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">anim</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">fireEvent</span><span class="br0">&#40;</span><span class="st0">&#39;complete&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">anim</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; anim: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">element</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>,<span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">start</span>&#8211;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">fx</span>.<span class="me1">start</span><span class="br0">&#40;</span><span class="st0">&#39;font-size&#39;</span>,<span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">startFont</span>,<span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">finishFont</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> cd = <span class="kw2">new</span> CountDown<span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; element: <span class="st0">&#39;countdown&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; start: <span class="nu0">12</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; finish: <span class="nu0">0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; onComplete: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">element</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>,<span class="st0">&#39;Done! Your special code is: 4065&#39;</span><span class="br0">&#41;</span>.<span class="me1">setStyle</span><span class="br0">&#40;</span><span class="st0">&#39;color&#39;</span>,<span class="st0">&#39;#090&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>As you can see, the object is instantiated as soon as the Javascript is processed but, even with the function start() being called, the object doesn&#8217;t start processing until the DOM is ready.</p>
<p>Demo: <a href="http://dev.enekoalonso.com/research/moo-countdown-smartstart.php">http://dev.enekoalonso.com/research/moo-countdown-smartstart.php</a></p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>January 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/01/18/finally-singletons-the-mootools-way/" title="Finally: Singletons, the Mootools way">Finally: Singletons, the Mootools way</a> (0)</li><li>July 20, 2009 -- <a href="http://dev.enekoalonso.com/2009/07/20/setters-getters-on-mootools-classes/" title="Setters &#038; Getters on Mootools classes">Setters &#038; Getters on Mootools classes</a> (2)</li><li>April 23, 2009 -- <a href="http://dev.enekoalonso.com/2009/04/23/sending-messages-between-javascript-objects/" title="Sending messages between Javascript objects">Sending messages between Javascript objects</a> (2)</li><li>April 7, 2009 -- <a href="http://dev.enekoalonso.com/2009/04/07/setting-up-timers-and-intervals-inside-js-objects/" title="Setting up timers and intervals inside JS objects">Setting up timers and intervals inside JS objects</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2008/12/10/mootools-classes-with-smart-start/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

