<?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>a pint of javascript (and general web stuff) &#187; javascript</title>
	<atom:link href="http://blog.gonchuki.com/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gonchuki.com</link>
	<description></description>
	<lastBuildDate>Tue, 06 Jul 2010 21:45:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CSS Sprites2 &#8211; It&#039;s MooTools Time</title>
		<link>http://blog.gonchuki.com/archives/css-sprites2-its-mootools-time/</link>
		<comments>http://blog.gonchuki.com/archives/css-sprites2-its-mootools-time/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 17:29:20 +0000</pubDate>
		<dc:creator>gonchuki</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[patterns]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[sprites]]></category>

		<guid isPermaLink="false">http://blog.gonchuki.com/?p=34</guid>
		<description><![CDATA[A few months ago you may have read Dave Shea&#039;s entry on A List Apart &#034;CSS Sprites2 &#8211; It&#039;s JavaScript Time&#034; where he implemented a variant of his own CSS Sprites article by adding jQuery based animations. In this same article Dave encouraged us [developers] to port it to other libraries, so after a few [...]]]></description>
			<content:encoded><![CDATA[<p>A few months ago you may have read <a href="http://www.mezzoblue.com/">Dave Shea</a>&#039;s entry on A List Apart &#034;<a href="http://www.alistapart.com/articles/sprites2"><acronym title="Cascading Style Sheets">CSS</acronym> Sprites2 &#8211; It&#039;s JavaScript Time</a>&#034; where he implemented a variant of his own <a href="http://www.alistapart.com/articles/sprites"><acronym title="Cascading Style Sheets">CSS</acronym> Sprites</a> article by adding <a href="http://jquery.com">jQuery</a> based animations. In this same article Dave encouraged us [developers] to port it to other libraries, so after a few months of inactivity I&#039;m back with the <a href="http://mootools.net">MooTools</a> port of this slick effect.<br />
<span id="more-34"></span></p>
<link rel="stylesheet" type="text/css" href="http://sandbox.gonchuki.com/sprites2/sprites2.css" media="all" />
<h3 class="section">Enter the MooTools</h3>
<p>While the original version used jQuery (1.2.6 at that time) and lots of people like it, we (mootoolers) have a different approach to code specially emphasizing on OOP techniques and readability. Part of the issue might not be jQuery per-se and be Dave&#039;s code that was a little obfuscated, but it anyways has a lot of room for improvement.<br />
This article will just describe differences between the MooTools implementation and the Dave&#039;s jQuery one, so unless stated otherwise, everything from the ALA article applies here.</p>
<h3 class="section">enter the Sprites2 class</h3>
<p>Part of the requirements I imposed myself when porting to MooTools was that it had to be easier to use than the jQuery version, and that it should give a certain degree of flexibility to extend the possible transition effects.<br />
End result is a class intuitively named Sprites2, where you gracefully pass named parameters:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">new</span> Sprites2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>mode<span style="color: #339933;">:</span> <span style="color: #3366CC;">'fade'</span><span style="color: #339933;">,</span> item_selector<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ul.nav a'</span><span style="color: #339933;">,</span> duration<span style="color: #339933;">:</span> <span style="color: #CC0000;">250</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

Now that&#039;s classy! [stupid pun, I know]<br />
Notice that these parameters above are the class defaults, so you could have just as easily used <var>new Sprites2();</var> and the end result would be the same.</p>
<h3 class="section">changes to original code and idea</h3>
<p>Apart from moving the code to a class, a change to note is the removal of the :active state from the <acronym title="Cascading Style Sheets">CSS</acronym> and the <var>setActive</var> parameter in the <acronym title="JavaScript">JS</acronym> code. This was mostly a personal preference as the :active pseudo-class created a few issues when holding the mouse on the element and releasing outside of it. Other notable changes in the <acronym title="Cascading Style Sheets">CSS</acronym> are the simplification of the implementation/adaptation process by using a simpler approach on the styles (for example, using <var>height:100%;</var> where applicable instead of <a href="http://www.alistapart.com/d/sprites2/examples/example-script.css">redefining height:48px; 5 times in the <acronym title="Cascading Style Sheets">CSS</acronym></a>).</p>
<p>MooTools also has a free &#034;upgrade&#034; built-in: animations have an internal state so that if you roll out from the element and enter it again, the transition will continue to run smoothly. In contrast, jQuery version (may be by code design, maybe because of a library limitation) flickers madly when you roll over and out of the element repeatedly with an interval less than the effect duration.</p>
<p>Also to note, and as mentioned, the Sprites2 class can be easily extended outside of the sprites2.js file with just a few lines of code to create for example a horizontal slide effect:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">Sprites2.<span style="color: #660066;">implement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  effects<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
    slide_x<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>fx_element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      fx_element.<span style="color: #660066;">store</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'width'</span><span style="color: #339933;">,</span> fx_element.<span style="color: #660066;">getSize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">x</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">setStyles</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'width'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">show_fn</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>fx_element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> fx_element.<span style="color: #660066;">tween</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'width'</span><span style="color: #339933;">,</span> fx_element.<span style="color: #660066;">retrieve</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'width'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">hide_fn</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>fx_element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> fx_element.<span style="color: #660066;">tween</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'width'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>and you can start using it right away with <var>new Sprites2({mode: &#039;slide_x&#039;});</var>. This obviously works any way you want, as you can manually add or remove the effects directly in the source file.</p>
<h3 class="section">download, full demo and requirements</h3>
<p>The example here is running on a standard <a href="http://ajax.googleapis.com/ajax/libs/mootools/1.2.1/mootools-yui-compressed.js">google hosted version of mootools 1.2.1</a>. For those of you that use custom builds, just be sure to add FX.Tween and FX.Morph to your standard array of includes (morph is only used by the &#034;animate&#034; effect, so if you don&#039;t use that one you can exclude it.)</p>
<p><a href="http://sandbox.gonchuki.com/sprites2/sprites2_moo.html">View full online demo</a></p>
<p><a href="http://sandbox.gonchuki.com/sprites2/sprites2.zip" rel="download" class="download">Download Sprites2</a> for MooTools [zip].</p>
<p><strong>new!</strong> &#8211; by popular demand (not really), I have just set-up a git repo so you can fork the latest source: <a href="http://github.com/gonchuki/sprites2-moo">http://github.com/gonchuki/sprites2-moo</a></p>
<p><strong>License:</strong> <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-Share Alike 3.0</a><br />
<small>disclaimer: original code did not contain any license whatsoever (like all ALA code), so I assumed a CC share-alike license applies perfectly in this case.</small><br />]]></content:encoded>
			<wfw:commentRss>http://blog.gonchuki.com/archives/css-sprites2-its-mootools-time/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>updating moopop for mootools 1.2</title>
		<link>http://blog.gonchuki.com/archives/updating-moopop-for-mootools-12/</link>
		<comments>http://blog.gonchuki.com/archives/updating-moopop-for-mootools-12/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 02:37:31 +0000</pubDate>
		<dc:creator>gonchuki</dc:creator>
				<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[moopop]]></category>
		<category><![CDATA[mootools 1.2]]></category>

		<guid isPermaLink="false">http://blog.gonchuki.com/?p=22</guid>
		<description><![CDATA[After several requests to update the script, I finally had time to make the update. In fact the script was under production for more than a month running over mootools SVN builds. The update also comes with a couple additions suggested by users, and also some optimizations thanks to the new mootools 1.2 element storage.

so&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>After several requests to update the script, I finally had time to make the update. In fact the script was under production for more than a month running over mootools SVN builds. The update also comes with a couple additions suggested by users, and also some optimizations thanks to the new mootools 1.2 <a href="http://blog.mootools.net/2008/1/22/Element_Storage">element storage</a>.</p>
<p><span id="more-22"></span></p>
<h3 class="section">so&#8230; what&#039;s new?</h3>
<p>the basic improvement is that the code now works with mootools 1.2, be warned that this actually *breaks* compatibility with mootools 1.11 so please use <a href="http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/">the older version</a> if you haven&#039;t yet gone to 1.2</p>
<p>and then, what else?<br />
<strong>resizable windows</strong><br />
I got some requests for this feature, so it&#039;s here. Just mix a &#034;r&#034; parameter in this format: &#034;[600,400,r]&#034; and the popup window generated will be resizable.</p>
<p><strong>ability to reuse the same popup</strong><br />
the old moopop had a bad habit of creating a new popup window for each link and not offering an option to reuse the same window. now you can use the &#034;name&#034; attribute native to &lt;a&gt; tags to specify the target of the popup.</p>
<p><strong>defaulting to rel=&#034;popup&#034;</strong><br />
now you can just call moopop.captureByRel() without arguments and the script will default to the most common use case.</p>
<p><strong>under the hood&#8230;</strong><br />
optimized code a bit, and now it&#039;s using both element storage to avoid memory leaks and cleaner CSS2 selectors that got native in mootools 1.2</p>
<h3 class="section">documentation?</h3>
<p>yes sure, unless for the additions specified in this post, all documentation remains the same and you can get it either in <a href="http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/">the original post</a>, or looking at the source of the uncompressed moopop 1.1</p>
<h3 class="section">download</h3>
<p>as with previous version, you just need Selectors and DomReady from the <a href="http://mootools.net/core">mootools core builder</a> and the rest of the dependencies are automatically selected.</p>
<p><a href="http://sandbox.gonchuki.com/moopop_1.1/moopop.js" rel="download" class="download">Download moopop 1.1</a> with documentation<br />
or<br />
<a href="http://sandbox.gonchuki.com/moopop_1.1/moopop_min.js" rel="download" class="download">Download minified version</a> without docs to save bandwidth.</p>
<p><strong>License:</strong> <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-Share Alike 3.0</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.gonchuki.com/archives/updating-moopop-for-mootools-12/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>usability 101: adding a global &quot;back to top&quot; to your site</title>
		<link>http://blog.gonchuki.com/archives/usability-101-adding-a-global-back-to-top-to-your-site/</link>
		<comments>http://blog.gonchuki.com/archives/usability-101-adding-a-global-back-to-top-to-your-site/#comments</comments>
		<pubDate>Sun, 11 Nov 2007 19:26:04 +0000</pubDate>
		<dc:creator>gonchuki</dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://blog.gonchuki.com/archives/usability-101-adding-a-global-back-to-top-to-your-site/</guid>
		<description><![CDATA[If there has to be one single usability issue I dislike from most sites, it is the &#034;back to top&#034; feature. Ugly links spread all over the place clogging the visuals of your site. It is for this reason that some months ago we developed a global unobtrusive back to top for Operator11.

identifying the problem
As [...]]]></description>
			<content:encoded><![CDATA[<p>If there has to be one single usability issue I dislike from most sites, it is the &#034;back to top&#034; feature. Ugly links spread all over the place clogging the visuals of your site. It is for this reason that some months ago we developed a global unobtrusive back to top for <a href="http://operator11.com">Operator11</a>.<br />
<span id="more-18"></span></p>
<h3 class="section">identifying the problem</h3>
<p>As we have seen before, <a href="http://poorbuthappy.com/ease/archives/2007/08/30/3804/ia-for-beginners-long-pages-work">long pages work</a>. But we always have an issue in the process: if one wants to navigate to other section of the site you have to scroll all the way up or use your other hand to hit the [Home] key.<br />
Given that the average internet user (I would say more than 90%) use their mouse to browse the web, either having to use your other hand and hunt for a key, scrolling up repetitively or clicking on that very top portion of that 16px wide scrollbar adds complexity to the task we are doing and <a href="http://www.humanized.com/weblog/2006/07/22/know_when_to_stop_designing_quantitatively/">decreases our efficiency</a>.<br />
Users love to hunt for information from page to page, and our task as user experience designers is to give them the tools to ease their stay.</p>
<h3 class="section">the wrong approach</h3>
<p>The classic solution of spreading links all over the place has great design, usability and accessibility problems.<br />
From the design point of view you either come up with a clever way to disguise the links or just leave them out there clogging the visuals. Not good either way!<br />
Usability wise, do you really know when the user wants to go back to the top of the page? Is there a need to spam the user with back to top links?<br />
And that spamming also means for decreased accessibility, screen reader or keyboard users will be constantly spammed with those meaningless links. They <strong>already</strong> know how to get back to the top of the page without the need for your &#034;shortcuts&#034;.<br />
Shouldn&#039;t there be a wiser and cleaner solution?</p>
<h3 class="section">developing a solution</h3>
<p>Fortunately, <strong>there is</strong> a fairly good solution. And armed with a bit of javascript and standards compliant <acronym title="Cascading Style Sheets">CSS</acronym> we can pull the trick.<br />
Did I just say javascript? why, yes! The back to top link is a navigational aid for mouse users and not real content in your page, think of it as an escape pod for when you want to get away from the current page.<br />
When developing this together with <a href="http://nicolassanguinetti.info">Nicolas Sanguinetti</a> for <a href="http://operator11.com">Operator11</a> our main goals were:<br />
- keep it clean<br />
- be unobtrusive<br />
- keep it usable<br />
The final solution ended as a tiny piece of code written with the aid of <a href="http://prototypejs.org">Prototype</a>.<br />
However as you may know, my personal and professional focus is into the <a href="http://mootools.net">mootools</a> library and for this reason the solution presented today will be an adaptation from the original code.</p>
<h3 class="section">methodology and code</h3>
<p><strong>Q:</strong> So when should we show the back to top link?<br />
<strong>A:</strong> Once we think the user needs it.<br />
Getting this metric can be a bit tricky and it&#039;s mostly arbitrary, but we finally settled for <strong>80% of a full page scroll</strong>. It&#039;s around this point that we need at least two mouse wheel scrolls to reach the top and hitting the back to top link becomes more efficient.<br />
the javascript:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'load'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">new</span> Element<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #3366CC;">'id'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'back-to-top'</span><span style="color: #339933;">,</span> 
    <span style="color: #3366CC;">'styles'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'opacity'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">0.6</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #3366CC;">'events'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> window.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;page&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
      <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span> window.<span style="color: #660066;">scrollTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #660066;">setText</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'back to top'</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #660066;">injectInside</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">body</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  window.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'scroll'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> fn <span style="color: #339933;">=</span> window.<span style="color: #660066;">getScrollTop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">0.8</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #3366CC;">&quot;addClass&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;removeClass&quot;</span><span style="color: #339933;">;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'back-to-top'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>fn<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'visible'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>and this simple CSS:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#back-to-top</span><span style="color: #00AA00;">,</span>
<span style="color: #cc00cc;">#back-to-top</span><span style="color: #6666ff;">.visible</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
body<span style="color: #00AA00;">&gt;</span><span style="color: #cc00cc;">#back-to-top</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">fixed</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">bottom</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">cursor</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">pointer</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">3px</span> <span style="color: #933;">17px</span> <span style="color: #933;">3px</span> <span style="color: #933;">7px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span> <span style="color: #933;">14px</span> Arial<span style="color: #00AA00;">,</span> Helvetica<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#555</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000; font-style: italic;">triangle-gray-up.png</span><span style="color: #00AA00;">&#41;</span> <span style="color: #993333;">no-repeat</span> <span style="color: #000000; font-weight: bold;">right</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
body<span style="color: #00AA00;">&gt;</span><span style="color: #cc00cc;">#back-to-top</span><span style="color: #6666ff;">.visible</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">inline</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p></p>
<h3 class="section">pitfalls and caveats</h3>
<p>Just a few notes on usage and explanation of the methodology are needed.<br />
The code as you see purposely ignores IE6 as it has inexistent support for <code>position: fixed</code>. By using a CSS2 selector we gracefully degrade and ignore that browser and only display the link on standards compliant browsers.<br />
There is also another issue with <acronym title="Internet Explorer">IE</acronym> (6 and 7) that throws the infamous <a href="http://clientside.cnet.com/code-snippets/manipulating-the-dom/ie-and-operation-aborted/">Operation aborted</a> error and it&#039;s the reason behind using the <code>onload</code> event instead of <code>ondomready</code>.<br />
Last, but not the least, removing the hash part in the <acronym title="Uniform Resource Locator">URL</acronym> reloads the page instead of just cleaning that part of the location. This happens *at least* in Firefox and it is enough to conclude that setting <code>window.location.hash = ""</code> is not an option. For this is that we check the existence of the hash in the current location, and if not present we scroll to the top with javascript or else we set the location to the topmost element in our page.<br />
Be warned then, that if you use internal anchors in your site, you must have an element with an ID at the top of your page, preferably the body tag.<br />
For the curious, we re-set the hash part just for bookmarking purposes. If you hit the back to top link, then you are supposedly at the top and not on #someplace in the page.</p>
<h3 class="section">compatibility, download and legal bits</h3>
<p>The code is tested and works under Firefox, Opera 9, Safari 3 (both Windows and Mac) and Internet Explorer 7.<br />
As for <a href="http://mootools.net/download">mootools</a>, you just need the &#034;Element.Event&#034; and &#034;Window.Size&#034; modules, pretty much standard stuff.</p>
<p>By the way, you should have already noticed the back to top link in action in this post, feel free to try it out before leaving your comments ;)</p>
<p><a href="http://sandbox.gonchuki.com/btt/back-to-top.zip" class="download">Download back-to-top.zip</a></p>
<p><strong>License:</strong> <a href="http://creativecommons.org/licenses/by-sa/3.0/" class="cc">Creative Commons Attribution-Share Alike 3.0</a></p>
<p><strong>2009/02/27 &#8211; Update:</strong> The original code above was originally intended for mootools 1.11 (bleeding edge at that time in 2007), but given that 1.2 has been out for a long time I guess it&#039;s time for a quick update for <strong>mootools 1.2.x</strong><br />
I also took a few minutes to clean-up the <acronym title="Cascading Style Sheets">CSS</acronym> (no more CSS2 descendant rule to hide from IE6) and moved the &#034;fixed&#034; styles to the Element creation in the <acronym title="JavaScript">JS</acronym>. Now all that remains in the <acronym title="Cascading Style Sheets">CSS</acronym> is the customization on font, color, padding and background. The effect now also uses a fade in tween if it&#039;s available in your custom Mootools build.<br />
<a href="http://sandbox.gonchuki.com/btt/back-to-top_1.2.zip" class="download">Download back-to-top for mootools 1.2.x</a> [zip]</p>
<h3 class="section">addendum: original Prototype code</h3>
<p>Being that I was struck by <del datetime="2007-11-15T17:41:52+00:00">a very strange bug in mootools 1.11</del> <ins datetime="2007-11-15T17:41:52+00:00"><a href="http://dev.wp-plugins.org/ticket/723">a lame overriding of the addEvent function</a> by the <a href="http://wordpress.org/extend/plugins/stats/" rel="nofollow">Wordpress.com Stats plugin</a></ins>, I&#039;m putting here also the original Prototype-based implementation either for comparison or just for those Prototype users out there:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">BackToTop <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
    initialize<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>
            BackToTop.<span style="color: #660066;">link</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Element<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'back-to-top'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
                .<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;back to top&quot;</span><span style="color: #009900;">&#41;</span>
                .<span style="color: #660066;">setOpacity</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0.6</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        BackToTop.<span style="color: #660066;">link</span>.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;click&quot;</span><span style="color: #339933;">,</span> BackToTop.<span style="color: #660066;">onLinkClick</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Event.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;scroll&quot;</span><span style="color: #339933;">,</span> BackToTop.<span style="color: #660066;">onWindowScroll</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    onLinkClick<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            window.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;page&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            window.<span style="color: #660066;">scrollTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    onWindowScroll<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">viewport</span>.<span style="color: #660066;">getScrollY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">viewport</span>.<span style="color: #660066;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">0.8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            BackToTop.<span style="color: #660066;">link</span>.<span style="color: #660066;">addClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'visible'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            BackToTop.<span style="color: #660066;">link</span>.<span style="color: #660066;">removeClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'visible'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
Event.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span> <span style="color: #3366CC;">'load'</span><span style="color: #339933;">,</span> BackToTop.<span style="color: #660066;">initialize</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>notice that this was first written to be a <a href="http://www.danwebb.net/2006/9/3/low-pro-unobtrusive-scripting-for-prototype">LowPro</a> behaviour (and fitting more of Nicolas&#039; coding style) but given the Operation Aborted bug in <acronym title="Internet Explorer">IE</acronym> we reverted back to plain Event.observe from Prototype.<br />
<script type="text/javascript" src="http://sandbox.gonchuki.com/btt/mootools.js"></script><br />
<script type="text/javascript" src="http://sandbox.gonchuki.com/btt/back-to-top.js"></script></p>]]></content:encoded>
			<wfw:commentRss>http://blog.gonchuki.com/archives/usability-101-adding-a-global-back-to-top-to-your-site/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>moopop: &quot;unobtrusive&quot; popups with mootools</title>
		<link>http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/</link>
		<comments>http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/#comments</comments>
		<pubDate>Mon, 13 Aug 2007 01:14:23 +0000</pubDate>
		<dc:creator>gonchuki</dc:creator>
				<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/</guid>
		<description><![CDATA[I know, it&#039;s quite ironic to call unobtrusive a popup window. However there are times when clients, coworkers or maintainers demand for a &#034;simple&#034; popup window solution. It&#039;s for that cases that I built moopop some months ago and I&#039;m now sharing the code.


Important:
The code and samples in this page are aimed towards mootools 1.11. [...]]]></description>
			<content:encoded><![CDATA[<p>I know, it&#039;s quite ironic to call unobtrusive a popup window. However there are times when clients, coworkers or maintainers demand for a &#034;simple&#034; popup window solution. It&#039;s for that cases that I built <em>moopop</em> some months ago and I&#039;m now sharing the code.</p>
<p><span id="more-16"></span></p>
<div class="big_sign notice">
<h3>Important:</h3>
<p>The code and samples in this page are aimed towards mootools 1.11. <br />If you are using mootools 1.2 please use <a href="http://blog.gonchuki.com/archives/updating-moopop-for-mootools-12/">the new version</a></p>
</div>
<h3 class="section">the call for a simple solution</h3>
<p>What&#039;s more annoying than a popup window? Writing code to execute them.<br />
- &#034;<em>Was it with quotes or without them?</em>&#034;<br />
- &#034;<em>Should I write px to specify it&#039;s in pixels?</em>&#034;<br />
These questions and more always raise in the seldom event that we need to write some kind of code for a popup window. Even worse, we feel it&#039;s a waste of time to write spiffy code to manage the popups since we are coding an <strong>ugly</strong> feature.<br />
Fear not, as I created a simple yet elegant solution based on the <a href="http://mootools.net">mootools</a> framework (In fact, the solution is pretty much library-agnostic, changing 2-3 lines of code is all you need to adapt it.)</p>
<h3 class="section">how simple can it be?</h3>
<p>As simple as adding the <acronym title="JavaScript">JS</acronym> to your site and adding a <var>rel</var> attribute to your links.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.google.com&quot;</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;popup&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>popup google<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><a href="http://www.google.com" rel="popup">see it in action</a><br />
<var>rel=&#034;popup&#034;</var> will trigger the standard popup behavior that is to open the link in a new window, pretty much works as a <var>target=&#034;_blank&#034;</var> while keeping our code tidy, standards based and semantically meaningful.</p>
<h3 class="section">what about arbitrarily sized windows?</h3>
<p>Thanks for asking. That&#039;s where moopop shines as you can have a ton of different sized popups in your page while still having to write no javascript code. This is where site maintainers start to love you, as they can edit or add new content without having to learn the intricacies of javascript.<br />
Let&#039;s see the code:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.google.com&quot;</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;popup[600,400]&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>popup google at 600x400<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><a href="http://www.google.com" rel="popup[600,400]">see it in action</a><br />
as simple as that, we can personalize each popup window by adding the size between square brackets.</p>
<h3 class="section">documentation, requirements and download</h3>
<p>Documentation is built-in on the <acronym title="JavaScript">JS</acronym> file in case you want to take a peek in a mootools-esque style for easier understanding.<br />
There are more possible uses for this such as setting a default size for all the popups without a given size, but I will leave that to you as that&#039;s a silly feature I had to build for a lazy coworker.</p>
<p>If you are already using mootools it&#039;s pretty much sure that you have the required dependencies. If not, it requires Element.Selectors, Window.DomReady and the rest of the requirements are automatically selected by the <a href="http://mootools.net/download">mootools download builder</a></p>
<p>- Download <a href="http://sandbox.gonchuki.com/moopop/moopop.js" rel="download">moopop with documentation</a><br />
or<br />
- Download <a href="http://www.crockford.com/javascript/jsmin.html" rel="external">JSMin</a> <a href="http://sandbox.gonchuki.com/moopop/moopop_min.js" rel="download">stripped version</a></p>
<p><strong>License:</strong> <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-Share Alike 3.0</a></p>
<p><script type="text/javascript" src="http://sandbox.gonchuki.com/moopop/mootools.js"></script><br />
<script type="text/javascript" src="http://sandbox.gonchuki.com/moopop/moopop_min.js"></script></p>]]></content:encoded>
			<wfw:commentRss>http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>the web is event-driven, and so is your code</title>
		<link>http://blog.gonchuki.com/archives/the-web-is-event-driven-and-so-is-your-code/</link>
		<comments>http://blog.gonchuki.com/archives/the-web-is-event-driven-and-so-is-your-code/#comments</comments>
		<pubDate>Fri, 03 Aug 2007 05:08:52 +0000</pubDate>
		<dc:creator>gonchuki</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[patterns]]></category>

		<guid isPermaLink="false">http://blog.gonchuki.com/archives/the-web-is-event-driven-and-so-is-your-code/</guid>
		<description><![CDATA[You click on something and then something else happens, you scroll the window and something moves around.
Welcome to the event-driven web, a concept that still some developers fail to assimilate.

the event-driven web
Developers need to understand that events are (or should be) everywhere, whether on DOM elements, over the HTTP protocol on in plain old javascript [...]]]></description>
			<content:encoded><![CDATA[<p>You click on something and then something else happens, you scroll the window and something moves around.<br />
Welcome to the event-driven web, a concept that still some developers fail to assimilate.<br />
<span id="more-14"></span></p>
<h3 class="section">the event-driven web</h3>
<p>Developers need to understand that events are (or should be) everywhere, whether on <acronym title="Document Object Model">DOM</acronym> elements, <a href="http://alex.dojotoolkit.org/?p=545">over the <acronym title="HyperText Transfer Protocol">HTTP</acronym> protocol</a> on in plain old javascript objects.<br />
Now, the former two methods are well agreed and documented, yet the later is still an undiscovered world for many developers. </p>
<h3 class="section">event driven&#8230; objects?</h3>
<p>Think about it, you attach events to <acronym title="Document Object Model">DOM</acronym> elements, you respond to events pushed by the server yet you are still using a rigid callback based architecture in your objects and pseudo-Classes. <strong>That&#039;s plain wrong</strong>.<br />
let&#039;s take object foo as:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> foo <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  bar<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>baz<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009966; font-style: italic;">/* do some stuff here */</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>what the average developer does when they need to do something <em>after</em> <var>bar</var> is finished is to add another parameter into the call of <var>bar</var>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> foo <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  bar<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>baz<span style="color: #339933;">,</span> callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009966; font-style: italic;">/* do some stuff here */</span>
    callback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>If you then need another callback to do something in the middle of <var>bar</var>, soon enough before you notice you will be growing a bloated piece of code. You will notice this approach is not extensible any more when you see you need *yet another* parameter passed into your object to add the new functionality.<br />
To keep things clear, what your object/widget/Class should do is to &#034;<em>raise it&#039;s hand</em>&#034; when it needs our attention, and allow us to externally do whatever we desire on the outside, we should not pass-in callbacks to the object, we should run our callbacks once the object told us it&#039;s proper time to do so.</p>
<h3 class="section">mootools to the rescue</h3>
<p>So yes, achieving this in plain javascript is not possible as events are only part of the <acronym title="Document Object Model">DOM</acronym> elements. However there&#039;s one nifty (yet barely known) feature in <a href="http://www.mootools.net">mootools</a> that lets us extend any object with whatever set of functions we desire. For the <a href="http://www.ruby-lang.org">Ruby</a> folks, that&#039;s <a href="http://www.juixe.com/techknow/index.php/2006/06/15/mixins-in-ruby/">mixins</a> for javascript.</p>
<p>If you are a mootools lover, you may already know that <a href="http://docs.mootools.net/Class/Class.js">Classes</a> natively implement the Events interface. What you might not know is that *any* object can be mixed-in with <a href="http://docs.mootools.net/Element/Element-Event.js">Events</a> to be that event-raiser we need.<br />
So when needing to set-up callbacks in our code we could better use:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> foo <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  bar<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>baz<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009966; font-style: italic;">/* do some stuff here */</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">fireEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'onComplete'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
$extend<span style="color: #009900;">&#40;</span>foo<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">new</span> Events<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>The result of this is that our object <var>foo</var> can now raise events, ones that we can attach to at *any* point of our code by the simple means of:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">foo.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'onComplete'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;hello from foo's onComplete&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>and any time you need a new callback you can just set up another event and respond to it accordingly. Setting up an event of course, is as simple as adding a new <var>fireEvent</var> call where necessary and no more fiddling around with you perfectly built object.</p>
<h3 class="section">conclusion</h3>
<p>Events are everywhere on web development, and it&#039;s our job to use them where applicable and <strong>know</strong> how to do it. Events for regular objects help you keep your code extensible and semantically consistent with the rest of your <acronym title="Document Object Model">DOM</acronym>-based code, and that is a Good Thing.</p>
<p><strong>PS:</strong> for those out there not using mootools or not needing it&#039;s whole range of functionalities, there&#039;s also the tiny <a href="http://livepipe.net/projects/object_event/">Object.Event</a> library that basically allows you to reach the same results, with a <a href="http://www.prototypejs.org/">prototype</a>-like syntax.</p>
<p><strong>2008-07-13 Update:</strong> Having re-read this article many times, I must warn you that I do not fully agree any more to many of the points exposed at that time, so take the lecture with a grain of salt and simply imagine that the article was correctly written and explained.<br />
Still, there&#039;s a lot of potential in using custom events inside your javascript code and I encourage you to investigate more into the topic.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.gonchuki.com/archives/the-web-is-event-driven-and-so-is-your-code/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
