<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;DEIMRnc_fip7ImA9WhVTFUk.&quot;"><id>tag:blogger.com,1999:blog-30404818</id><updated>2012-02-29T14:16:27.946-06:00</updated><category term="Random" /><category term="Visual Studio" /><category term="Book Review" /><category term="Joke" /><category term="Twitter" /><category term="Riddle" /><category term="jQuery" /><category term="Amplify" /><category term="Regular Expressions" /><category term="Podcast" /><category term="Cheat Sheet" /><category term="Screencast" /><category term="Find the jQuery Bug" /><category term="MVC Contrib" /><category term="jQuery Mobile" /><category term="Extensions" /><category term="jQuery UI" /><category term="ASP.NET MVC" /><category term="CouchDB" /><category term="ASP.NET" /><category term="Quote" /><category term="Browser" /><category term="CoffeeScript" /><category term="Firefox" /><category term="Firebug" /><category term="NuGet" /><category term="Conference" /><category term="AmplifyJS" /><category term="Tools" /><category term="Humor" /><category term="Internet Explorer" /><category term="JavaScript" /><category term="Giveaway" /><category term="Unit Testing" /><category term=".NET" /><category term="HTML5" /><title>Web Dev .NET</title><subtitle type="html">Front-end Web Dev Tips, Tricks, and Tools</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>488</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/webdevnet" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="webdevnet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DUEMRnk6eip7ImA9WhVTE04.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-3704895608633866632</id><published>2012-02-27T04:14:00.000-06:00</published><updated>2012-02-27T04:14:47.712-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-27T04:14:47.712-06:00</app:edited><title>TextMate-like ⌘T &amp; ⇧⌘T in Chrome Dev Tools &amp; Other New Features</title><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://tools.google.com/dlpage/chromesxs" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-lQTREgnwTwA/T0eS0nVkD_I/AAAAAAAAMeI/vs2PUnotW3g/s1600/chrome-canary-lockup.png" /&gt;&lt;/a&gt;&lt;/div&gt;For the past year or so I've used &lt;a href="http://tools.google.com/dlpage/chromesxs"&gt;Google Chrome Canary&lt;/a&gt; as my primary web browser, however, about a month ago I temporarily switched to the stable&amp;nbsp;build&amp;nbsp;of Chrome because of some&amp;nbsp;instability&amp;nbsp;in the dev tools. I just recently switched back to Canary and was&amp;nbsp;pleasantly&amp;nbsp;surprised to see numerous new features in the dev tools there were very welcome indeed!&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;This post only covers the extreme latest in Chrome Dev Tools. There are so many more rich features that can be found. If you are interested about more helpful features you might be interested in a post I did last year entitled &lt;a href="http://www.elijahmanor.com/2011/08/7-chrome-tips-developers-designers-may.html"&gt;7 Chrome Tips Developers &amp; Designers May Not Know&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
If you are not familiar with the Canary build of Chrome, it is a extremely dev version of the browser. You should be&amp;nbsp;cautious&amp;nbsp;because it does update almost every day, but at the same time you get first in line to see all the new features. Unlike the dev or beta builds of Chrome you can actually install Canary side-by-side next to your Stable or Beta build of Chrome. This makes switching between versions very&amp;nbsp;convenient.&lt;br /&gt;
&lt;br /&gt;
The features I am about to describe are currently only available in the dev or canary builds of Chrome. If you have the Beta or Stable builds then you will not see these yet, but hopefully they'll make their way to those builds sooner than later. At least this will wet your appetite ;)&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Scripts Explorer&lt;/h3&gt;&lt;br /&gt;
A welcome change to the Scripts tab is a new Scripts Explorer (as seen in the below image). The previous way to navigate through the scripts of a webpage was to open a HUGE drop down containing tons of script files. Chrome kept reorganizing that huge&amp;nbsp;drop-down&amp;nbsp;list to make it more usable, but in the end it wasn't optimal when dealing with a site with lots of JavaScript fiels.&lt;br /&gt;
&lt;br /&gt;
The new Scripts Explorer nicely&amp;nbsp;separates&amp;nbsp;the Scripts used on the webpage from the Content Scripts used in all of the Chrome Extensions you have installed in your browser. Historically, it was slightly annoying to see all those Content Scripts alongside your main JavaScript files in that huge drop down mentioned above. Again, over time Chrome moved those Content Scripts to the bottom of that drop down instead of intermingled, but this move to the Scripts Explorer is head over heals WAY better... YAY!&lt;br /&gt;
&lt;br /&gt;
In addition, you can also choose to dock the Scripts Explorer to the left side of the dev tools (by clicking the little icon in the upper right) or have it auto-close when you are done finding what you need.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qWnhG0YA5VE/T0cVgbYDjmI/AAAAAAAAMdw/NX5IUwMhk1E/s1600/dev-tools-panel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-qWnhG0YA5VE/T0cVgbYDjmI/AAAAAAAAMdw/NX5IUwMhk1E/s1600/dev-tools-panel.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;TextMate's ⌘T "Go to File" Feature&lt;/h3&gt;&lt;br /&gt;
I don't know about you, but I'm one of those keyboard shortcut junkies, so I am always on the lookout on how to do my job without using the mouse. So, I was even more excited to see support for quickly finding a JavaScript file by only using the keyboard! Chrome call's this feature "Go to Script" and it is similar to what you may have experience in TextMate using&amp;nbsp;⌘T or maybe in Sublime Text 2 with&amp;nbsp;⌘P.&lt;br /&gt;
&lt;br /&gt;
Since&amp;nbsp;⌘T is already reserved for creating a new tab in Chrome, they have chosen&amp;nbsp;⌘O for this feature. As soon as you type&amp;nbsp;⌘O you will see the following dialog displaying JavaScript files. As you type the list will filter to only the files that match what you are typing. You can arrow up or down to narrow the selection even more and then click "enter" to open that script file.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-uZszUdnx8K4/T0cVf7F2nkI/AAAAAAAAMdo/rQPLsUR7sbo/s1600/dev-tools-cmd-t.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-uZszUdnx8K4/T0cVf7F2nkI/AAAAAAAAMdo/rQPLsUR7sbo/s1600/dev-tools-cmd-t.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;TextMate's ⇧⌘T "Go to Symbol" Feature&lt;/h3&gt;&lt;br /&gt;
Now, if the "Go to Script" feature wasn't enough, there is also the "Go to Function", which is similar to the "Go to Symbol" feature of TextMate using&amp;nbsp;⇧⌘T or&amp;nbsp;⌘R&amp;nbsp;in Sublime Text 2.&lt;br /&gt;
&lt;br /&gt;
Once you are in a JavaScript file you can press&amp;nbsp;⇧⌘O to bring up the "Go to Function" dialog. This works in a very similar way as the "Go to Script" dialog as we saw previously, but this time instead of looking for files, it helps you track down functions! Navigating through your JavaScript files to find a specific function has now become a breeze!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/--6PWmBTE7S8/T0cUa4OfBnI/AAAAAAAAMdg/fWr8kGBUHMk/s1600/dev-tools-cmd-shf-t.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/--6PWmBTE7S8/T0cUa4OfBnI/AAAAAAAAMdg/fWr8kGBUHMk/s1600/dev-tools-cmd-shf-t.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;Dock Dev Tools to the Right&lt;/h3&gt;&lt;br /&gt;
The last feature that stood out to me as really cool, was the new setting to "Dock to right". Many people these days have a wide-screen monitor and having the dev tools docked at the bottom of the screen sometimes feels a little scrunched. If I have my browser maximized there is usually tons of room to the left or right of the website I am viewing.&lt;br /&gt;
&lt;br /&gt;
Thankfully, with this new feature I can now choose to dock the dev tool to the right of my screen to give some breathing room for development!&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Note: I undrestand some like to undock the dev tools to solve this issue, but I usually tend to like keeping them docked so this new feature is very handy for me.&lt;/blockquote&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Ahx9xel8o5c/T0cViJVrn_I/AAAAAAAAMd4/ZjJEF31X5gg/s1600/dev-tools-right.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Ahx9xel8o5c/T0cViJVrn_I/AAAAAAAAMd4/ZjJEF31X5gg/s1600/dev-tools-right.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
In order to turn on this feature, you'll need to go into the Settings dialog. You can access this by clicking on the gear icon located at the bottom right of your dev tools. Once the dialog has been&amp;nbsp;launched&amp;nbsp;you should see a General section with the "Doc to right" option listed.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-F8Y8NpRMdr0/T0cVim2YnrI/AAAAAAAAMeA/MhWRi30hFzc/s1600/dev-tools-settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-F8Y8NpRMdr0/T0cVim2YnrI/AAAAAAAAMeA/MhWRi30hFzc/s1600/dev-tools-settings.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;
I find the the above JavaScript&amp;nbsp;enhancements&amp;nbsp;to the dev tools have really made navigating through scripts to be much more enjoyable. If you have noticed any other new features that I have missed please let me know. They keep cropping up all the time... which is AWESOME!&lt;br /&gt;
&lt;br /&gt;
If you have Chrome Canary then you can start using the above features right way, otherwise they should make it in a Beta or Stable build in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-3704895608633866632?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EIsKG2KcJ8XIDQBMvwjf7LDzC8U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EIsKG2KcJ8XIDQBMvwjf7LDzC8U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EIsKG2KcJ8XIDQBMvwjf7LDzC8U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EIsKG2KcJ8XIDQBMvwjf7LDzC8U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/3704895608633866632/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/02/textmate-like-t-t-in-chrome-dev-tools.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3704895608633866632?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3704895608633866632?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/02/textmate-like-t-t-in-chrome-dev-tools.html" title="TextMate-like ⌘T &amp; ⇧⌘T in Chrome Dev Tools &amp; Other New Features" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-lQTREgnwTwA/T0eS0nVkD_I/AAAAAAAAMeI/vs2PUnotW3g/s72-c/chrome-canary-lockup.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CE4AQHk5cSp7ImA9WhRaEUw.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-2360298955659483099</id><published>2012-02-13T00:01:00.000-06:00</published><updated>2012-02-13T00:02:21.729-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-13T00:02:21.729-06:00</app:edited><title>Find the jQuery Bug #4: Animations Gone Wild</title><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt;&lt;br /&gt;
In this open-ended series I'll be showcasing a snippet of buggy jQuery code that you might encounter, explain what the problem is, and then identify how you can easily resolve the issue.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;You can view other posts in this series...&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.elijahmanor.com/2011/08/find-jquery-bug-1-chicken-or-egg.html"&gt;Find the jQuery Bug #1: Chicken or the Egg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.elijahmanor.com/2012/01/find-jquery-bug-2-point-of-no-return.html"&gt;Find the jQuery Bug #2: Point of No Return&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.elijahmanor.com/2012/01/find-jquery-bug-3-give-me-truth.html"&gt;Find the jQuery Bug #3: Give Me Truth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;The Desired Feature&lt;/h3&gt;&lt;br /&gt;
We want to take the following HTML and build a simple jQuery menu that will reveal sub-menus when you hover over each item.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1777400.js?file=_snippet.html"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;h3&gt;The Buggy Code&lt;/h3&gt;&lt;br /&gt;
The following code snippet is our first attempt at solving the problem, but there is a subtle error. Do you see it?&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1777400.js?file=fiddle.js"&gt;
&lt;/script&gt;&lt;br /&gt;
If you start playing with the menu it appears that it works as intended, but as you continue to use the menu an annoying problem raises its ugly head. If you move your mouse really quick from right to left over the menu you'll see the problem :(&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="allowfullscreen" frameborder="0" src="http://jsfiddle.net/R3q6c/embedded/result,js/presentation" style="height: 250px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The Underlying Problem&lt;/h3&gt;&lt;br /&gt;
If you played with the example above you'll have noticed that if you interact with the menu really quickly side-to-side then the animations continue over and over and over again, even after you've moved off the menu completely! &lt;br /&gt;
&lt;br /&gt;
At the root of the problem is an animation queue that has gotten out of hand. jQuery keeps an internal queue to help it know what animation to run next. When you take an element and call one of the animation methods ( &lt;code&gt;.animate()&lt;/code&gt;, &lt;code&gt;.slideDown()&lt;/code&gt;, &lt;code&gt;.slideUp()&lt;/code&gt;, &lt;code&gt;.slideToggle()&lt;/code&gt;, etc... ) what really happens is that effect gets added to the default &lt;code&gt;"fx"&lt;/code&gt; animation queue that is attached to the element. As each effects completes jQuery will move on to the next effect in the queue until all animations are complete. &lt;br /&gt;
&lt;br /&gt;
The magic that we need is to somehow interrupt the queue system. Thankfully, there is an API just for that and in the next section we will show how to use it.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;A Solution&lt;/h3&gt;&lt;br /&gt;
&lt;div style="float: right; margin-bottom: 15px; margin-left: 15px;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="233" src="http://www.youtube.com/embed/Ow0lr63y4Mw" width="300"&gt;&lt;/iframe&gt;&lt;/div&gt;The solution to fix this problem is really simple and straightforward. In the words of &lt;a href="http://en.wikipedia.org/wiki/Bob_Newhart"&gt;Bob Newhart&lt;/a&gt;, we need the animation to &lt;strong&gt;STOP IT!&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Of course, we can tell our program to &lt;i&gt;STOP IT!&lt;/i&gt;, but they are usually to stubborn to heed to our warnings. Thankfully there is a method we can utilize in jQuery coincidentally called &lt;code&gt;.stop()&lt;/code&gt; which we can use to solve our animation problem!&lt;br /&gt;
&lt;br /&gt;
The following is the documentation from jQuery's website about the &lt;code&gt;.stop()&lt;/code&gt; method that we will use.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;strong&gt;.stop( [clearQueue] [, jumpToEnd] )&lt;/strong&gt;&lt;/code&gt; &lt;br /&gt;
&lt;div style="position: relative; text-align: right; top: -21px;"&gt;&lt;i&gt;version added: 1.2&lt;/i&gt;&lt;/div&gt;&lt;code&gt;clearQueue&lt;/code&gt; - A Boolean indicating whether to remove queued animation as well. Defaults to false.&lt;br /&gt;
&lt;code&gt;jumpToEnd&lt;/code&gt; - A Boolean indicating whether to complete the current animation immediately. Defaults to false.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;strong&gt;.stop( [queue] [, clearQueue] [, jumpToEnd] )&lt;/strong&gt;&lt;/code&gt; &lt;br /&gt;
&lt;div style="position: relative; text-align: right; top: -21px;"&gt;&lt;i&gt;version added: 1.7&lt;/i&gt;&lt;/div&gt;&lt;code&gt;queue&lt;/code&gt; - The name of the queue in which to stop animations.&lt;br /&gt;
&lt;code&gt;clear&lt;/code&gt; - QueueA Boolean indicating whether to remove queued animation as well. Defaults to false.&lt;br /&gt;
&lt;code&gt;jumpToEnd&lt;/code&gt; - A Boolean indicating whether to complete the current animation immediately. Defaults to false.&lt;br /&gt;
&lt;br /&gt;
--&lt;a href="http://api.jquery.com/stop/"&gt;http://api.jquery.com/stop/&lt;/a&gt;&lt;/blockquote&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;
As you see above there are 2 "overloaded" methods both with optional parameters. The important parameters that we will use to fix our code snippet are the &lt;code&gt;clearQueue&lt;/code&gt; and &lt;code&gt;jumpToEnd&lt;/code&gt; booleans. In order to get rid of the huge queue of animations on an element and complete whatever animation that was started all we need to do is pass &lt;code&gt;true&lt;/code&gt; as both parameters... &lt;code&gt;$element.stop( true, true )&lt;/code&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1777752.js?file=fiddle1.js"&gt;
&lt;/script&gt;&lt;br /&gt;
If you test out the code again below you'll notice that it works just as before, but this time the bug we found when moving our mouse quickly back and forth across the menu is now gone! &lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="allowfullscreen" frameborder="0" src="http://jsfiddle.net/F4FRk/embedded/result,js/presentation" style="height: 250px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;A Fancy Solution&lt;/h3&gt;&lt;br /&gt;
If we wanted to get fancy, we could choose to update the animation easing algorithm. An easing algorithm is a mathematical equation that defines the animation path of an effect. Wow, that was a mouth full. Let's try that again, but this time with something visual. The following demo, from jQuery UI, is a great visualization of the various easing algorithms. Click the image to launch the &lt;a href="http://jqueryui.com/demos/effect/easing.html"&gt;jQuery UI Easing Demo&lt;/a&gt; and then click on each square to view the easing in action. I think my favorite is "easeOutBounce" ;)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://jqueryui.com/demos/effect/easing.html" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Odnpy97PAW4/TzS8BybJaOI/AAAAAAAAMV4/Szo0srpb5dk/s1600/Screen+Shot+2012-02-10+at+12.37.59+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
With these easing options in mind, let's update our example above and use "easeOutBounce" instead of the default "swing" option that is default in jQuery. &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: "The only easing implementations in the jQuery library are the default, called swing, and one that progresses at a constant pace, called linear." &lt;br /&gt;
&lt;br /&gt;
-- &lt;a href="http://api.jquery.com/slideDown"&gt;http://api.jquery.com/slideDown&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1777752.js?file=fiddle2.js"&gt;
&lt;/script&gt;&lt;br /&gt;
You might notice that I also added some other parameters to the &lt;code&gt;.slideDown()&lt;/code&gt; and &lt;code&gt;.slideUp()&lt;/code&gt; methods. All of the parameters are optional, but if we want we can provide our own values such as a &lt;code&gt;duration&lt;/code&gt;, &lt;code&gt;easing&lt;/code&gt; algorithm, and a &lt;code&gt;callback&lt;/code&gt; to invoke when the animation is complete. In the code above, I trigger a custom event depending if the sub-menu was &lt;code&gt;opened&lt;/code&gt; or &lt;code&gt;closed&lt;/code&gt; and then I delegate to those events using the &lt;code&gt;.on()&lt;/code&gt; method on line 19.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;strong&gt;.slideDown( [duration] [, easing] [, callback] )&lt;/strong&gt;&lt;/code&gt; &lt;div style="position: relative; text-align: right; top: -21px;"&gt;&lt;i&gt;version added: 1.4.3&lt;/i&gt;&lt;/div&gt;&lt;code&gt;&lt;strong&gt;.slideUp( [duration] [, easing] [, callback] )&lt;/strong&gt;&lt;/code&gt; &lt;div style="position: relative; text-align: right; top: -21px;"&gt;&lt;i&gt;version added: 1.4.3&lt;/i&gt;&lt;/div&gt;&lt;code&gt;duration&lt;/code&gt; - A string or number determining how long the animation will run.&lt;br /&gt;
&lt;code&gt;easing&lt;/code&gt; - A string indicating which easing function to use for the transition.&lt;br /&gt;
&lt;code&gt;callback&lt;/code&gt; - A function to call once the animation is complete.&lt;br /&gt;
&lt;br /&gt;
-- &lt;a href="http://api.jquery.com/slideDown/"&gt;http://api.jquery.com/slideDown/&lt;/a&gt; &amp; &lt;a href="http://api.jquery.com/slideUp/"&gt;http://api.jquery.com/slideUp/&lt;/a&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Now you can test the changes we made. The effect may be too adventurous for most production business web applications, but the one I chose is just one of the many easing algorithms provided by jQuery UI that you can pick from. Also, if you are a math wizard you can come up with your algorithm!&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="allowfullscreen" frameborder="0" src="http://jsfiddle.net/xtD7j/embedded/result,js/presentation" style="height: 250px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Refactoring the Code&lt;/h3&gt;&lt;br /&gt;
If you are anything like me you probably noticed a &lt;a href="http://www.codinghorror.com/blog/2006/05/code-smells.html"&gt;code smell&lt;/a&gt;. Much of the code from the previous examples looks very redundant. Let's take a stab at refactoring the code somewhat to reduce the "duplicated code" smell and made the code &lt;a href="http://www.artima.com/intv/dry.html"&gt;DRY (don't repeat yourself)&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;If you look through your vast code base, And notice code repeated here and there.&lt;br /&gt;
You might consider refactoring soon, Or you'll experience maintenance despair!&lt;/blockquote&gt;&lt;br /&gt;
Previously we were passing two functions to the &lt;code&gt;.hover()&lt;/code&gt; method. The 1st function parameter was to handle &lt;code&gt;mouseover&lt;/code&gt; events and the other was to handle &lt;code&gt;mouseout&lt;/code&gt; events. Thankfully, there is another "overloaded" version of &lt;code&gt;.hover()&lt;/code&gt; that takes just 1 function parameter. This 1 function will be invoked on both &lt;code&gt;mouseover&lt;/code&gt; events and &lt;code&gt;mouseout&lt;/code&gt; events! &lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1777752.js?file=fiddle3.js"&gt;&lt;/script&gt;&lt;br /&gt;
You may also notice that we are using a different method to actually perform the sub-menu animation. jQuery includes a &lt;code&gt;.slideToggle()&lt;/code&gt; method that will either &lt;code&gt;.slideDown()&lt;/code&gt; or &lt;code&gt;.slideUp()&lt;/code&gt; depending on the state of the element. &lt;br /&gt;
&lt;br /&gt;
The last thing to take into consideration is how to know which custom event to trigger. Previously I knew which event to trigger because &lt;code&gt;opened&lt;/code&gt; was associated with &lt;code&gt;.slideDown()&lt;/code&gt; and &lt;code&gt;closed&lt;/code&gt; was associated with &lt;code&gt;.slideUp()&lt;/code&gt;, but what about now? Thankfully that is easily solved by looking at the &lt;code&gt;event&lt;/code&gt; object passed to the &lt;code&gt;hover&lt;/code&gt; event handler. The &lt;code&gt;event&lt;/code&gt; object has a &lt;code&gt;type&lt;/code&gt; property which tells what type of event was originally fired. So, I can do something like this... &lt;code&gt;e.type === "mouseover" ? "opened" : "closed"&lt;/code&gt; -- &lt;a href="http://jsfiddle.net/ujsfH/"&gt;http://jsfiddle.net/ujsfH/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;
The key concept to remember here is that jQuery has an internal animation queue that you should be aware of. If you need to clear out that queue you can use the &lt;code&gt;.stop()&lt;/code&gt; method. Also, you can modify the duration of animation, change the animation easing algorithm, and also respond to an event when the animation is complete.&lt;br /&gt;
&lt;br /&gt;
Things we didn't cover in this post are how to create your own queue, how to create your own easing algorithm, how to modify the default animation duration, and several other concerns.&lt;br /&gt;
&lt;br /&gt;
Until next time...&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;NOTE: The CSS I used as the base for the example menu above is a modified version from a &lt;a href="http://www.kriesi.at/archives/create-a-multilevel-dropdown-menu-with-css-and-improve-it-via-jquery"&gt;blog post&lt;/a&gt; on &lt;a href="http://twitter.com/Kriesi"&gt;@Kriesi's&lt;/a&gt; website. I removed the hover styles and replaced his jQuery code with mine for this &lt;a href="http://www.elijahmanor.com/search/label/Find%20the%20jQuery%20Bug"&gt;Find the jQuery Bug&lt;/a&gt; post.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-2360298955659483099?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aA55Qs5lz3vNcSD3VCBFppuqEQw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aA55Qs5lz3vNcSD3VCBFppuqEQw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aA55Qs5lz3vNcSD3VCBFppuqEQw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aA55Qs5lz3vNcSD3VCBFppuqEQw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/2360298955659483099/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/02/find-jquery-bug-4-animations-gone-wild.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/2360298955659483099?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/2360298955659483099?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/02/find-jquery-bug-4-animations-gone-wild.html" title="Find the jQuery Bug #4: Animations Gone Wild" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/Ow0lr63y4Mw/default.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0IGQn4_cCp7ImA9WhRbFkU.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-7863784942380961556</id><published>2012-02-08T00:05:00.002-06:00</published><updated>2012-02-08T00:12:03.048-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-08T00:12:03.048-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="CoffeeScript" /><category scheme="http://www.blogger.com/atom/ns#" term="Regular Expressions" /><title>Regular Expressions in CoffeeScript are Awesome</title><content type="html">Let's face it, &lt;a href="https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions"&gt;regular expressions&lt;/a&gt; aren't for everyone. It takes a special breed of developer to actually enjoy writing regular expressions. Although I enjoy them, the developer that comes after me may find that they are cryptic and hard to read. And yes, sometimes it takes me a little bit to decipher through an old regular expression that I wrote a while ago.&lt;br /&gt;
&lt;br /&gt;
Take for example, the following regular expression. Can you tell what it is doing? If so... then great, but what about the developers you work with?&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1765839.js?file=emailPattern.js"&gt;&lt;/script&gt;&lt;br /&gt;
One of the very cool things I like about &lt;a href="http://coffeescript.org/"&gt;CoffeeScript&lt;/a&gt; is that you can &lt;a href="http://coffeescript.org/#regexes"&gt;annotate your regular expressions&lt;/a&gt;! The following snippet of CoffeeScript compiles down to the equivalent JavaScript as seen in the above code sample. Yay ;) &lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1765839.js?file=emailPattern.coffee"&gt;&lt;/script&gt;&lt;br /&gt;
Which code sample would you rather maintain? And more importantly which one would your co-worker be more likely to understand? &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;NOTE: The above email regular expression is very naive in it's logic. I based the above snippet from a Nettuts+ post entitled, &lt;a href="http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/"&gt;8 Regular Expressions You Should Know&lt;/a&gt;. There are much more comprehensive email regular expressions available on the internet, but I used the above one to show the value of annotation.&lt;/blockquote&gt;&lt;br /&gt;
As a side note, some tools that I find helpful are Grant Skinner's &lt;a href="http://gskinner.com/RegExr/"&gt;Online RegExr Tool&lt;/a&gt; and I sometimes get inspiration for regular expressions at &lt;a href="http://regexlib.com/DisplayPatterns.aspx"&gt;RegExLib.com&lt;/a&gt;. What tools or resources do you use for regular expressions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-7863784942380961556?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_V4GUuNNFX-SRR1qgHmH4070CPg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_V4GUuNNFX-SRR1qgHmH4070CPg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_V4GUuNNFX-SRR1qgHmH4070CPg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_V4GUuNNFX-SRR1qgHmH4070CPg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/7863784942380961556/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/02/regular-expressions-in-coffeescript-are.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/7863784942380961556?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/7863784942380961556?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/02/regular-expressions-in-coffeescript-are.html" title="Regular Expressions in CoffeeScript are Awesome" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUECQnY6eyp7ImA9WhRbGEQ.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-3131166255414772837</id><published>2012-02-06T01:00:00.002-06:00</published><updated>2012-02-10T11:07:43.813-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-10T11:07:43.813-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jQuery" /><title>Differences Between jQuery .bind() vs .live() vs .delegate() vs .on()</title><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt;&lt;br /&gt;
I've seen quite a bit of confusion from developers about what the real differences are between the jQuery &lt;code&gt;.bind()&lt;/code&gt;, &lt;code&gt;.live()&lt;/code&gt;, &lt;code&gt;.delegate()&lt;/code&gt;, and &lt;code&gt;.on()&lt;/code&gt; methods and when they should be used.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;If you want, you can jump to the &lt;a href="#tldr"&gt;TL;DR&lt;/a&gt; section and get a high-level overview what this article is about you can jump to the end for the &lt;a href="#tldr"&gt;Conclusion&lt;/a&gt;.&lt;/blockquote&gt;&lt;br /&gt;
Before we dive into the ins and outs of these methods, let's start with some common HTML markup that we'll be using as we write sample jQuery code.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1749717.js?file=_snippet.html"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;h3&gt;Using the Bind Method&lt;/h3&gt;&lt;br /&gt;
The &lt;code&gt;.bind()&lt;/code&gt; method registers the type of event and an event handler directly to the DOM element in question. This method has been around the longest and in its day it was a nice abstraction around the various cross-browser issues that existed. This method is still very handy when wiring-up event handlers, but there are various performance concerns as are listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1749717.js?file=bind.js"&gt;&lt;/script&gt;&lt;br /&gt;
The &lt;code&gt;.bind()&lt;/code&gt; method will attach the event handler to all of the anchors that are matched! That is not good. Not only is that expensive to implicitly iterate over all of those items to attach an event handler, but it is also wasteful since it is the same event handler over and over again.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pros&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;This methods works across various browser implementations.&lt;/li&gt;
&lt;li&gt;It is pretty easy and quick to wire-up event handlers.&lt;/li&gt;
&lt;li&gt;The shorthand methods (&lt;code&gt;.click()&lt;/code&gt;, &lt;code&gt;.hover()&lt;/code&gt;, etc...) make it even easier to wire-up event handlers.&lt;/li&gt;
&lt;li&gt;For a simple ID selector, using &lt;code&gt;.bind()&lt;/code&gt; not only wires-up quickly, but also when the event fires the event handler is invoked almost immediately.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Cons&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;The method attaches the same event handler to every matched element in the selection.&lt;/li&gt;
&lt;li&gt;It doesn't work for elements added dynamically that matches the same selector.&lt;/li&gt;
&lt;li&gt;There are performance concerns when dealing with a large selection.&lt;/li&gt;
&lt;li&gt;The attachment is done upfront which can have performance issues on page load.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;Using the Live Method&lt;/h3&gt;&lt;br /&gt;
The &lt;code&gt;.live()&lt;/code&gt; method uses the concept of event delegation to perform its so called "magic". The way you call &lt;code&gt;.live()&lt;/code&gt; looks just like how you might call &lt;code&gt;.bind()&lt;/code&gt;, which is very convenient. However, under the covers this method works much different. The &lt;code&gt;.live&lt;/code&gt; method attaches the event handler to the root level document along with the associated selector and event information. By registering this information on the document it allows one event handler to be used for all events that have bubbled (a.k.a. delegated, propagated) up to it. Once an event has bubbled up to the document jQuery looks at the selector/event metadata to determine which handler it should invoke, if any. This extra work has some impact on performance at the point of user interaction, but the initial register process is fairly speedy. &lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1749717.js?file=live.js"&gt;&lt;/script&gt;&lt;br /&gt;
The good thing about this code as compared to the &lt;code&gt;.bind()&lt;/code&gt; example above is that it is only attaching the event handler once to the document instead of multiple times. This not only is faster, but less wasteful, however, there are many problems with using this method and they are outlined below.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pros&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;There is only one event handler registered instead of the numerous event handlers that could have been registered with the &lt;code&gt;.bind()&lt;/code&gt; method.&lt;/li&gt;
&lt;li&gt;The upgrade path from &lt;code&gt;.bind()&lt;/code&gt; to &lt;code&gt;.live()&lt;/code&gt; is very small. All you have to do is replace "bind" to "live".&lt;/li&gt;
&lt;li&gt;Elements dynamically added to the DOM that match the selector magically work because the real information was registered on the document.&lt;/li&gt;
&lt;li&gt;You can wire-up event handlers before the document ready event helping you utilize possibly unused time.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Cons&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;This method is deprecated as of jQuery 1.7 and you should start phasing out its use in your code.&lt;/li&gt;
&lt;li&gt;Chaining is not properly supported using this method.&lt;/li&gt;
&lt;li&gt;The selection that is made is basically thrown away since it is only used to register the event handler on the document.&lt;/li&gt;
&lt;li&gt;Using event.stopPropagation() is no longer helpful because the event has already delegated all the way up to the document.&lt;/li&gt;
&lt;li&gt;Since all selector/event information is attached to the document once an event does occur jQuery has match through its large metadata store using the &lt;code&gt;matchesSelector&lt;/code&gt; method to determine which event handler to invoke, if any.&lt;/li&gt;
&lt;li&gt;Your events always delegate all the way up to the document. This can affect performance if your DOM is deep.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;Using the Delegate Method&lt;/h3&gt;&lt;br /&gt;
The &lt;code&gt;.delegate()&lt;/code&gt; method behaves in a similar fashion to the &lt;code&gt;.live()&lt;/code&gt; method, but instead of attaching the selector/event information to the document, you can choose where it is anchored. Just like the &lt;code&gt;.live()&lt;/code&gt; method, this technique uses event delegation to work correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;If you skipped over the explanation of the &lt;code&gt;.live()&lt;/code&gt; method you might want to go back up and read it as I described some of the internal logic that happen.&lt;/blockquote&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1749717.js?file=delegate.js"&gt;&lt;/script&gt;&lt;br /&gt;
The &lt;code&gt;.delegate()&lt;/code&gt; method is very powerful. The above code will attach the event handler to the unordered list ("#members") along with the selector/event information. This is much more efficient than the &lt;code&gt;.live()&lt;/code&gt; method that always attaches the information to the document. In addition a lot of other problematic issues were resolved by introducing the &lt;code&gt;.delegate()&lt;/code&gt; method. See the following outline for a detailed list.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pros&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;You have the option of choosing where to attach the selector/event information.&lt;/li&gt;
&lt;li&gt;The selection isn't actually performed up front, but is only used to register onto the root element.&lt;/li&gt;
&lt;li&gt;Chaining is supported correctly.&lt;/li&gt;
&lt;li&gt;jQuery still needs to iterate over the selector/event data to determine a match, but since you can choose where the root is the amount of data to sort through can be much smaller.&lt;/li&gt;
&lt;li&gt;Since this technique uses event delegation, it can work with dynamically added elements to the DOM where the selectors match.&lt;/li&gt;
&lt;li&gt;As long as you delegate against the document you can also wire-up event handlers before the document ready event.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Cons&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Changing from a &lt;code&gt;.bind()&lt;/code&gt; to a &lt;code&gt;.delegate()&lt;/code&gt; method isn't as straight forward.&lt;/li&gt;
&lt;li&gt;There is still the concern of jQuery having to figure out, using the &lt;code&gt;matchesSelector&lt;/code&gt; method, which event handler to invoke based on the selector/event information stored at the root element. However, the metadata stored at the root element should be considerably smaller compared to using the &lt;code&gt;.live()&lt;/code&gt; method.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;Using the On Method&lt;/h3&gt;&lt;br /&gt;
Did you know that the jQuery &lt;code&gt;.bind()&lt;/code&gt;, &lt;code&gt;.live()&lt;/code&gt;, and &lt;code&gt;.delegate()&lt;/code&gt; methods are just one line pass throughs to the new jQuery 1.7 &lt;code&gt;.on()&lt;/code&gt; method? The same is true of the &lt;code&gt;.unbind()&lt;/code&gt;, &lt;code&gt;.die()&lt;/code&gt;, and &lt;code&gt;.undelegate()&lt;/code&gt; methods. The following code snippet is taken from the &lt;a href="https://github.com/jquery/jquery/blob/633ca9c1610c49dbb780e565f4f1202e1fe20fae/src/event.js#L956"&gt;jQuery 1.7.1 codebase in GitHub&lt;/a&gt;...&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1749717.js?file=jquery-1.7.1.js"&gt;&lt;/script&gt;&lt;br /&gt;
With that in mind, the usage of the new &lt;code&gt;.on()&lt;/code&gt; method looks something like the following...&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1749717.js?file=on.js"&gt;&lt;/script&gt;&lt;br /&gt;
You'll notice that depending how I call the &lt;code&gt;.on()&lt;/code&gt; method changes how it performs. You can consider the &lt;code&gt;.on()&lt;/code&gt; method as being "overloaded" with different signatures, which in turn changes how the event binding is wired-up. The &lt;code&gt;.on&lt;/code&gt; method bring a lot of consistency to the API and hopefully makes things slightly less confusing.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pros&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Brings uniformity to the various event binding methods.&lt;/li&gt;
&lt;li&gt;Simplifies the jQuery code base and removes one level of redirection since the &lt;code&gt;.bind()&lt;/code&gt;, &lt;code&gt;.live()&lt;/code&gt;, and &lt;code&gt;.delegate()&lt;/code&gt; call this method under the covers.&lt;/li&gt;
&lt;li&gt;Still provides all the goodness of the &lt;code&gt;.delegate()&lt;/code&gt; method, while still providing support for the &lt;code&gt;.bind()&lt;/code&gt; method if you need it.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Cons&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Brings confusion because the behavior changes based on how you call the method.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3 id="tldr"&gt;Conclusion (tl;dr)&lt;/h3&gt;&lt;br /&gt;
If you have been confused about the various different types of event binding methods then don't worry, there has been a lot of history and evolvement in the API over time. There are many people that view these methods as magic, but once you uncover some of how they work it will help you understand how to better ode inside of your projects. &lt;br /&gt;
&lt;br /&gt;
The biggest take aways from this article are that...&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Using the &lt;code&gt;.bind()&lt;/code&gt; method is very costly as it attaches the same event handler to every item matched in your selector.&lt;/li&gt;
&lt;li&gt;You should stop using the &lt;code&gt;.live()&lt;/code&gt; method as it is deprecated and has a lot of problems with it.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;.delegate()&lt;/code&gt; method gives a lot of "bang for your buck" when dealing with performance and reacting to dynamically added elements.&lt;/li&gt;
&lt;li&gt;That the new &lt;code&gt;.on()&lt;/code&gt; method is mostly syntax sugar that can mimic &lt;code&gt;.bind()&lt;/code&gt;, &lt;code&gt;.live()&lt;/code&gt;, or &lt;code&gt;.delegate()&lt;/code&gt; depending on how you call it.&lt;/code&gt; &lt;br /&gt;
&lt;li&gt;The new direction is to use the new &lt;code&gt;.on&lt;/code&gt; method. Get familiar with the syntax and start using it on all your jQuery 1.7+ projects.&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/ul&gt;Were there any pros or cons that you would have added to the above lists? Have you found yourself using the &lt;code&gt;.delegate&lt;/code&gt; method more recently? What are you thoughts on the new &lt;code&gt;.on&lt;/code&gt; method? Leave your thoughts in the comments. Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-3131166255414772837?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2Ssgy7n-Xn--PioKEQGySMUP-vA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Ssgy7n-Xn--PioKEQGySMUP-vA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2Ssgy7n-Xn--PioKEQGySMUP-vA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Ssgy7n-Xn--PioKEQGySMUP-vA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/3131166255414772837/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3131166255414772837?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3131166255414772837?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html" title="Differences Between jQuery .bind() vs .live() vs .delegate() vs .on()" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkMMSHk7eCp7ImA9WhRbEEo.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-1888672182263177278</id><published>2012-01-31T00:00:00.000-06:00</published><updated>2012-01-31T23:34:49.700-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-31T23:34:49.700-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jQuery" /><title>How to Access jQuery's Internal Data</title><content type="html">As you may or may not be aware as of jQuery 1.7 the whole event system was rewritten from the ground up. The codebase is much faster and with the new &lt;code&gt;.on()&lt;/code&gt; method there is a lot of uniformity to wiring up event handlers. &lt;br /&gt;
&lt;br /&gt;
One used to be able to access the internal &lt;code&gt;events&lt;/code&gt; data and investiate what events are registered on any given element, but recently this internal information has been hidden based on the following ticket...&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"Ticket #8921: jQuery Private Data Should Stay Private&lt;br /&gt;
&lt;br /&gt;
It seems that the "private" data is ALWAYS stored on the .data(jQuery.expando) - For "objects" where the deletion of the object should also delete its caches this makes some sense.&lt;br /&gt;
&lt;br /&gt;
In the realm of nodes however, I think we should store these "private" members in a separate (private) cache so that they don't pollute the object returned by $.fn.data()" &lt;br /&gt;
&lt;br /&gt;
--&lt;a href="http://bugs.jquery.com/ticket/8921"&gt;http://bugs.jquery.com/ticket/8921&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
Although I agree with the above change to hide the internal data, I have found having access to this information can be helpful for debugging and unit testing.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="twitter-tweet"&gt;What was the new way of getting the internal jquery event object in jQuery 1.7? /cc @&lt;a href="https://twitter.com/DamianEdwards"&gt;DamianEdwards&lt;/a&gt; @&lt;a href="https://twitter.com/elijahmanor"&gt;elijahmanor&lt;/a&gt;&lt;br /&gt;
— Aaron Powell (@slace) &lt;a data-datetime="2012-01-30T03:10:00+00:00" href="https://twitter.com/slace/status/163821232440090624"&gt;January 30, 2012&lt;/a&gt;&lt;/blockquote&gt;&lt;script charset="utf-8" src="//platform.twitter.com/widgets.js"&gt;
&lt;/script&gt;&lt;br /&gt;
Thankfully, if you still need access to the internal data it is still accessible, however, you need to use a method that isn't officially documented... which means that you should be cautious about using it. I would encourage you to not use the undocumented &lt;code&gt;._data()&lt;/code&gt; method in production code.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1709046.js?file=fiddle.js"&gt;&lt;/script&gt;&lt;br /&gt;
You can &lt;a href="http://jsbin.com/gist/1709046#javascript,html,live"&gt;view, run, and edit&lt;/a&gt; the above code sample from JSBin.&lt;br /&gt;
&lt;br /&gt;
On the plus side, if you access the old &lt;code&gt;.data()&lt;/code&gt; method with &lt;code&gt;"events"&lt;/code&gt; as a parameter that will retrieve the internal data containing events and event handlers. &lt;br /&gt;
&lt;br /&gt;
As a side note, if you are looking for events attached using the &lt;code&gt;.live()&lt;/code&gt; or &lt;code&gt;.delegate()&lt;/code&gt; methods then you will need to look at either the &lt;code&gt;document&lt;/code&gt; element or whatever element you delegated against.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Update: Rick Waldron informed me on &lt;a href="https://twitter.com/rwaldron/status/164575242952515585"&gt;twitter&lt;/a&gt; that the jQuery Core team plans on creating a supported plugin to access the internal data that jQuery maintains. This would be a much better solution than using the above undocumented &lt;code&gt;._data()&lt;/code&gt; method because undocumented methods are also unsupported methods ;) I only use the &lt;code&gt;._data()&lt;/code&gt; method for debugging or testing. You should try to avoid using it in any of your production code for this reason.&lt;/i&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-1888672182263177278?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RgWTBKeQ_sVug5GA3Hq8-3oD90M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RgWTBKeQ_sVug5GA3Hq8-3oD90M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RgWTBKeQ_sVug5GA3Hq8-3oD90M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RgWTBKeQ_sVug5GA3Hq8-3oD90M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/1888672182263177278/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/01/how-to-access-jquerys-internal-data.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/1888672182263177278?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/1888672182263177278?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/01/how-to-access-jquerys-internal-data.html" title="How to Access jQuery's Internal Data" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DkcDR3g5fyp7ImA9WhRUGU0.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-898438444193075365</id><published>2012-01-30T00:14:00.000-06:00</published><updated>2012-01-30T00:14:36.627-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-30T00:14:36.627-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="Find the jQuery Bug" /><category scheme="http://www.blogger.com/atom/ns#" term="jQuery" /><title>Find the jQuery Bug #3: Give Me Truth</title><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt;&lt;br /&gt;
In this open-ended series I'll be showcasing a snippet of buggy jQuery code that you might encounter, explain what the problem is, and then identify how you can easily resolve the issue.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;You can view other posts in this series...&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.elijahmanor.com/2011/08/find-jquery-bug-1-chicken-or-egg.html"&gt;Find the jQuery Bug #1: Chicken or the Egg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.elijahmanor.com/2012/01/find-jquery-bug-2-point-of-no-return.html"&gt;Find the jQuery Bug #2: Point of No Return&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;The Desired Feature&lt;/h3&gt;&lt;br /&gt;
We want to take the following HTML &lt;code&gt;div&lt;/code&gt; and build a simple &lt;code&gt;popover&lt;/code&gt; module that uses the jQuery UI Dialog widget. &lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1702566.js?file=_snippet.html"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;h3&gt;The Buggy Code&lt;/h3&gt;&lt;br /&gt;
The intent of the following code snippet is to verify that the &lt;code&gt;div&lt;/code&gt; being used in the modal dialog exists in the DOM and that it has not been already initialized. We have an &lt;code&gt;init&lt;/code&gt; method that should initialize the widget and then an &lt;code&gt;open&lt;/code&gt; method that should launch the dialog. The code snippet has some problems. Do you see them?&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1702566.js?file=fiddle.js"&gt;&lt;/script&gt;&lt;br /&gt;
You can &lt;a href="http://jsbin.com/gist/1702566#javascript,html"&gt;view, run, and edit&lt;/a&gt; the above code sample from JSBin.&lt;br /&gt;
&lt;br /&gt;
When we run the code, things seem pretty much like what we expected. The widget seems to have been initialized and then opens as expected. We don't actually see the error visually, but there is a problem hidden in the &lt;code&gt;init()&lt;/code&gt; code. If you debug through the code you'll notice something odd when calling &lt;code&gt;init()&lt;/code&gt; again. We put in checks to verify for the existence of the DOM element and that it hasn't been initialized yet, right? Well, that is where the problem lies. Do you see the problem now?&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The Underlying Problem&lt;/h3&gt;&lt;br /&gt;
At the root of the problem is how we are testing for truth! Both the ways we are checking for existence and initial state are flawed.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"&lt;code&gt;jQuery( selector [, context] )&lt;/code&gt; Returns: jQuery&lt;br /&gt;
Description: Accepts a string containing a CSS selector which is then used to match a set of elements." --&lt;a href="http://api.jquery.com/jquery" target="_blank"&gt;http://api.jquery.com/jquery&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
The check for existence is incorrect, because just checking the result of &lt;code&gt;$( "dialog-modal" )&lt;/code&gt; doesn't get you anywhere. Where does it get you? It always evaluates as &lt;code&gt;true&lt;/code&gt; because a call to &lt;code&gt;$( selector )&lt;/code&gt; returns the jQuery object and based on our &lt;a href="http://james.padolsey.com/javascript/truthy-falsey/"&gt;truthy/falsey rules&lt;/a&gt; an object is always &lt;code&gt;truthy&lt;/code&gt;! What does this mean? Well, it means the code to initialize the DOM element would execute even if it didn't exist at all!&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"&lt;code&gt;.not( selector )&lt;/code&gt; Returns: jQuery&lt;br /&gt;
Description: Remove elements from the set of matched elements." --&lt;a href="http://api.jquery.com/not" target="_blank"&gt;http://api.jquery.com/not&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
In a similar fashion the check we were making for the initial state of the DOM element is incorrect. The intent was to check if the element did not have a particular class (&lt;code&gt;.ui-dialog-content&lt;/code&gt;), which is added by jQuery UI when it initializes the dialog widget. If we take a look at the documentation for the &lt;code&gt;.not()&lt;/code&gt; method we'll see that it too returns the jQuery object! The purpose of the method is to filter down the matches by removing elements that match the selector provided. So, we run into the same problem as above where we are always evaluating as &lt;code&gt;truthy&lt;/code&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;A Solution&lt;/h3&gt;&lt;br /&gt;
The solution to fix these problems are really simple and straightforward. All you really need to do is to check how many items where matched by a jQuery selection and to use the &lt;code&gt;.is()&lt;/code&gt; method instead of the &lt;code&gt;.not()&lt;/code&gt; method.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1702743.js?file=fiddle.js"&gt;&lt;/script&gt;&lt;br /&gt;
You can &lt;a href="http://jsbin.com/gist/1702743#javascript,html,live"&gt;view, run, and edit&lt;/a&gt; the above code sample from JSBin.&lt;br /&gt;
&lt;br /&gt;
If you run the above code again you'll notice that the &lt;code&gt;console.log&lt;/code&gt; message only shows up the first time the &lt;code&gt;.init()&lt;/code&gt; method is called.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;
The key concept to remember here is to realize that testing against the jQuery object will always evaluate as &lt;code&gt;true&lt;/code&gt;. As shown above it is easy to adjust your code accordingly. &lt;br /&gt;
&lt;br /&gt;
There are other more advanced techniques that can be used for initialization as well. I'd encourage you to look into Doug Neiner's (&lt;a href="http://twitter.com/dougneiner"&gt;@dougneiner&lt;/a&gt;) Contextual jQuery series (&lt;a href="http://events.jquery.org/2010/boston/video/video.php?talk=doug-neiner"&gt;Part 1&lt;/a&gt; and &lt;a href="http://speakerdeck.com/u/dougneiner/p/contextual-jquery-in-practice"&gt;Part 2&lt;/a&gt;) that he gave at the jQuery Boston 2010 and 2011 Conferences. In particular he gave some really interesting just-in-time initialization techniques in the 2nd talk. I highly encourage you viewing these if you haven't already.&lt;br /&gt;
&lt;br /&gt;
Until next time...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-898438444193075365?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LF5Q86fXiQIHz_zYJpSCcta2eZw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LF5Q86fXiQIHz_zYJpSCcta2eZw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LF5Q86fXiQIHz_zYJpSCcta2eZw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LF5Q86fXiQIHz_zYJpSCcta2eZw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/898438444193075365/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/01/find-jquery-bug-3-give-me-truth.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/898438444193075365?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/898438444193075365?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/01/find-jquery-bug-3-give-me-truth.html" title="Find the jQuery Bug #3: Give Me Truth" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0EARnk-eCp7ImA9WhRUFko.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-7447753122794388716</id><published>2012-01-27T00:09:00.000-06:00</published><updated>2012-01-27T07:40:47.750-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-27T07:40:47.750-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="Humor" /><title>Having Fun with JavaScript and Skype Emoticons</title><content type="html">I was chatting with Jim Cowart (&lt;a href="http://twitter.com/ifandelse"&gt;@ifandelse&lt;/a&gt;) on Skype today about jQuery. He pasted in a snippet of code and Skype translated part of it into one of it's emoticons. He almost immediately updated the chat message to fix the issue, but it got me starting to think... and that can be very dangerous.&lt;br /&gt;
&lt;br /&gt;
I thought to myself that it would be fun to create a program that intentionally utilize Skype emoticons. The following screenshot is the result of the program I put together. It is a restaurant where you can listen, eat, and drink ;)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-ahfSeZKBxKs/TyKnzUcw1gI/AAAAAAAAMEU/HcXARGOVis8/s1600/Screen+Shot+2012-01-27+at+7.31.14+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-ahfSeZKBxKs/TyKnzUcw1gI/AAAAAAAAMEU/HcXARGOVis8/s1600/Screen+Shot+2012-01-27+at+7.31.14+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
As you can tell, it is a silly little program. The code for the above screenshot can be found below. Some of the icons I used are &lt;a href="http://www.hiddenskypeemoticons.com/"&gt;secret emoticons&lt;/a&gt; that you can lookup.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1687251.js?file=skype-emoticon-restaurant.js"&gt;
&lt;/script&gt;&lt;br /&gt;
If you'd like to come up with your own Skype-enabled JavaScript program, then I'd like to see it. Share it in the comments. Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-7447753122794388716?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZX_jJoGYsD5jtusR2CbDHXsAjYY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZX_jJoGYsD5jtusR2CbDHXsAjYY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZX_jJoGYsD5jtusR2CbDHXsAjYY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZX_jJoGYsD5jtusR2CbDHXsAjYY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/7447753122794388716/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/01/skype-enabled-javascript-restaurant.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/7447753122794388716?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/7447753122794388716?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/01/skype-enabled-javascript-restaurant.html" title="Having Fun with JavaScript and Skype Emoticons" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-ahfSeZKBxKs/TyKnzUcw1gI/AAAAAAAAMEU/HcXARGOVis8/s72-c/Screen+Shot+2012-01-27+at+7.31.14+AM.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkYGSXs6eip7ImA9WhRUGU0.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-532718932635099623</id><published>2012-01-25T08:09:00.000-06:00</published><updated>2012-01-30T00:15:28.512-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-30T00:15:28.512-06:00</app:edited><title>Find the jQuery Bug #2: Point of No Return</title><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt;&lt;br /&gt;
In this open-ended series I'll be showcasing a snippet of buggy jQuery code that you might encounter, explain what the problem is, and then identify how you can easily resolve the issue.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;You can view my other post in this series...&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.elijahmanor.com/2011/08/find-jquery-bug-1-chicken-or-egg.html"&gt;Find the jQuery Bug #1: Chicken or the Egg&lt;/a&gt;&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;The Desired Feature&lt;/h3&gt;&lt;br /&gt;
We want to take the following HTML unordered list and build a JavaScript function that will determine if a specific value is present.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1670182.js?file=_snippet.html"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;h3&gt;The Buggy Code&lt;/h3&gt;&lt;br /&gt;
The following code snippets is our first attempt at solving the problem, but there is a subtle error. Do you see it?&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1670182.js?file=fiddle.js"&gt;&lt;/script&gt;&lt;br /&gt;
You can &lt;a href="http://jsbin.com/gist/1670182#javascript,html,live"&gt;view, run, and edit&lt;/a&gt; the above code sample from JSBin.&lt;br /&gt;
&lt;br /&gt;
The results that we expected were &lt;code&gt;false, true, true, true, false&lt;/code&gt;, but instead the output in the console is &lt;code&gt;false, false, false, false, false&lt;/code&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The Underlying Problem&lt;/h3&gt;&lt;br /&gt;
At the root of the problem is the special jQuery &lt;code&gt;.each()&lt;/code&gt; method we are using. The &lt;code&gt;.each()&lt;/code&gt; method is a very handy way to iterate over the jQuery collection, however there is a special meaning to &lt;code&gt;return false&lt;/code&gt; within a &lt;code&gt;.each()&lt;/code&gt; method.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"We can stop the loop from within the callback function by returning false." --&lt;a href="http://api.jquery.com/each" target="_blank"&gt;http://api.jquery.com/each&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
Upon further examination of the code it even makes further sense why it wouldn't work. Most of us are familiar that a &lt;code&gt;return&lt;/code&gt; statement exists the current function, but in this case we aren't invoking the function... jQuery is! So, jQuery has control over what happens when you exit your function prematurely and it recognizes &lt;code&gt;return false&lt;/code&gt; to mean something special.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;A Solution&lt;/h3&gt;&lt;br /&gt;
The solution to fix this problem is really simple and straightforward. All you really need to do is to introduce another variable &lt;code&gt;hasNumber&lt;/code&gt;. If the number was found, then set the &lt;code&gt;hasNumber&lt;/code&gt; variable to &lt;code&gt;true&lt;/code&gt; and then &lt;code&gt;return false;&lt;/code&gt; to exit the &lt;code&gt;.each()&lt;/code&gt; method.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1169945.js?file=fiddle.js"&gt;&lt;/script&gt;&lt;br /&gt;
You can &lt;a href="http://jsbin.com/gist/1169945#javascript,html,live"&gt;view, run, and edit&lt;/a&gt; the above code sample from JSBin.&lt;br /&gt;
&lt;br /&gt;
If you test out the code again below you'll notice that now that we are getting the expected output of &lt;code&gt;false, true, true, true, false&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;An Alternate Solution&lt;/h3&gt;&lt;br /&gt;
An alternate way to solve this problem would be to use another technique completely. In the following example we will use the &lt;code&gt;jQuery.grep&lt;/code&gt; method. The &lt;code&gt;jQuery.grep&lt;/code&gt; method is defined as the following:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"Finds the elements of an array which satisfy a filter function. The original array is not affected." --&lt;a href="http://api.jquery.com/jquery.grep/"&gt;http://api.jquery.com/jquery.grep/&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1670312.js?file=fiddle.js"&gt;&lt;/script&gt;&lt;br /&gt;
You can &lt;a href="http://jsbin.com/urofar/edit#javascript,html,live"&gt;view, run, and edit&lt;/a&gt; the above code sample from JSBin.&lt;br /&gt;
&lt;br /&gt;
Although the code looks shorter, it is less performant than the previous solution. Can you tell why? The code is not exiting once the number has been found, but instead goes through each array item and executes the callback function. We get the correct answer, but for a price. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;
The key concept to remember here is to be aware of the special mean of &lt;code&gt;return false;&lt;/code&gt; inside of a jQuery &lt;code&gt;.each()&lt;/code&gt; method to exit the loop. Even if you have never made this mistake before, maybe it has opened up your eyes to the fact you can exit out of a &lt;code&gt;.each()&lt;/code&gt; method!&lt;br /&gt;
&lt;br /&gt;
Until next time...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-532718932635099623?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EVuTXuti8CT6OVrLjdQBUCGmOTs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EVuTXuti8CT6OVrLjdQBUCGmOTs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EVuTXuti8CT6OVrLjdQBUCGmOTs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EVuTXuti8CT6OVrLjdQBUCGmOTs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/532718932635099623/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/01/find-jquery-bug-2-point-of-no-return.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/532718932635099623?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/532718932635099623?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/01/find-jquery-bug-2-point-of-no-return.html" title="Find the jQuery Bug #2: Point of No Return" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0YBRXY-cSp7ImA9WhRbGEU.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-5180194466589618284</id><published>2012-01-19T07:50:00.000-06:00</published><updated>2012-02-10T08:45:54.859-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-10T08:45:54.859-06:00</app:edited><title>Daily and Weekly Front-End Dev Resources</title><content type="html">If you are anything like me, you love and thrive on what is new in the front-end world. What is the latest in HTML5 buzz, what is the newest library that will solve all my needs, what is that new jQuery plugin that will make my client drool, and things of the like.&lt;br /&gt;
&lt;br /&gt;
I used to scour the internet for things like that myself and share them on Twitter and elsewhere, but I've recently changed focus so that I can blog more frequently. My desire for tech news has not diminished in the least, I am still a junkie for new articles and libraries.&lt;br /&gt;
&lt;br /&gt;
So, what am I to do? Well, that is easy. There are many fine resources that have been around for years and there are also some that have cropped up recently that should provide just the right amount of geek influx to quench my thirst and I hope yours as well.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Daily Technology News&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;Twitter&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://twitter.com/#!/JavaScriptDaily"&gt;@JavaScriptDaily&lt;/a&gt; by Peter Cooper (&lt;a href="http://twitter.com/peterc"&gt;@peterc&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/#!/jscentral"&gt;@JSCentral&lt;/a&gt; by Béla Varga (&lt;a href="http://twitter.com/netzzwerg"&gt;@netzzwerg&lt;/a&gt;) and Axel Rauschmayer (&lt;a href="http://twitter.com/rauschma"&gt;@rauschma&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/#!/jsgoodies"&gt;@JSGoodies&lt;/a&gt; by Peter van der Zee (&lt;a href="http://twitter.com/kuvos"&gt;@kuvos&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/#!/dailyjs"&gt;@DailyJS&lt;/a&gt; by Alex Young (&lt;a href="http://twitter.com/alex_young"&gt;@alex_young&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/functionsource"&gt;@FunctionSource&lt;/a&gt; by Dion Almaer (&lt;a href="http://twitter.com/dalmaer"&gt;@dalmaer&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/echojs"&gt;@EchoJS&lt;/a&gt; by Frederic Cambus (&lt;a href="http://twitter.com/fcambus"&gt;@fcambus&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;Blogs&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dailyjs.com/"&gt;DailyJS&lt;/a&gt;: A JavaScript Blog by Alex Young (&lt;a href="http://twitter.com/alex_young"&gt;@alex_young&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.cwa.me.uk/"&gt;The Morning Brew&lt;/a&gt;: A Daily .NET Software Development Link Blog by Chris Alcock (&lt;a href="http://twitter.com/calcock"&gt;@calcock&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alvinashcraft.com/"&gt;The Morning Dew&lt;/a&gt;: Your Source for .NET Development Resources by Alvin Ashcraft (&lt;a href="http://twitter.com/alvinashcraft"&gt;@alvinashcraft&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://functionsource.com/"&gt;Function Source&lt;/a&gt;: Your Source for Developer News by Dion Almaer (&lt;a href="http://twitter.com/dalmaer"&gt;@dalmaer&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.echojs.com/"&gt;EchoJS&lt;/a&gt;: A HackerNews-like site dedicated to JavaScript and Front-end News by Frederic Cambus (&lt;a href="http://twitter.com/fcambus"&gt;@fcambus&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;Weekly Technology News&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;Newsletters&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://javascriptweekly.com/"&gt;JavaScript Weekly&lt;/a&gt; by Peter Cooper (&lt;a href="http://twitter.com/peterc"&gt;@peterc&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://html5weekly.com/"&gt;HTML5 Weekly&lt;/a&gt; by Peter Cooper (&lt;a href="http://twitter.com/peterc"&gt;@peterc&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://web-design-weekly.com/"&gt;Web Design Weekly&lt;/a&gt; by Jake Bresnehan (&lt;a href="http://twitter.com/jake_bresnehan"&gt;@jake_bresnehan&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;Blogs&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jsmag.com/blog/category/news/"&gt;JsMag News Roundup&lt;/a&gt; by David Calhoun (&lt;a href="http://twitter.com/franksvalli"&gt;@franksvalli&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;Podcasts&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://javascriptshow.com/"&gt;The JavaScript Show&lt;/a&gt; by Peter Cooper (&lt;a href="http://twitter.com/peterc"&gt;@peterc&lt;/a&gt;) and Jason Seifer (&lt;a href="http://twitter.com/jseifer"&gt;@jseifer&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://javascriptjabber.com/"&gt;JavaScript Jabber&lt;/a&gt;: Your Prototype for Great Code hosted by AJ O’Neal (&lt;a href="http://twitter.com/coolaj86"&gt;@coolaj86&lt;/a&gt;), Charles Max Wood (&lt;a href="http://twitter.com/cmaxw"&gt;@cmaxw&lt;/a&gt;), Jamison Dance (&lt;a href="http://twitter.com/jergason"&gt;@jergason&lt;/a&gt;), Peter Cooper (&lt;a href="http://twitter.com/peterc"&gt;@peterc&lt;/a&gt;), and Yehuda Katz (&lt;a href="http://twitter.com/wycats"&gt;@wycats&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shoptalkshow.com/"&gt;ShopTalk Show&lt;/a&gt;: A live web design and development podcast by Chris Coyier (&lt;a href="chris_coyier"&gt;@chris_coyier&lt;/a&gt;) and Dave Rupert (&lt;a href="http://twitter.com/davatron5000"&gt;@davatron5000&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
[Cross posted from &lt;a href="http://freshbrewedcode.com/elijahmanor/2012/01/19/daily-and-weekly-front-end-dev-resources/"&gt;Fresh Brewed Code&lt;/a&gt;.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-5180194466589618284?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dGQqEBnewbOeQv04SiC5ebTgAPo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dGQqEBnewbOeQv04SiC5ebTgAPo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dGQqEBnewbOeQv04SiC5ebTgAPo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dGQqEBnewbOeQv04SiC5ebTgAPo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/5180194466589618284/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/01/daily-and-weekly-front-end-dev.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/5180194466589618284?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/5180194466589618284?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/01/daily-and-weekly-front-end-dev.html" title="Daily and Weekly Front-End Dev Resources" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEACSHg4eip7ImA9WhRUE08.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-1509370407765590803</id><published>2012-01-16T07:52:00.001-06:00</published><updated>2012-01-23T07:52:49.632-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-23T07:52:49.632-06:00</app:edited><title>Bye Bye Tech Tweets</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
As you probably noticed I haven't been blogging as much as I used to. With church, family, work, and tech tweets it seems my free time has dwindled down to nothing.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I want to refocus on blogging again for this year. Not only do I enjoy sharing the things that I learn, but by doing so I tend to learn the topic even better than I did in the first place. Also, many of my conference presentations are based off blog posts that I've authored previously.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, something needs to give for me to have extra time for blogging and giving up Tech Tweets is what I've chosen. Giving up Tech Tweets wasn't an easy&amp;nbsp;decision&amp;nbsp;for me because I've lived and breathed it for probably the past 5 years or so. It is now in my nature to scour the internet for the latest in front-end news. In order for this to work like I want to I'll need to resist the urge to research everything and share it immediately. I'll need to now depend on the others who are currently doing the research.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thankfully there are many other avenues to get similar information that I've been providing. Many great&amp;nbsp;resources&amp;nbsp;have cropped up recently that allow you to get front-end news, articles, and library information in a daily or weekly manner. I'll be blogging about what resources I recommend you to follow in the near future. These are the same resources that I'll be using to keep myself up to speed on what is going on.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I am not giving up Twitter or anything. I still will be active on social media, but any tech tweets you see from me will probably be retweets from other resources or just interesting things that I came across that day. Who knows, I might get pulled back into the whole tech tweeting again, but even if I do I'd like to keep it somewhat unstructured.&lt;br /&gt;
&lt;br /&gt;
Thank you all for following me and for regularly retweeting my tech tweets. I do appreciate it. My habbits are changing, but hopfully the posts will be of value to you as well. I have planned out numerous jQuery and jQuery Mobile posts that should keep me busy for quite some time.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
In addition to a renewed interest in blogging I will also focus on posting some content to the newly created&amp;nbsp;&lt;a href="http://freshbrewedcode.com/"&gt;Fresh Brewed Code&lt;/a&gt;&amp;nbsp;website where many of my friends from the Nashville area are now blogging. I don't have any posts there yet, but expect some very soon!&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-1509370407765590803?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5hAFnaUHMGWFpZHiCYyP1SQbNFY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5hAFnaUHMGWFpZHiCYyP1SQbNFY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5hAFnaUHMGWFpZHiCYyP1SQbNFY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5hAFnaUHMGWFpZHiCYyP1SQbNFY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/1509370407765590803/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2012/01/bye-bye-tech-tweets.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/1509370407765590803?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/1509370407765590803?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2012/01/bye-bye-tech-tweets.html" title="Bye Bye Tech Tweets" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUAHQ38_fCp7ImA9WhdXEEo.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-5504460820149412367</id><published>2011-08-22T23:28:00.001-05:00</published><updated>2011-08-22T23:28:52.144-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-22T23:28:52.144-05:00</app:edited><title>devLink: Extend your jQuery Application with AmplifyJS</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://j.mp/etm-amplifyjs-slides" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://1.bp.blogspot.com/-H-kZRxAIY0M/TlMqvRMa3zI/AAAAAAAAKOs/sq1f3swhGM4/s1600/15971538220_vjrHH.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Last week I attended the &lt;a href="http://devlink.net/"&gt;devLink conference&lt;/a&gt; in Chattanooga, TN. On Thursday I gave a presentation entitled &lt;i&gt;Extend your jQuery Application with AmplifyJS.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Thank you for everyone who was able to attend the session. Unfortunately the session was not recorded, but you can access &lt;a href="http://j.mp/etm-amplifyjs-slides" target="_blank"&gt;my slides&lt;/a&gt; and play around with the interactive jsFiddles that I demonstrated. You can launch the associated jsFiddles by clicking the "pencil" icon when you see one in the slide's title.&lt;br /&gt;
&lt;br /&gt;
The session was a combination of the &lt;a href="http://msdn.microsoft.com/en-us/scriptjunkie/hh147623"&gt;Script Junkie article&lt;/a&gt; I wrote, by the same name, and also some of the prototyping and unit testing concepts that I presented at the &lt;a href="http://events.jquery.org/2011/sf-bay-area/"&gt;San Francisco jQuery Conference&lt;/a&gt; earlier this year.&lt;br /&gt;
&lt;br /&gt;
Resources mentioned in the session...&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amplifyjs.com/" target="_blank"&gt;AmplifyJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://swarm.amplifyjs.com/" target="_blank"&gt;AmplifyJS Test Swarm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mennovanslooten/mockJSON" target="_blank"&gt;mockJSON&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-5504460820149412367?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MHgRvLtoInYT8-HEcrRDkIx7kwQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MHgRvLtoInYT8-HEcrRDkIx7kwQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MHgRvLtoInYT8-HEcrRDkIx7kwQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MHgRvLtoInYT8-HEcrRDkIx7kwQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/5504460820149412367/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/08/extend-your-jquery-application-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/5504460820149412367?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/5504460820149412367?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/08/extend-your-jquery-application-with.html" title="devLink: Extend your jQuery Application with AmplifyJS" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-H-kZRxAIY0M/TlMqvRMa3zI/AAAAAAAAKOs/sq1f3swhGM4/s72-c/15971538220_vjrHH.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkIFR344fip7ImA9WhdRGUo.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-3667908476630244577</id><published>2011-08-10T00:12:00.006-05:00</published><updated>2011-08-10T07:15:16.036-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-10T07:15:16.036-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Find the jQuery Bug" /><category scheme="http://www.blogger.com/atom/ns#" term="jQuery" /><title>Find the jQuery Bug #1: Chicken or the Egg</title><content type="html">&lt;h3&gt;    Introduction&lt;/h3&gt;&lt;br /&gt;
In this open-ended series I'll be showcasing a snippet of buggy jQuery code that you might encounter, explain what the problem is, and then identify how you can easily resolve the issue.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;As this series progresses my example code may not use all the best practices that I would normally use in my everyday development. This is partly due to me wanting to show code you might encounter in the wild, but also because I want these code snippets to be easily understood so that the main concept can be revealed. In order to do that a healthy balance will need to be maintained, which is tricky ;)&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;    The Desired Feature&lt;/h3&gt;&lt;br /&gt;
You have a list of individuals in a table. Each row has an alternating background color (zebra). You can delete them by clicking an icon to the right of each row.&lt;br /&gt;
&lt;br /&gt;
When the trash icon is clicked, a request goes to the server to delete that individual by it's ID. If the action was successful then the row should fade out and then be removed from the DOM. After all is said and done, the rows should be zebra'ed again.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;The following code was inspired by an issue a friend of mine, &lt;a href="http://twitter.com/caseypicker" target="_blank"&gt;Casey Picker&lt;/a&gt; from &lt;a href="http://lamplightmedia.net/" target="_blank"&gt;LamplightMedia.net&lt;/a&gt;, had last week and I helped him isolate the problem. If you don't spot the error right away I have a simplified version of the same underlying issue at the end of the post.&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;    The Buggy Code&lt;/h3&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1124506.js?file=fiddle.js"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;h3&gt;    The Unexpected Result&lt;/h3&gt;&lt;br /&gt;
&lt;iframe src="http://jsfiddle.net/KyH2y/embedded/result,html,js" style="height: 300px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
When you execute the above code you'll notice that when you delete one of the rows the alternating background colors get all out of sync. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;   The Underlying Problem&lt;/h3&gt;&lt;br /&gt;
Since the row that is being deleted is happening in the success callback function It seemed logical to put the zebraTable call in the complete callback function. That seems right, right? Based on the jQuery documentation the complete callback is only fired after the success function. But why am I having this problem?&lt;br /&gt;
&lt;br /&gt;
Well, the problem is the classic case of treating asynchronous code as synchronous. You might think to yourself, "I know AJAX is asynchronous, but the problem is happening after we've received a response, right?" The answer to that is "Yes", but you the act of animating the fading of the row is also asynchronous.&lt;br /&gt;
&lt;br /&gt;
Once the program starts the hide animation the control of execution moves on to trigger the complete callback function (where the zebraTable call is taking place). After 500 milliseconds, when the row has completed fading out, control is given back to the hide callback which finally removes the row. The bug is that the code is zebra-fying the table before the row is deleted, which isn't what you intended.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;   The Solution&lt;/h3&gt;&lt;br /&gt;
The solution to fix this problem is really simple and straightforward. All you really need to do is to move the zebraTable function call out of the complete callback and immediately after you remove the row from the hide callback. &lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1124539.js?file=gistfile1.js"&gt;
&lt;/script&gt;&lt;br /&gt;
If you test out the code again below you'll notice that now we have the desired behavior that we were wanting all along. If you delete a row the rows will re-zebra-fy themselves as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://jsfiddle.net/7y69R/embedded/result,html,js" style="height: 300px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;   Simple Example of the Same Problem&lt;/h3&gt;&lt;br /&gt;
The above example was slightly complex, but the underlying problem of treating asynchronous code as synchronous is common. Here is another example, but this time dramatically simplified. &lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1130095.js?file=fiddle.js"&gt;
&lt;/script&gt;&lt;br /&gt;
The above code snippet ( &lt;a href="http://jsfiddle.net/zhqry/" target="_blank"&gt;jsFiddle&lt;/a&gt; ) declares a contact variable and then makes an AJAX call to retrieve contact information from the server. On the &lt;b&gt;next statement&lt;/b&gt; the code is assuming that the contact is already available to display in the console. Unfortunately, since the AJAX is asynchronous the result will not be what you expected.&lt;br /&gt;
&lt;br /&gt;
The most simple fix to the above code snippet is to move the console.log statement to after the AJAX call has successfully returned the server with your contact data as show in the below code snippet ( &lt;a href="http://jsfiddle.net/vFjZJ/" target="_blank"&gt;jsFiddle&lt;/a&gt; ).&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1130097.js?file=fiddle.js"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;blockquote&gt;Technically this fixes your error, but you might additionally refactor this code to make a callback, trigger an event, or publish a message that the data was retrieved. This would help separate the data access code from your user interface code.&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;   Conclusion&lt;/h3&gt;&lt;br /&gt;
The key concept to remember here is to &lt;strong&gt;not treat asynchronous code as synchronous&lt;/strong&gt;. Most of us are aware that AJAX calls are asynchronous, but we also need to remember that animations are asynchronous as well. In addition setTimeout and setInterval are also asynchronous.&lt;br /&gt;
&lt;br /&gt;
Until next time...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-3667908476630244577?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LVZnCB9F4Uwhvva0WAQkYjQx13s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LVZnCB9F4Uwhvva0WAQkYjQx13s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LVZnCB9F4Uwhvva0WAQkYjQx13s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LVZnCB9F4Uwhvva0WAQkYjQx13s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/3667908476630244577/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/08/find-jquery-bug-1-chicken-or-egg.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3667908476630244577?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3667908476630244577?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/08/find-jquery-bug-1-chicken-or-egg.html" title="Find the jQuery Bug #1: Chicken or the Egg" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0MFQ309cCp7ImA9WhdRGE0.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-6434601510639630008</id><published>2011-08-08T08:14:00.004-05:00</published><updated>2011-08-08T08:16:52.368-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T08:16:52.368-05:00</app:edited><title>Top JavaScript Developers You Should Follow on Google+</title><content type="html">&lt;a href="http://gpc.fm/l/javascript" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-duPruOoELgw/Tj_b9MkDK6I/AAAAAAAAKBM/Opi1lmq8mBM/s200/google_plus_logo.jpg" width="183" /&gt;&lt;/a&gt;Like many of you, I've hopped on the &lt;a href="https://plus.google.com/" target="_blank"&gt;Google+&lt;/a&gt; bangwagon and the 1st thing you do on most social networks is to find those individuals that you want to follow.&lt;br /&gt;
&lt;br /&gt;
As many of you are aware I work for &lt;a href="http://appendto.com/"&gt;appendTo&lt;/a&gt; and most of my work these days involves front-end web development ( JavaScript, jQuery, HTML5, etc ). &lt;br /&gt;
&lt;br /&gt;
So, I created the following list of &lt;a href="http://gpc.fm/l/javascript" target="_blank"&gt;60+ JavaScript Developers&lt;/a&gt; on the Google+ Counter website that you might consider circling ( a.k.a. following ).&lt;br /&gt;
&lt;blockquote&gt;Unfortunately since the Google+ API is not yet released you'll have to click each developer and circle them one at a time. Once the API is released hopefully this will be much less painful.&lt;/blockquote&gt;&lt;a href="http://gpc.fm/l/javascript" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-UWM4G3Gxhog/Tj_bhppzHvI/AAAAAAAAKBI/SpU5QXXVx60/s320/Top5JavaScriptGooglePlug.png" width="252" /&gt;&lt;/a&gt;The top 5 individuals that are circled are listed in the image to the right. Hopefully these names are not a surprise to you as they are all highly influential in the JavaScript space.&lt;br /&gt;
&lt;br /&gt;
Google+ is technically still invite only so I image these numbers will increase dramatically over time.&amp;nbsp;I find Google+ already to be a much more conversational way to share knowledge.&lt;br /&gt;
&lt;br /&gt;
Are you on Google+? If not I have &lt;a href="https://plus.google.com/_/notifications/ngemlink?path=%2F%3Fgpinv%3D3rGtJSJ9jKQ%3AesHtanFxNlQ"&gt;some invites&lt;/a&gt; left over. &lt;br /&gt;
&lt;br /&gt;
Also if you circle me ( &lt;a href="http://gplus.to/elijahmanor"&gt;http://gplus.to/elijahmanor&lt;/a&gt; )  I'll put you in my Developer circle and share with you the latest in web development links throughout the week. &lt;br /&gt;
&lt;br /&gt;
Am I missing your favorite JavaScript developer? If so, leave a comment and I'll see about adding them to the list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-6434601510639630008?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R9pMHa4JYzKxG49sXVUoQC_-LlI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R9pMHa4JYzKxG49sXVUoQC_-LlI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R9pMHa4JYzKxG49sXVUoQC_-LlI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R9pMHa4JYzKxG49sXVUoQC_-LlI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/6434601510639630008/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/08/top-javascript-developers-you-should.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/6434601510639630008?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/6434601510639630008?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/08/top-javascript-developers-you-should.html" title="Top JavaScript Developers You Should Follow on Google+" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-duPruOoELgw/Tj_b9MkDK6I/AAAAAAAAKBM/Opi1lmq8mBM/s72-c/google_plus_logo.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQEQ3s7fSp7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-4746010167035092286</id><published>2011-08-02T02:49:00.005-05:00</published><updated>2011-08-08T10:28:22.505-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T10:28:22.505-05:00</app:edited><title>7 Chrome Tips Developers &amp; Designers May Not Know</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-wX_MlsWktmI/TjDlzHyAELI/AAAAAAAAJ6o/kT51-4FQMSU/s1600/chrome-firefox1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://1.bp.blogspot.com/-wX_MlsWktmI/TjDlzHyAELI/AAAAAAAAJ6o/kT51-4FQMSU/s200/chrome-firefox1.png" style="float: left; padding-bottom: 15px; padding-right: 15px;" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
I'm not sure about you, but Google Chrome has been my primary browser for quite some time. At first the simplicity and speed of Chrome&amp;nbsp;initially&amp;nbsp;drew me in. I do admit I went back to Firefox every so often for Firebug's rich set of debugging tools.&lt;br /&gt;
&lt;br /&gt;
However, &amp;nbsp;over the past year or so the amount of tooling for developers and designers in Chrome has grown&amp;nbsp;immensely.&lt;br /&gt;
&lt;br /&gt;
Here are some fairly recent features of Google Chrome that you may not be aware of...&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
 1. The ability to modify the source JavaScript and execute it&lt;/h3&gt;
&lt;br /&gt;
How many times have you been tinkering around JavaScript and wished you could tweak it out&amp;nbsp;temporarily&amp;nbsp;just to test something out? Well, if you are using IE or Firefox then you are out of luck, however in Chrome you can just double-click inside a JavaScript file, make changes, and then proceed to run the web application like normal ( see line 33 ).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-BYqkDXr0qTk/TjeJvZHo_uI/AAAAAAAAJ7w/lgIQJmI2m1o/s1600/UpdateScript1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://3.bp.blogspot.com/-NI_jzlTb6l0/TjeM4UgoK2I/AAAAAAAAJ8U/UFiwgOXZR_A/s1600/15602761547_CL8TT.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Usages for this could be as simple as adding a console.log or modifying a piece of code that you think is broken. Of course, you should note that if you refresh the page you will lose all of your changes, so this technique is only meant as a quick and&amp;nbsp;temporary&amp;nbsp;debugging solution.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
 2. The ability to Pretty Print ( a.k.a. unminify ) JavaScript source&lt;/h3&gt;
&lt;br /&gt;
Sometimes I'm trying to figure out a bug and&amp;nbsp;unfortunately&amp;nbsp;the JavaScript that was included has been minified. As you are aware trying to debug a minified file is nearly impossible. How do you set a break point on a line that is a bazillion characters long?&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-BYqkDXr0qTk/TjeJvZHo_uI/AAAAAAAAJ7w/lgIQJmI2m1o/s1600/UpdateScript1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://2.bp.blogspot.com/-gxQ1nFrM6uo/TjeMNclT-sI/AAAAAAAAJ8M/yeJ_e936Qk8/s1600/15602737155_vMBRP.jpg" style="float: left;" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-6n6vf-SMdgg/TjeNPkFTutI/AAAAAAAAJ8Y/sQ12cSIt9_4/s1600/Unminified3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://1.bp.blogspot.com/-MEtpXllQpjo/TjeNet65w_I/AAAAAAAAJ8g/jAOtWTQKwJI/s1600/15602795012_chhmv.jpg" style="float: right;" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
&lt;br /&gt;
Thankfully Chrome has a Pretty Print feature that will take a minified JavaScript file and format it property. All you need to do is to click the "{ }" icon on the bottom toolbar to activate this feature. Of course the names will still be&amp;nbsp;obfuscated&amp;nbsp;( depending on what program minfied the JavaScript in the first place ), but you will at least be able to set break points and debug the code.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
 3. The ability to break in JavaScript when an element has changed in the DOM&lt;/h3&gt;
&lt;br /&gt;
Let's say that you are tasked with finding the code that manipulates a&amp;nbsp;particular&amp;nbsp;DOM element. It can become quite difficult to track down code for a certain behavior especially if your codebase has grown quite large or if you are diving into a slightly unfamiliar project.&lt;br /&gt;
&lt;br /&gt;
Chrome thankfully saves the day again by providing the following unique features&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Break on subtree modifications&lt;/li&gt;
&lt;li&gt;Break on attributes modifications&lt;/li&gt;
&lt;li&gt;Break on node removal&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;a href="http://1.bp.blogspot.com/-IEL7Q5UKAuc/TjeN_YbVOuI/AAAAAAAAJ8k/1VaYxylBUhc/s1600/BreakOfSubTree.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://4.bp.blogspot.com/-CcKSwPNqjI0/TjeOU5WXlfI/AAAAAAAAJ8s/6LCd03HCpKo/s1600/15602814146_rkHps.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This way you can find the DOM element in question and then right-click on it to select one of the above options. Then, when one of the above criteria happens a break point will occur where the JavaScript is performing that action. Brilliant!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;a href="http://3.bp.blogspot.com/-eWtu4qme32k/TjeSkofwGbI/AAAAAAAAJ80/H08LSFZ74MY/s1600/BreakPointOnChange2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://4.bp.blogspot.com/-Mjq75MmuGmw/TjeSyvrUUyI/AAAAAAAAJ88/S9KSlr7U2Ao/s1600/15603015935_2GmSc.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Note: The breakpoint  you end up on might be way down in the heart of a minified library (such as jQuery), but fortunately you can use the call stack on the right to find your way back up to where your code lies. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
 4. The ability to change a CSS stylesheet file as if it were an editor&lt;/h3&gt;
&lt;br /&gt;
You are probably familiar with changing the styles on the Elements tab either by manipulating the HTML or by changing values individually on the right in the matched CSS rules section. This concept is very similar to your experiences in Firefox up till today.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-gC2SccbiQRo/TjeZizVWjsI/AAAAAAAAJ9A/Tkdo0GrZpQA/s1600/editcss.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://1.bp.blogspot.com/-145DVpd6fCU/TjeZu480MRI/AAAAAAAAJ9I/hwrny-fp4xY/s1600/15603272896_h3jXb.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Instead of modifying the CSS like above you can switch to the Resources tab and find the CSS file you are interested in, double click inside of it, and make changes to your heart's content ( see line 11 ). A quicker way I do this is by clicking the file &amp;amp;amp; line number link in the Matched CSS Rules pane which jumps me directly to the correct location in the Resources tab where I can start modifying rules.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
 5. The ability to inspect CSS&amp;nbsp;pseudo-class selectors&lt;/h3&gt;
&lt;br /&gt;
Trying to find the pseudo-class rule that matches an element has been considerably painful. How can you hover over an element and at the same time be interacting with the developer tools?&lt;br /&gt;
&lt;br /&gt;
Well, you can now with the Google Chrome. You can access it from the styles pane by clicking the little arrow inside a dashed box ( see the following image ). Then you just check the pseudo-classes that you want to examine.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-zC_1v0Ijn3I/TjebiPOEHcI/AAAAAAAAJ9Q/BQoOmfAo6U8/s1600/csspsudeo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://3.bp.blogspot.com/-0pOb72wnOis/TjebvqHTy2I/AAAAAAAAJ9Y/w26j9Q77L6o/s1600/15603353513_6zPQD.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Note: This is one of the newer features in Google Chrome and as a result you will need either the dev branch or the canary build for this to work. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
 6. The ability to access most features via keyboard shortcuts&lt;/h3&gt;
&lt;br /&gt;
I love myself some keyboard shortcuts! I've recently picked up MacVim and the Vico App and have really been enjoying it. The great news is that the Chrome Dev Tools also have keyboard shortcuts. When you are in the Elements tab type "?" and the following screen will pop up with a whole bunch of useful keyboard shortcuts. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-6WcUJkCsg1c/TjecvtqghKI/AAAAAAAAJ9c/MI_uGVK0Kis/s1600/keyboardshortcuts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://4.bp.blogspot.com/-4qRot1I5H6M/Tjec6xPLdFI/AAAAAAAAJ9k/0-TJEagn3nw/s1600/15603387250_GMsq9.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
 7. The ability to configure settings your way&lt;/h3&gt;
&lt;br /&gt;
The Dev Tools have a set of options that you may not be aware of. The two options that I find most useful are "Log XMLHttpRequests" ( a feature I missed from Firebug for a long time ) and "Preserve log upon navigation". &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-swwBXHP7JWo/TjedFItAPsI/AAAAAAAAJ9o/CpN3PcrfDQk/s1600/settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://1.bp.blogspot.com/-YQOtNTJo7Y0/TjedR_6YVMI/AAAAAAAAJ9w/n-EvCdaG_N4/s1600/15603404250_5PtL7.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
 &amp;amp;amp; Many, many, more...&lt;/h3&gt;
&lt;br /&gt;
Chrome has been adding a lot of great new features recently. &lt;a href="http://twitter.com/paul_irish"&gt;Paul Irish&lt;/a&gt; has put together several screencasts and videos describing some of these new features. I've highlighted some of these above, but there are many others. &lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=nOEw9iiopwI"&gt;Google Chrome Developer Tools: 12 Tricks to Develop Quicker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paulirish.com/2011/a-re-introduction-to-the-chrome-developer-tools/"&gt;A Re-introduction to the Chrome Developer Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paulirish.com/2011/quick-color-manipulation-with-the-chrome-devtools/"&gt;Quick color manipulation with the Chrome DevTools &amp;amp;amp; more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=N8SS-rUEZPg&amp;amp;feature=youtu.be"&gt;Google I/O 2011: Chrome Dev Tools Reloaded&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
There is also a &lt;a href="https://github.com/borismus/DevTools-Lab/tree/master/cheatsheet"&gt;cheatsheet&lt;/a&gt; you might be interested in created by &lt;a href="http://twitter.com/borismus"&gt;Boris Smus&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-4746010167035092286?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YT3DOK1EZW_D3WaNic_phz_tUIo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YT3DOK1EZW_D3WaNic_phz_tUIo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YT3DOK1EZW_D3WaNic_phz_tUIo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YT3DOK1EZW_D3WaNic_phz_tUIo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/4746010167035092286/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/08/7-chrome-tips-developers-designers-may.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/4746010167035092286?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/4746010167035092286?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/08/7-chrome-tips-developers-designers-may.html" title="7 Chrome Tips Developers &amp; Designers May Not Know" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-wX_MlsWktmI/TjDlzHyAELI/AAAAAAAAJ6o/kT51-4FQMSU/s72-c/chrome-firefox1.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A08CSHo9eSp7ImA9WhdSGUQ.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-6030925985187858579</id><published>2011-07-28T23:03:00.003-05:00</published><updated>2011-07-29T23:24:29.461-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-29T23:24:29.461-05:00</app:edited><title>Book Review: JavaScript Enlightenment</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-ajOpmSrycTU/TjIwP0TxWFI/AAAAAAAAJ6s/rwesgqQHFtU/s1600/474f072acc99a66a8d545b923ce75bdd.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="280" id=":current_picnik_image" src="http://1.bp.blogspot.com/-cDiNfWjVkk4/TjIwg_X9PyI/AAAAAAAAJ60/3DdZwV0GVkY/s1600/15525663053_jXWn9.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
This week jQuery team member &lt;a href="http://twitter.com/#%21/codylindley"&gt;Cody Lindley&lt;/a&gt; self-published the book entitled &lt;a href="http://www.javascriptenlightenment.com/"&gt;JavaScript Enlightenment&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you recall he wrote another great resource a year or so ago called &lt;a href="http://jqueryenlightenment.com/"&gt;jQuery Enlightenment&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
As you've probably heard me talk about before, it is important for a jQuery developer to really know the JavaScript language. Thankfully Cody has written this book to aid in this learning process.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Who is the Target Audience of this Book?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The book targets developers who are already &lt;i&gt;JavaScript Library User&lt;/i&gt; (jQuery, dojo, YUI, etc...) and seeks to deepen their knowledge and transform them into a &lt;i&gt;JavaScript Developer&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
The audience isn't intended for beginner JavaScript developers. There is an assumption that you somewhat familiar with using a JavaScript library. If you are a developer that wants to deepen your understanding of JavaScript then this book is for you!&lt;br /&gt;
&lt;br /&gt;
If you do consider yourself a beginner JavaScript or jQuery developer then you might consider going over to &lt;a href="http://appendto.com/"&gt;appendTo&lt;/a&gt;'s new &lt;a href="http://learn.appendto.com/"&gt;learning site&lt;/a&gt; where they have free videos and exercises to guide you through learning these concepts.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What does the book Cover?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The book covers JavaScript 1.5 (also known as ECMA-262 Edition 3), which is the most prevelant version of JavaScript. The book won't be covering some of the new ECMAScript 5 features, but Cody hints that another book might be coming out the in the future to cover some of these new features that are making themselves into current browsers.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What to Expect in the book?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
It is Cody's style to have lots of code examples in his book. The great thing about this is that he provides a jsFiddle link to the code so that you can pull it up in your browser and play around with it until the concept sinks in. I really enjoyed this in his last book (jQuery Enlightenment) and I'm also loving it in this book.&lt;br /&gt;
&lt;br /&gt;
Cody even goes to explain that the words in the book describing the code should be secondary to the code itself. The examples are there to help you understand what is going on, which is great!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;High Level Overview of Contents?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Cody's book has 15 main chapters and each of them are broken up into much smaller pieces, but to spare you the who table of contents I've just listed out the top level chapters for you to look over below...&lt;br /&gt;
&lt;br /&gt;
Chapter 01 - JavaScript Object&lt;br /&gt;
Chapter 02 - Working with Objects and Properties&lt;br /&gt;
Chapter 03 - Object()&lt;br /&gt;
Chapter 04 - Function()&lt;br /&gt;
Chapter 05 - The Head/Global Object&lt;br /&gt;
&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/fully-understanding-the-this-keyword/"&gt;Chapter 06 - The this Keyword&lt;/a&gt;&lt;br /&gt;
Chapter 07 - Scope &amp;amp; Closures&lt;br /&gt;
Chapter 08 - Prototype Property&lt;br /&gt;
Chapter 09 - Array()&lt;br /&gt;
Chapter 10 - String()&lt;br /&gt;
Chapter 11 - Number()&lt;br /&gt;
Chapter 12 - Boolean&lt;br /&gt;
Chapter 13 - Null&lt;br /&gt;
Chapter 14 - Undefined&lt;br /&gt;
Chapter 15 - Math Function&lt;br /&gt;
&lt;br /&gt;
You can actually preview all of &lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/fully-understanding-the-this-keyword/"&gt;Chapter 6 - The this Keyword&lt;/a&gt; on the Nettuts website if you are curious as to what some of the content looks like in the book. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Should I Get this Book? &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
There is a lot of great material in this book. Most of book is coding examples which means that you can get through it fairly quickly. The book is able to fit in a ton of information in less than 150 pages! I highly recommend this book. There is a lot of value jam packed in this book for a &lt;a href="http://www.javascriptenlightenment.com/"&gt;price tag of $15&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-6030925985187858579?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/u6gO7HQ1UjAYMq2rmswQAe0aflY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u6gO7HQ1UjAYMq2rmswQAe0aflY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/u6gO7HQ1UjAYMq2rmswQAe0aflY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u6gO7HQ1UjAYMq2rmswQAe0aflY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/6030925985187858579/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/07/book-reivew-javascript-enlightenment.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/6030925985187858579?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/6030925985187858579?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/07/book-reivew-javascript-enlightenment.html" title="Book Review: JavaScript Enlightenment" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-cDiNfWjVkk4/TjIwg_X9PyI/AAAAAAAAJ60/3DdZwV0GVkY/s72-c/15525663053_jXWn9.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0UFSXs7eip7ImA9WhdSFUQ.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-5894186123591620561</id><published>2011-07-25T08:04:00.002-05:00</published><updated>2011-07-25T08:06:58.502-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-25T08:06:58.502-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="AmplifyJS" /><category scheme="http://www.blogger.com/atom/ns#" term="NuGet" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><category scheme="http://www.blogger.com/atom/ns#" term="jQuery" /><title>Getting Started with the AmplifyJS NuGet Package in Visual Studio</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://amplifyjs.com/"&gt;&lt;img border="0" height="72" src="http://1.bp.blogspot.com/-3o-RDSkTcqw/Tizmmsrug9I/AAAAAAAAJ40/gX5f9i8plYY/s320/Screen+Shot+2011-07-24+at+10.43.55+PM.png" style="float: left; padding-bottom: 15px; padding-right: 15px;" width="320" /&gt;&lt;/a&gt;Last week I packaged &lt;a href="http://appendto.com/" target="_blank"&gt;appendTo's&lt;/a&gt; &lt;a href="http://amplifyjs.com/"&gt;AmplifyJS Library&lt;/a&gt; and published it to the central NuGet server for use in your Visual Studio projects. &lt;/div&gt;&lt;br /&gt;
The package contains... &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;An unminifed version of AmplifyJS for development use&lt;/li&gt;
&lt;li&gt;A minified version of AmplifyJS for production use&lt;/li&gt;
&lt;li&gt;A VSDOC version of AmplifyJS that enables intellisense support within Visual Studio&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;What is AmplifyJS?&lt;/h3&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;In case you aren't familiar with what AmplifyJS is, here is an&amp;nbsp;excerpt&amp;nbsp;from the website...&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;blockquote style="background-color: #cccccc; padding: 5px;"&gt;AmplifyJS is a set of components designed to solve common web application problems with a simplistic API. AmplifyJS solves the following problems:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://amplifyjs.com/api/request/"&gt;Ajax Request Management&lt;/a&gt;&lt;br /&gt;
&lt;ul style="list-style-type: square;"&gt;&lt;li&gt;amplify.request provides a clean and elegant request abstraction for all types of data, even allowing for transformation prior to consumption.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://amplifyjs.com/api/pubsub/"&gt;Client Side Component Communication&lt;/a&gt;&lt;br /&gt;
&lt;ul style="list-style-type: square;"&gt;&lt;li&gt;amplify.publish/subscribe provides a clean, performant API for component to component communication.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://amplifyjs.com/api/store/"&gt;Client Side Browser &amp;amp; Mobile Device Storage&lt;/a&gt;&lt;br /&gt;
&lt;ul style="list-style-type: square;"&gt;&lt;li&gt;amplify.store takes the confusion out of HTML5 localStorage. It doesn't get simpler than using amplify.store(key, data)! It even works flawlessly on mobile devices.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;Installation&lt;/h3&gt;&lt;br /&gt;
In order to install the NuGet package in your Visual Studio project all you need to do is type the following command into the "Package Manager Console"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://nuget.org/List/Packages/AmplifyJS" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-9APgSEZ3m-o/Tizlo2thHLI/AAAAAAAAJ4w/SISP77310Tg/s640/Screen+Shot+2011-07-24+at+10.39.47+PM.png" width="600" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Once you type the above command into the "Package Manager Console" then all of the appropriate files will be downloaded to your project to support AmplifyJS. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-6NDMOEob6_k/Ti0A5UnwPFI/AAAAAAAAJ5I/woq8Ncc-KuM/s1600/AmplifyJSCommandLineNuGet.PNG" imageanchor="1"&gt;&lt;img border="0" id=":current_picnik_image" src="http://4.bp.blogspot.com/-XxUFrjF_q1E/Ti0Ec_d550I/AAAAAAAAJ6E/eaCVaZRvLBo/s1600/15449696588_GmRWc.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
If the command line isn't your thing and you prefer a Graphical User Interface, then you can install AmplifyJS as well by searching for "AmplifyJS" in the "Add Library Package Reference" dialog.  &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-6NDMOEob6_k/Ti0A5UnwPFI/AAAAAAAAJ5I/woq8Ncc-KuM/s1600/AmplifyJSCommandLineNuGet.PNG" imageanchor="1"&gt;&lt;img border="0" id=":current_picnik_image" src="http://3.bp.blogspot.com/-35AB4XiCRYI/Ti0DnXyyHyI/AAAAAAAAJ50/uR6fVwSU9MY/s1600/15449669924_q2gWs.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;Referencing and Using AmplifyJS&lt;/h3&gt;&lt;br /&gt;
Now that you've installed AmplifyJS all that is left is to reference the script file that was added to your Scripts folder and start using it. It is considered best practice to add your scripts to the bottom of your webpage for best overall performance. Once you do this you can start using the library right away as shown in the following code snippet.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ui9DjTSl1Zk/Ti0BDU3JsmI/AAAAAAAAJ5Q/xkAzctdahN4/s1600/AmplifyJSUsingInVisualStudio.PNG" imageanchor="1"&gt;&lt;img border="0" id=":current_picnik_image" src="http://1.bp.blogspot.com/-aPFbJ2IkcY0/Ti0EG6Wy7BI/AAAAAAAAJ58/vR3p4VLZ8uw/s1600/15449690725_7Qj2x.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The code that I am showing the above screenshot is a very simple example of what can be accomplished with AmplifyJS. Look at the following code and see how the 3 components work together (Publish/Subscript, Request, and Store).&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1103608.js?file=amplifyjs-simple-twitter.js"&gt;&lt;/script&gt;&lt;br /&gt;
You can play around with the above code inside the following jsFiddle. Click the "+" sign to launch a full editor so you can tweak with the code yourself. Try commenting out the 2nd definition of the mocked "getTweets" request. You should see real data from Twitter being returned instead of mock data. &lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://jsfiddle.net/elijahmanor/mTCzd/embedded/js,result" style="height: 300px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/scriptjunkie/hh147623"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-oRie__hCNxw/TizqicLwT6I/AAAAAAAAJ5E/wjLfXYX6Xwg/s1600/Screen+Shot+2011-07-24+at+11.00.48+PM.png" style="float: right; padding-bottom: 15px; padding-left: 15px;" /&gt;&lt;/a&gt;If are interested to see how AmplifyJS might help your application then you might check out an article entitled &lt;a href="http://msdn.microsoft.com/en-us/scriptjunkie/hh147623"&gt;Extending Your jQuery Application with AmpilfyJS&lt;/a&gt; that is hosted on&amp;nbsp;Microsof't's Script Junkie website.&lt;/div&gt;&lt;br /&gt;
There is so much more you can do with the AmplifyJS library. Feel free to check out the official &lt;a href="http://amplifyjs.com/api/request/" target="_blank"&gt;AmplifyJS Documentation&lt;/a&gt; and if you need support or more information check out the &lt;a href="http://amplifyjs.com/community/" target="_blank"&gt;AmplifyJS Community&lt;/a&gt; page.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-5894186123591620561?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Hj1_uxlf5YbaY5uTM7gd-N7lOzs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Hj1_uxlf5YbaY5uTM7gd-N7lOzs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Hj1_uxlf5YbaY5uTM7gd-N7lOzs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Hj1_uxlf5YbaY5uTM7gd-N7lOzs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/5894186123591620561/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/07/getting-started-with-amplifyjs-nuget.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/5894186123591620561?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/5894186123591620561?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/07/getting-started-with-amplifyjs-nuget.html" title="Getting Started with the AmplifyJS NuGet Package in Visual Studio" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-3o-RDSkTcqw/Tizmmsrug9I/AAAAAAAAJ40/gX5f9i8plYY/s72-c/Screen+Shot+2011-07-24+at+10.43.55+PM.png" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CEMAQHwzeyp7ImA9WhdSEUs.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-8486263302768569104</id><published>2011-07-20T06:47:00.000-05:00</published><updated>2011-07-20T06:47:21.283-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-20T06:47:21.283-05:00</app:edited><title>JavaScript &amp; jQuery on Yet Another Podcast</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-T4R1TDDEcmY/Tia9Yf92msI/AAAAAAAAJzg/CLWZ0fo55Ik/s1600/LibertyWithTwibbon.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="100" src="http://1.bp.blogspot.com/-T4R1TDDEcmY/Tia9Yf92msI/AAAAAAAAJzg/CLWZ0fo55Ik/s200/LibertyWithTwibbon.jpg" width="80" /&gt;&lt;/a&gt;&lt;/div&gt;
Recently &lt;a href="http://twitter.com/JesseLiberty"&gt;Jessie Liberty&lt;/a&gt;, Senior Developer-Community Evangelist for Microsoft,&amp;nbsp;asked to interview me on his&amp;nbsp;&lt;a href="http://jesseliberty.com/2011/07/06/yet-another-podcast-41jquery-with-elijah-manor/"&gt;Yet Another Podcast&lt;/a&gt;&amp;nbsp;podcast. I was honored to be a guest on his 41st show. It was very easy and enjoyable to talk with Jesse and discuss some of the things I've been excited about.&lt;br /&gt;
&lt;br /&gt;
You can listen to the podcast by downloading the &lt;a href="http://jesseliberty.com/wp-content/media/Show41.mp3"&gt;mp3&lt;/a&gt;&amp;nbsp;or subscribing via&amp;nbsp;&lt;a href="http://itunes.apple.com/us/podcast/id393751871"&gt;iTunes&lt;/a&gt;&amp;nbsp;or &lt;a href="http://social.zune.net/redirect?type=podcastseries&amp;amp;id=00c3fa7b-0fdf-4936-a1cf-92caacb08775"&gt;Zune&lt;/a&gt;.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Some of the things that Jesse and I talked about were...&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;How I got started into the world of JavaScript and jQuery&lt;/li&gt;
&lt;li&gt;An overview of my Mix&amp;nbsp;presentation entitled &lt;a href="http://www.elijahmanor.com/2011/04/mix11-video-good-javascript-habits-for.html"&gt;Good JavaScript Habits for C# Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My involvement into social media (&lt;a href="http://twitter.com/elijahmanor"&gt;Twitter&lt;/a&gt; &amp;amp; &lt;a href="http://gplus.to/elijahmanor"&gt;Google+&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Some resources I recommend for developers getting into JavaScript and jQuery&lt;/li&gt;
&lt;ul&gt;
&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;a href="http://appendto.com/" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #ff4b33; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;appendTo’s&lt;/a&gt;&amp;nbsp;new&amp;nbsp;&lt;a href="http://learn.appendto.com/" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #0066cc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Training Site&lt;/a&gt;&amp;nbsp;(free self paced training with screencasts &amp;amp; exercises)&lt;/li&gt;
&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #0066cc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;JavaScript: The Good Parts&lt;/a&gt;&amp;nbsp;by Douglas Crockford&lt;/li&gt;
&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;a href="http://yuiblog.com/crockford/" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #0066cc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Crockford on JavaScript&lt;/a&gt;&amp;nbsp;video series on Yahoo!&lt;/li&gt;
&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;a href="http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #0066cc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;10 Things I Learned from Looking at the jQuery Source&lt;/a&gt;&amp;nbsp;by &lt;a href="http://twitter.com/paul_irish"&gt;Paul Irish&lt;/a&gt;&lt;/li&gt;
&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;a href="http://paulirish.com/2011/11-more-things-i-learned-from-the-jquery-source/" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #0066cc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;11 More Things I Learned from Looking at the jQuery Source&lt;/a&gt;&amp;nbsp;by &lt;a href="http://twitter.com/paul_irish"&gt;Paul Irish&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
As it turns out both Jesse Liberty and I will both be speaking at the &lt;a href="http://devlink.net/"&gt;devLINK&lt;/a&gt; conference coming up in&amp;nbsp;Tennessee&amp;nbsp;(&amp;nbsp;August 17-19 ). If you are able to make it to the conference, then we'd love to meet you.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-8486263302768569104?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Z5uaPewBkCExAVMxepb9z8fJbMA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Z5uaPewBkCExAVMxepb9z8fJbMA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Z5uaPewBkCExAVMxepb9z8fJbMA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Z5uaPewBkCExAVMxepb9z8fJbMA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/8486263302768569104/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/07/javascript-jquery-on-yet-another.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/8486263302768569104?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/8486263302768569104?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/07/javascript-jquery-on-yet-another.html" title="JavaScript &amp; jQuery on Yet Another Podcast" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-T4R1TDDEcmY/Tia9Yf92msI/AAAAAAAAJzg/CLWZ0fo55Ik/s72-c/LibertyWithTwibbon.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUMERn0ycCp7ImA9WhdSEks.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-4347582433119545859</id><published>2011-07-19T00:05:00.010-05:00</published><updated>2011-07-21T11:56:47.398-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-21T11:56:47.398-05:00</app:edited><title>filterByData jQuery Plugin: Select by HTML5 Data Attr Value</title><content type="html">I've been using HTML5 data attributes more and more lately and have been finding it slightly awkward when I need to select element based on their data.&lt;br /&gt;
&lt;br /&gt;
I find myself writing the following code snippet more than once and I just doesn't feel right to me.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1091327.js?file=jquery.selectbydata.js"&gt;
&lt;/script&gt;&lt;br /&gt;
I initially tweeting about my thoughts on this syntax and mentioned that I wished a better API existed. Instead of wishing, I figured the best route would be to figure something out on my own.&lt;br /&gt;
&lt;br /&gt;
I ended up writing a jQuery plugin and then after talking with &lt;a href="http://twitter.com/dougneiner"&gt;Doug Neiner&lt;/a&gt; (a jQuery team member) it morphed into the following plugin...&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1091333.js?file=jquery.filterbydata.js"&gt;
&lt;/script&gt;&lt;br /&gt;
I want to thank &lt;a href="http://twitter.com/#!/aknosis" target="_blank"&gt;Paul Giberson&lt;/a&gt; for recommending to use the ternary operator which has the same behavior, but minifies to a much smaller output.&lt;br /&gt;
&lt;br /&gt;
I wrote some unit tests for the plugin and you can view them here...&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://jsfiddle.net/elijahmanor/fqJmu/embedded/result,js,html" style="height: 300px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
I also wanted to give a shout out to &lt;a href="http://twitter.com/danheberden"&gt;Dan Heberden&lt;/a&gt; (another jQuery team member) who saw my tweet and wrote a &lt;a href="https://gist.github.com/1048942"&gt;similar plugin&lt;/a&gt; to solve the same issue. Dan took a slightly different approach and performs a find and filter at the same time, where as my plugin only filters the initial selection.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-4347582433119545859?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eXcUiXq_2quGF9ZvXDOK3g_KhPo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eXcUiXq_2quGF9ZvXDOK3g_KhPo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eXcUiXq_2quGF9ZvXDOK3g_KhPo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eXcUiXq_2quGF9ZvXDOK3g_KhPo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/4347582433119545859/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/07/filterbydata-jquery-plugin.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/4347582433119545859?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/4347582433119545859?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/07/filterbydata-jquery-plugin.html" title="filterByData jQuery Plugin: Select by HTML5 Data Attr Value" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkYFQ3Y5eCp7ImA9WhdTGUQ.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-3391787316746469189</id><published>2011-07-18T08:01:00.002-05:00</published><updated>2011-07-18T08:01:52.820-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T08:01:52.820-05:00</app:edited><title>Google+ Invite Form</title><content type="html">If you don't already have a Google+ account I would be happy to invite you. I've been finding Google+ to be much more conversational than Twitter as of recent.&lt;br /&gt;
&lt;br /&gt;
I made the initial mistake by of letting people reply to me on Twitter for Google+ invites, but that turned into flood of unmanageable tweets and actually made the invitation process very time consuming and manual.&lt;br /&gt;
&lt;br /&gt;
I eventually got smart and created a Google Form (see below) to help manage the information necessary for the invitation process.&amp;nbsp;Since I have created macros to do most of the work for me, the overhead is considerably small.&lt;br /&gt;
&lt;br /&gt;
What do you have to do to get on? &lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Do you have to tweet? No&lt;/li&gt;
&lt;li&gt;Do you have to follow me on twitter? No&lt;/li&gt;
&lt;li&gt;Do you have to add a comment to this blog? No&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
All you have to do is fill out the following form and I'll invite people in groups throughout the day.&lt;br /&gt;
&lt;br /&gt;
I ask for a twitter handle so that I can tweet you after I invite you. It isn't necessary, but if you provide it I'll send you a public tweet saying I've sent your invitation out.&lt;br /&gt;
&lt;br /&gt;
I look forward to seeing you on Google+ in the near future if you aren't already!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;As far as I know in order to get on Google+ your email address needs to be tied to a Google Profile. Please provide that below.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder="0" height="550" marginheight="0" marginwidth="0" src="https://spreadsheets.google.com/spreadsheet/embeddedform?formkey=dFJGT0NZZTNGY1lMRzNDVUtUdHJpNlE6MQ" width="600"&gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;amp;amp;amp;amp;lt;p&amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;Loading...&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-3391787316746469189?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HbqHhz0h2UINIjEU9y3FrkZaKdo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HbqHhz0h2UINIjEU9y3FrkZaKdo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HbqHhz0h2UINIjEU9y3FrkZaKdo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HbqHhz0h2UINIjEU9y3FrkZaKdo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/3391787316746469189/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/07/google-invite-form-no-strings-attached.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3391787316746469189?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3391787316746469189?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/07/google-invite-form-no-strings-attached.html" title="Google+ Invite Form" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0YDSH0zcSp7ImA9WhZQE0Q.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-2394128438088805006</id><published>2011-04-21T01:20:00.010-05:00</published><updated>2011-04-21T08:06:19.389-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-21T08:06:19.389-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Conference" /><category scheme="http://www.blogger.com/atom/ns#" term="jQuery" /><title>jQCon: Front-end Prototyping &amp; Unit Testing with Mocking</title><content type="html">&lt;a href="http://bit.ly/prototyping-and-unit-testing" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-_a9KSyK8YSc/Ta8D_lcbKGI/AAAAAAAAJcY/Q_iYIZl9_qs/s400/Prototyping+and+Unit+Testing.png" width="600" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Right after speaking at the Mix11 conference in Las Vegas, Nevada I flew to the jQuery Conference in San Francisco, California to present my next talk. &lt;br /&gt;
&lt;br /&gt;
&lt;div style="float: right; padding-left: 15px;"&gt;&lt;script id="speakerrate-widget-7220" src="http://speakerrate.com/talks/7220/widget.js"&gt;&lt;/script&gt;&lt;/div&gt;If you were able to attend my talk in person I would appreciate if you could give me some feedback on &lt;a href="http://speakerrate.com/talks/7220-prototyping-and-unit-testing-with-mockjax-mockjson" target="_blank"&gt;SpeakerRate&lt;/a&gt;. Thanks in advance! Unfortunately, the session was not recorded at the conference, but I plan to record the material soon and make the session available for to you to watch.&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;
For this talk I focused on some prototyping and unit testing tools to help web developers quickly build their front-end while not depending on the back-end. Here is the abstract for the session:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Prototyping and Unit Testing with &lt;a href="http://bit.ly/mockjax" target="_blank"&gt;Mockjax&lt;/a&gt;, &lt;a href="http://bit.ly/mockjson" target="_blank"&gt;mockJSON&lt;/a&gt;, and &lt;a href="http://bit.ly/amplifyjs" target="_blank"&gt;Amplify&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;The front-end and back-end of your application inevitably progress at different speeds. In order for each layer to develop independently it is optimal if the front-end piece can work regardless of the back-end, which is where the Mockjax plugin or the Amplify Request component comes in. These tools can intercept and simulate ajax requests made with jQuery with minimal effort and impact to your code. Another tool that works well with these tools is mockJSON which provides a random data templating feature. This can be very handy when you want to mock a JSON response from a AJAX call, but instead of manually building the response you can build a template to do it for you.&lt;br /&gt;
&lt;br /&gt;
As you are developing, Mockjax or Amplify Request can also be used to help Unit Test your front-end code. You can setup a static mock responses to your requests and then Unit Test your Ajax success and fail event handlers.&lt;/blockquote&gt;&lt;br /&gt;
At the end of the presentation I went through a demo showing the various types of prototype and unit testing techniques you can utilize using Mockjax, mockJSON, and Amplify. The source code for all of the examples I presented can be found on &lt;a href="https://github.com/elijahmanor/mockjax-mockjson-prototype-testing" target="_blank"&gt;my GitHub account&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
The demonstration code goes through the following steps (they are outlined in the index.html comments):&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Use a local JSON file with contacts and have $.getJSON refer to that endpoint&lt;/li&gt;
&lt;li&gt;Update URL to use the real endpoint and use Mockjax to intercept and return the contacts&lt;/li&gt;
&lt;li&gt;Use mockJSON and Mockjax to return a random set of contacts based on a template&lt;/li&gt;
&lt;li&gt;Use Amplify Request and return an array of mock contacts (this part was mentioned, but not demonstrated)&lt;/li&gt;
&lt;li&gt;Uses Amplify Request and mockJSON to return an random array of contacts&lt;strong&gt;*&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Updates Amplify Request Definition to pull contacts from Whitepages instead&lt;strong&gt;*&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Pulls out Amplify Request decoder and type to allow reuse for later requests&lt;strong&gt;*&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;i&gt;&lt;span&gt;&lt;strong&gt;*&lt;/strong&gt; No code changes were made to the main application. The only changes made were to the amplify.request.define statement.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a class="demoButton" href="http://bit.ly/prototyping-and-unit-testing"&gt;View Slides&lt;/a&gt; &lt;a class="demoButton" href="https://github.com/elijahmanor/mockjax-mockjson-prototype-testing"&gt;Download Code&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-2394128438088805006?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SRY3VPpMHzfYCVD5QXzuL4eYIp4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SRY3VPpMHzfYCVD5QXzuL4eYIp4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SRY3VPpMHzfYCVD5QXzuL4eYIp4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SRY3VPpMHzfYCVD5QXzuL4eYIp4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/2394128438088805006/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/04/jqcon-prototyping-and-unit-testing.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/2394128438088805006?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/2394128438088805006?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/04/jqcon-prototyping-and-unit-testing.html" title="jQCon: Front-end Prototyping &amp; Unit Testing with Mocking" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-_a9KSyK8YSc/Ta8D_lcbKGI/AAAAAAAAJcY/Q_iYIZl9_qs/s72-c/Prototyping+and+Unit+Testing.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0YGSXYzeCp7ImA9WhZQE0w.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-3511215307602562310</id><published>2011-04-20T10:58:00.000-05:00</published><updated>2011-04-20T10:58:48.880-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-20T10:58:48.880-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="Conference" /><title>Mix11 Video: Good JavaScript Habits for C# Developers</title><content type="html">&lt;a href="http://bit.ly/goodjavascripthabits"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-rNDrmdTl1S4/Ta7_uafh78I/AAAAAAAAJcU/5mFSIIxCVx8/s640/Good+JavaScript+Habits+for+C%2523+Developers++MIX11++Channel+9.png" width="600" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="float: right; padding-left: 15px;"&gt;&lt;script id="speakerrate-widget-7305" src="http://speakerrate.com/talks/7305/widget.js"&gt;
&lt;/script&gt;&lt;/div&gt;If you were able to watch my presentation (either in person or the above video) please consider rating my talk on &lt;a href="http://speakerrate.com/talks/7305-good-javascript-habits-for-c-developers" target="_blank"&gt;SpeakerRate&lt;/a&gt; and providing a comment with your feedback. Thank you.&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;
Thanks to everyone who voted my talk, I was able to present again at Mix again this year. In my presentation I reviewed some common problems that C# developers tend to make when moving to the JavaScript language. The languages look very similar, but they are very much different and knowing these differences is key!&lt;br /&gt;
&lt;br /&gt;
You can view the recorded session above. The conference was jam packed with great sessions and many times it was difficult to pick which one to attend. Fortunately, all the sessions were recorded and Mix did a great job about publishing the videos only a few days after recording. &lt;br /&gt;
&lt;br /&gt;
Throughout the presentation I list several resources that you might want to dig into and research for yourself. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Slides and Articles&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I have hosted the &lt;a href="http://bit.ly/goodjavascripthabits-slides"&gt;slides from the video&lt;/a&gt;.&amp;nbsp;I utilized an HTML5 Presentation tool and the slides are best viewed using either Google Chrome or Firefox.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;The article series this video was based on can be found on&amp;nbsp;&lt;a href="http://bit.ly/dDaY8B"&gt;Enterprise jQuery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Tools&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://jslint.com/"&gt;JSLint.com&lt;/a&gt; by Douglas Crockford&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jslint.com/"&gt;JSHint.com&lt;/a&gt; (a fork of JSLing supported and maintained by the JavaScript developer community) by Anton Kovalyov&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Books&lt;/b&gt; &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742"&gt;JavaScript: The Good Parts&lt;/a&gt; by Douglas Crockford&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752"&gt;JavaScript Patterns&lt;/a&gt; by Stoyan Stefanov&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Articles&lt;/b&gt; &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/scriptjunkie/ff852808.aspx"&gt;Prototypes and Inheritance in JavaScript&lt;/a&gt; by &lt;a href="http://twitter.com/odetocode"&gt;Scott Allen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/scriptjunkie/ff696765.aspx"&gt;Use Cases for JavaScript Closures&lt;/a&gt; by &lt;a href="http://twitter.com/kangax/"&gt;Juriy Zaytsev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.boyet.com/blog/javascriptlessons/"&gt;JavaScript for C# Programmers&lt;/a&gt; series by &lt;a href="http://draft.blogger.com/post-create.g?blogID=30404818"&gt;Julian Bucknall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Video&lt;/b&gt; &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://yuiblog.com/crockford/"&gt;Crockford on JavaScript&lt;/a&gt; video series on Yahoo!&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-3511215307602562310?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/suyHw7vAl-V3v95CJsUx1XTAkQw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/suyHw7vAl-V3v95CJsUx1XTAkQw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/suyHw7vAl-V3v95CJsUx1XTAkQw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/suyHw7vAl-V3v95CJsUx1XTAkQw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/3511215307602562310/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/04/mix11-video-good-javascript-habits-for.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3511215307602562310?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/3511215307602562310?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/04/mix11-video-good-javascript-habits-for.html" title="Mix11 Video: Good JavaScript Habits for C# Developers" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-rNDrmdTl1S4/Ta7_uafh78I/AAAAAAAAJcU/5mFSIIxCVx8/s72-c/Good+JavaScript+Habits+for+C%2523+Developers++MIX11++Channel+9.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEYERHc9eCp7ImA9WhZSE08.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-8074758566469583632</id><published>2011-03-28T00:06:00.003-05:00</published><updated>2011-03-28T09:21:45.960-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-28T09:21:45.960-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="HTML5" /><category scheme="http://www.blogger.com/atom/ns#" term="Conference" /><title>20 Mix11 HTML5 and JavaScript Sessions</title><content type="html">This year I will be attending the &lt;a href="http://live.visitmix.com/" target="_blank"&gt;Microsoft Mix Conference&lt;/a&gt; again in Las Vegas (April 12-14 2011). There were a lot of great sessions last year and there appear to be many more scheduled for this year.&lt;br /&gt;
&lt;br /&gt;
I have listed 20 sessions (in alphabetical order) that I hope to attend if the schedule permits, otherwise I'll just catch the videos that will be posted shortly after they are presented.&lt;br /&gt;
&lt;br /&gt;
In addition to these sessions I'm also looking forward to the Future of the Web &lt;a href="http://live.visitmix.com/Keynotes" target="_blank"&gt;keynotes&lt;/a&gt; by Scott Guthrie, Dean Hachamovitch, Joe Belfiore.&lt;br /&gt;
&lt;br /&gt;
If you are already going or plan to attend after seeing these great sessions, then I hope to see you there! It should be another great conference! See &lt;a href="http://live.visitmix.com/mix11" target="_blank"&gt;http://live.visitmix.com/mix11&lt;/a&gt; for more details...&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/HTM12" target="_blank"&gt;5 Things You Need To Know To Start Using &amp;lt;video&amp;gt; and &amp;lt;audio&amp;gt; Today&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Nigel Parker&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Come along to this session to get an overview of the new video and audio tags from the HTML5 specification. Discover how to use them to play media in modern browsers and on mobile devices. Learn the most advanced techniques and best practices, including encoding optimizations, custom skinnable players, full screen workarounds, seeking settings and fallback scenarios for legacy browsers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/HTM01" target="_blank"&gt;50 Performance Tricks to Make Your HTML5 Web Sites Faster&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Jason Weber&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Learn how you can make your sites faster directly from the Internet Explorer Performance Team. These are the same guys who brought you GPU accelerated graphics and compiled JavaScript with Internet Explorer 9, and they’re going to share their favorite 50 best practices for web developers. This session will provide an inside look into browser performance, discuss why common web best practices are important, and then go deep into how to get the most from new HTML5 capabilities including Canvas, Audio, Video, SVG, local storage, and more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/FRM05" target="_blank"&gt;Building Business Centric Application in JavaScript&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Deepesh Mohnani&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Building end-to-end data-intensive JavaScript applications has never been easier. In this session, we will talk about tools that let you focus on business logic, without having you worry about plumbing and infrastructure, making your development process more productive. Attendees will learn about the latest investments that are being made to simplify development of business-centric applications, bringing rich data and visualization to your jQuery client using WCF and WCF DomainServices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/HTM02" target="_blank"&gt;Data in an HTML5 World&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Asad Khan&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Come and learn about ‘datajs’. datajs is a new cross-browser JavaScript library that enables better data-centric web application by leveraging HTML5 browser features and modern protocols such as OData. It's designed to be small, fast, and provide functionality for structured queries, data modification, and interaction with various cloud services, including Windows Azure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/HTM03" target="_blank"&gt;Deep Dive Into HTML5 &amp;lt;canvas&amp;gt;&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Jatinder Mann&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;If you’ve seen the demos for Internet Explorer 9’s hardware accelerated graphics, you are probably excited to learn the details of HTML5 Canvas. With all major browsers supporting HTML5 Canvas, a scriptable 2D drawing context, Canvas is quickly becoming the natural choice for graphics on the web. In this session, you will learn advanced Canvas concepts (including the origin-clean security and the Canvas Drawing Model), understand when to use Canvas versus SVG and get a deeper look at how the Internet Explorer team solved interoperability issues as we implemented the specification. You will learn to build HTML5 Canvas websites through best practices and lots of code samples.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/EXT07" target="_blank"&gt;Designer and Developer: A Case for the Hybrid&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Jeff Croft&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Should designers code? Or is is okay for one to specialize in visual design and expect others to build their vision? As we get farther and farther away from the days of the "webmaster," and become an industry of specialists, are we losing some of the beauty, efficiency, and innovation that can be found at the point where design and development intersect? Jeff Croft, hybrid designer and developer, makes the case that the best web products will always be created by designers who understand the building blocks of the web: the code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;Filling the HTML5 Gaps with Polyfills and Shims&lt;/h3&gt;&lt;i&gt;Rey Bango&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Everyone wants to jump into HTML5 but how do you use the cool features of this new specification while ensuring older browsers render your web pages as expected? This is where polyfills and shims come in. In the session, you’ll learn how to use specially crafted JavaScript and CSS code that emulate HTML5 features so that you can take advantage of HTML5 today without breaking your sites in older browsers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/HTM17" target="_blank"&gt;The Future of HTML5&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Giorgio Sardo&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;We love HTML5 so much that we want it to actually work – in an interoperable, predictable manner across all browsers. In this session you will learn the current status of HTML5 and the Open Web Platform and what will take to bring it to a Recommendation. You will also preview the next emerging standards and understand Microsoft implementation approach through prototypes. Finally ride the DeLorean at 88mph and discover some of the work being done by Microsoft with the W3C on what will lead into HTML6.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/HTM05" target="_blank"&gt;Going Mobile with Your Site on Internet Explorer 9 and Windows Phone 7&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Joe Marini&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;The mobile Web is here, it’s huge, and your business can’t afford to ignore it. Mobile users have come to expect their favorite Web sites to give them a great mobile experience – otherwise, they find new favorite sites that do. In this session, Joe Marini, Principal Program Manager for Internet Explorer on Windows Phone will take you through the design and experience principles you need to consider when creating your mobile Web presence, teach you about the exciting new HTML5 capabilities that Internet Explorer 9 on Windows Phone 7 will support, and show you how to give your sites the next-generation features you need to engage your users on their smartphones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/OPN08" target="_blank"&gt;Good JavaScript Habits for C# Developers&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Elijah Manor&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;It seems that far too many people come to jQuery thinking that their previous knowledge with object-oriented languages like C# or Java will help them be successful at client-side scripting. In many cases, you can be successful with this approach, however, the more JavaScript you write you will inevitably find yourself uncovering strange bugs because you didn't take time to learn JavaScript properly. This session is targeted for developers that use jQuery, but haven’t invested adequate time to learn some of the foundational JavaScript concepts that differ from C#. If you would like to avoid some of these common mistakes when bringing your existing expertise to JavaScript, then please join me as I try to explain some of the differences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/FRM07" target="_blank"&gt;HTML5 with ASP.NET&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Mads Kristensen&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;This talk is all about code. Whether you are building a new website using ASP.NET or maintaining an existing one, you’ll leave the talk ready and able to utilize HTML5 on ASP.NET. We’ll look at what HTML5 offers modern application developers and how you can code HTML5 with ASP.NET WebForms or ASP.NET MVC today and tomorrow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/RES02" target="_blank"&gt;JavaScript Panel&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Luke Hoban, Allen Wirfs-Brock, Tomasz Janczuk and Doug Crockford&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;JavaScript is one of the most widely used general purpose functional, dynamic and prototype-based object-oriented programming languages on the web with considerable amounts of JS even running outside of the browser in other hosts. The language has matured and is currently in version 5 (officially, this is known as EcmaScript 5). Where did it come from? What problems was it initially designed to solve? How has it managed to scale to so many different usage scenarios? What are these scenarios, exactly? What does EC5 add to the language and what specific problems do these new additions solve? What's missing from the language? How will it evolve? How general purpose is JavaScript, really? The folks who will be on stage can answer all of these questions, but most importantly, YOU will drive the panel with your own questions. What do you want to know? What's the most burning question you have in your mind related to JavaScript? Answers await.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/FRM08" target="_blank"&gt;Knockout JS: Helping you build dynamic JavaScript UIs with MVVM and ASP.NET&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Steve Sanderson&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Steve Sanderson delivers KnockoutJS in this lightening talk. Learn how the Knockout library builds on advanced jQuery and JavaScript techniques to make even the most complex data-filled HTML forms a breeze. We’ll see jQuery, jQuery templating, JSON and live data banding applied wto the MVVM pattern with Knockout, combined with ASP.NET to produce results that need to be seen to believed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/RES04" target="_blank"&gt;Making Better Web Apps For Today's Browsers&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;James Mickens&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Microsoft Research is working on several cool ways to make web applications faster and more robust. In this session, James Mickens will describe two projects that leverage JavaScript to improve web programs running on unmodified, commodity browsers. His talk will focus on Silo, a system that exploits DOM storage and AJAX to make web pages load more quickly. He’ll also describe Mugshot, a framework which allows developers to capture and replay JavaScript application bugs that users encounter in the wild. Neither project requires users to install a plugin or otherwise change their browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/HTM15" target="_blank"&gt;Modernizing Your Website: SVG meets HTML5&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Jennifer Yu&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Scalable Vector Graphics (SVG) integrates with the HTML5 and CSS features to unleash some of the most beautiful experiences on the web. In this session we’ll explain what is SVG and when you should consider using it instead of other alternatives. We’ll show you how to create content that is interoperable across browsers and devices. We’ll cover common pitfalls to avoid, as well as look at the best SVG tools and libraries available to developers. We’ll walk through code samples to learn first-hand how you can bring a high quality, interactive SVG experience to your customers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/SVC04" target="_blank"&gt;Node.js, Ruby, and Python in Windows Azure: A Look at What’s Possible&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Steve Marx&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Most people using Windows Azure are using ASP.NET and PHP, but Windows Azure is much more general than that. Steve Marx will show how he built a few web apps (including his blog) that run on Windows Azure and don’t use .NET or PHP. Server-side JavaScript, Ruby, and Python will be the most prominent examples.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/FRM02" target="_blank"&gt;An Overview of the MS Web Stack of Love&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Scott Hanselman&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Oh yes. Building web applications on the Microsoft stack continues to evolve. There’s lots of great tools to leverage, but it can be difficult to keep up with all the options. In this technical and fast-paced session, you’ll learn from Scott Hanselman how the pieces fit together. We’ll look at ASP.NET MVC 3, MvcScaffolding, Entity Framework Code First (Magic Unicorn Edition), SQL Compact 4, jQuery and more. We’ll also see how many times Scott can say “unobtrusive” in a single talk. You’ll leave this session with a clear understanding of the technology options available on the Microsoft Web Stack. What’s changed since PDC? What direction are we doing? Let’s see what we can build in a PowerPoint-free hour with the Microsoft Web Stack of Love.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/FRM12" target="_blank"&gt;Pragmatic JavaScript, jQuery &amp; AJAX with ASP.NET&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Damian Edwards&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;jQuery turned the world on its ear. Do we still write JavaScript or do we just write jQuery? Damian will answer that question with new JavaScript techniques and AJAX as well as some jQuery plugin surprises up his sleeve. What are the best libraries and practices for using jQuery and JavaScript with ASP.NET? How should balanced applications be designed to make the best use of the power of the server and the power of the client?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/HTM07" target="_blank"&gt;Reactive Extensions for JavaScript (RxJS)&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Bart De Smet&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;Nobody likes sluggish web interfaces that get stuck when interacting with servers and services. Asynchrony has become the way of life to enhance user experiences. The A in AJAX pinpoints this observation precisely. Moreover, the sheer amount of asynchronous data sources is overwhelming: stock tickers, Twitter quotes, RSS feeds, you name it. Unfortunately, the programmability story for each of those sources differs significantly, with little to no unification or compositionality. Got tired of writing cumbersome code with plenty of callbacks, tedious logic and tricky error handling? Enter the Reactive Extensions, a library to seamlessly compose all kinds of asynchronous “reactive” data streams using LINQ-style query operators, available for both .NET and JavaScript (RxJS). Come and learn how Rx will make your life as a web developer easier when dealing with the asynchronous reality of modern web programming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/HTM09" target="_blank"&gt;The View of the World Depends on the Glasses I Wear&lt;/a&gt;&lt;/h3&gt;&lt;i&gt;Thomas Lewis&lt;/i&gt;&lt;br /&gt;
&lt;p&gt;There is no mobile Web, there is no desktop Web, and there is no tablet Web. We view the same Web just in different ways. So how do we do it? Sitting next to HTML5 is its friend CSS3 with its support for Media Queries. Media Queries let you customize your web experience based on parameters of display, device, properties and more. If you are a designer or front-end developer, come to this session to explore the sheer brutality of CSS3 Media Queries.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-8074758566469583632?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/shWrTfLZwBYnaqzfA5goe9TvuEU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/shWrTfLZwBYnaqzfA5goe9TvuEU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/shWrTfLZwBYnaqzfA5goe9TvuEU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/shWrTfLZwBYnaqzfA5goe9TvuEU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/8074758566469583632/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/03/20-mix11-html5-and-javascript-sessions.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/8074758566469583632?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/8074758566469583632?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/03/20-mix11-html5-and-javascript-sessions.html" title="20 Mix11 HTML5 and JavaScript Sessions" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DE8CSHc6fSp7ImA9WhZTGUU.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-1000081724446045699</id><published>2011-03-24T00:18:00.004-05:00</published><updated>2011-03-24T12:14:29.915-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-24T12:14:29.915-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><title>Webinar: Amplify JavaScript Library with Scott González</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://amplifyjs.com/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-XDWzP2G4cuQ/TYrUwWoPCDI/AAAAAAAAJbY/N7gTw9Sq2oM/s1600/cd5fd9adaa50399467fbf2c5c1de4f43.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://appendto.com/" target="_blank"&gt;appendTo&lt;/a&gt; has recently launched a new JavaScript library called &lt;a href="http://amplifyjs.com/" target="_blank"&gt;Amplify&lt;/a&gt;. The intent of the library is to help you solve common front-end problems and it is meant to "amplify" your current JavaScript library of choice (jQuery, dojo, mootools, etc). &lt;br /&gt;
&lt;br /&gt;
Amplify is currently composed of three components&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://amplifyjs.com/api/pubsub/" target="_blank"&gt;Publish and Subscribe&lt;/a&gt;: Provides a clean pub/sub API, prevents collisions between custom events and method names, and allows a priority to your messages.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amplifyjs.com/api/request/" target="_blank"&gt;Request&lt;/a&gt;: Sets out to make data retrieval more maintainable. It does this by separating the definition of a request from the actual implementation of requesting the data. The definition of the quest is only responsible for deciding the caching strategy, server location, data type, decoders, headers, etc. while the actual requestor code only needs to know a request ID.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amplifyjs.com/api/store/" target="_blank"&gt;Store&lt;/a&gt;: Handles the persistant client-storage, using standards like localStorage and sessionStorage, but falling back on non-standard implementations for older browsers.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://twitter.com/scott_gonzale" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-iqI_0uSc2sg/TYrU3LiQ7II/AAAAAAAAJbc/NFVxQZ3RU5U/s1600/scott.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://twitter.com/scott_gonzalez" target="_blank"&gt;Scott González&lt;/a&gt;, the lead Amplify architect, will be presenting the library in an upcoming Webinar on &lt;strong&gt;Thursday March 31, 2011 12:00 PM Central&lt;/strong&gt;. You might already know Scott from his role as &lt;a href="http://jquery.org/team#scott-gonzalez" target="_blank"&gt;jQuery UI Developer Lead&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you are interesting in joining the webinar you can &lt;a href="http://appendto.com/webinar/webinar-introduction-amplify" target="_blank"&gt;sign-up&lt;/a&gt; from appendTo's event page.&lt;br /&gt;
&lt;br /&gt;
&lt;a class="demoButton" href="http://appendto.com/webinar/webinar-introduction-amplify" target="_blank"&gt;Sign-up for Webinar&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-1000081724446045699?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8Q6UJi-EE-OyvjvhIXd5QbkhA7o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8Q6UJi-EE-OyvjvhIXd5QbkhA7o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8Q6UJi-EE-OyvjvhIXd5QbkhA7o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8Q6UJi-EE-OyvjvhIXd5QbkhA7o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/1000081724446045699/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/03/webinar-amplify-javascript-library-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/1000081724446045699?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/1000081724446045699?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/03/webinar-amplify-javascript-library-with.html" title="Webinar: Amplify JavaScript Library with Scott González" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh3.googleusercontent.com/-XDWzP2G4cuQ/TYrUwWoPCDI/AAAAAAAAJbY/N7gTw9Sq2oM/s72-c/cd5fd9adaa50399467fbf2c5c1de4f43.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEQFR384cSp7ImA9WhZTF0o.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-4994167672237415080</id><published>2011-03-22T00:29:00.004-05:00</published><updated>2011-03-22T00:38:36.139-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-22T00:38:36.139-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><title>JSConsole Remote Debugging and JSBin Live Preview</title><content type="html">&lt;iframe frameborder="0" height="365" src="http://www.screenr.com/embed/zIQ" width="600"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Remy Sharp ( &lt;a href="http://twitter.com/rem" target="_blank"&gt;@rem&lt;/a&gt; ) recently implemented some really awesome new features to &lt;a href="http://jsconsole.com/" target="_blank"&gt;jsconsole.com&lt;/a&gt; and &lt;a href="http://jsbin.com/" target="_blank"&gt;jsbin.com&lt;/a&gt; that I wanted to share with you.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;JSConsole: Remote Debugging&lt;/h3&gt;&lt;br /&gt;
&lt;a href="https://lh5.googleusercontent.com/-zuzwy4dS-t0/TYgyZWtvBJI/AAAAAAAAJbQ/alP5ZpSHNwM/s1600/JavaScript+console+-+for+debugging+JavaScript+and+remote+debugging+mobile+web+apps.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="405" src="https://lh5.googleusercontent.com/-zuzwy4dS-t0/TYgyZWtvBJI/AAAAAAAAJbQ/alP5ZpSHNwM/s640/JavaScript+console+-+for+debugging+JavaScript+and+remote+debugging+mobile+web+apps.png" width="600" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
JSConsole.com is a useful tool if you want to play around with JavaScript. You can load another webpage into jsconsole, load external scripts, and then start playing around with them. &lt;br /&gt;
&lt;br /&gt;
However, a really compelling feature that he has added recently is the ability to remotely debug against another browser. Think of the potential of this. You can use jsconsole and remote debug against a jQuery Mobile application or any other website on any other device for that matter!&lt;br /&gt;
&lt;br /&gt;
The process is really straightforward. All you do is type &lt;code&gt;:listen&lt;/code&gt; at the jsconsole command line and it will output a unique identifier for you to use in your web application. It even spits out the whole script tag so you can copy/paste it into the web app that you want to remote debug.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: html;"&gt;/* Example script tag outputted by the JSConsole 
   :listen command that you need to insert into 
   your web application */
&amp;lt;script src="http://jsconsole.com/remote.js?5BDE9731-8EBD-42A8-8D72-CB24878F09A6"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Once you've pasted the script into your web app, then you'll see that a connection has been made in the jsconsole window. It will show the useragent of the browser you've just connected to.&lt;br /&gt;
&lt;br /&gt;
When you are connected then you can either enter commands into the jsconsole command line to execute on the remote browser. In addition any console.logs that are invoked on the remote browser will show up in your jsconsole window!&lt;br /&gt;
&lt;br /&gt;
If for some reason you'd rather not use the GUID that JSConsole generates, you can just as easily provide your own "unique identifier" such as &lt;code&gt;myApplication&lt;/code&gt;, but you do run the risk that this might conflict with someone else's "unique identifier".&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;NOTE: This debugging tool is intended for debug only and not for production code.&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;JSBin: Live Preview Pane&lt;/h3&gt;&lt;br /&gt;
&lt;a href="https://lh5.googleusercontent.com/-jlsss_ZyiUQ/TYgyf8qBr5I/AAAAAAAAJbU/ltA4umHrpv8/s1600/JS+Bin+-+%255Bunsaved%255D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="390" src="https://lh5.googleusercontent.com/-jlsss_ZyiUQ/TYgyf8qBr5I/AAAAAAAAJbU/ltA4umHrpv8/s640/JS+Bin+-+%255Bunsaved%255D.png" width="600" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Another cool new feature is the "Live Preview" pane in JSBin. Previously, you had to manually click the "Preview" button to preview the result of our JSBin, but now you can see live updates in this new pane.&lt;br /&gt;
&lt;br /&gt;
All you need to do is type the following statement in your browser's console. After you've executed the statement, then JSBin will remember this option by default when you create a new JSBin. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: javascript;"&gt;jsbin.livePreview();&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-4994167672237415080?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zXGRonXwszhEO0etGSreNvfwu2Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zXGRonXwszhEO0etGSreNvfwu2Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zXGRonXwszhEO0etGSreNvfwu2Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zXGRonXwszhEO0etGSreNvfwu2Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/4994167672237415080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/03/jsconsole-remote-debugging-and-jsbin.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/4994167672237415080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/4994167672237415080?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/03/jsconsole-remote-debugging-and-jsbin.html" title="JSConsole Remote Debugging and JSBin Live Preview" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh5.googleusercontent.com/-zuzwy4dS-t0/TYgyZWtvBJI/AAAAAAAAJbQ/alP5ZpSHNwM/s72-c/JavaScript+console+-+for+debugging+JavaScript+and+remote+debugging+mobile+web+apps.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0EEQX44fip7ImA9WhZTE04.&quot;"><id>tag:blogger.com,1999:blog-30404818.post-1891550285700433363</id><published>2011-03-17T00:26:00.001-05:00</published><updated>2011-03-17T00:26:40.036-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-17T00:26:40.036-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="Book Review" /><title>Book Review: Eloquent JavaScript</title><content type="html">&lt;a href="ttp://www.amazon.com/Eloquent-JavaScript-Marijn-Haverbeke/dp/1593272820" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="https://lh3.googleusercontent.com/-q4xFNpoOwL4/TYGRZrx3n5I/AAAAAAAAJbE/QFCMWpTZuSc/s200/ejs.png" style="float: left; padding: 0 15px 15px 0;" width="151" /&gt;&lt;/a&gt;&lt;h3&gt;Eloquent JavaScript: A Modern Introduction to Programming&lt;/h3&gt;&lt;br /&gt;
During my flight to and from Seattle, WA from the MVP Summit I was able to read &lt;a href="http://www.amazon.com/Eloquent-JavaScript-Marijn-Haverbeke/dp/1593272820" target="_blank"&gt;Eloquent JavaScript: A Modern Introduction to Programming&lt;/a&gt; by &lt;a href="http://marijnhaverbeke.nl/" target="_blank"&gt;Marijn Haverbeke&lt;/a&gt; (&lt;a href="http://twitter.com/marijnjh" target="_blank"&gt;@marijnjh&lt;/a&gt;). It is kind of funny to say, but for some parts of the book it almost read like a novel. Read on for more details ;)&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Table of Contents&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Basic JavaScript: Values, Variables, and Control Flow&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Data Structures: Objects and Arrays&lt;/li&gt;
&lt;li&gt;Error Handling&lt;/li&gt;
&lt;li&gt;Functional Programming&lt;/li&gt;
&lt;li&gt;Object-Oriented Programming&lt;/li&gt;
&lt;li&gt;Modualarity&lt;/li&gt;
&lt;li&gt;Regular Expressions&lt;/li&gt;
&lt;li&gt;Web Programming: A Crash Course&lt;/li&gt;
&lt;li&gt;The Document Object Model&lt;/li&gt;
&lt;li&gt;Browser Events&lt;/li&gt;
&lt;li&gt;HTTP Request&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;h3&gt;An Enjoyable Read&lt;/h3&gt;&lt;br /&gt;
I enjoy technical books anyway, but this one was quite unique. Not only did it get into the nitty gritty of JavaScript, techniques, and patterns, but it also did it in a light hearted and often times hilarious way. For example, there were two stories described in the book "Aunt Emily's Cats" and "The Sad Story of the Recluse" that really stood out to me. I don't know the last time I've read a technical book and the stories have made such an impression.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Aunt Emily's Cats&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Story: A story of a guy whose crazy Aunt has over 50 cats living with her and she regularly emails you to keep you up-to-date. At the end of each email she appends what cats have been born and which cats have died. You want to humor your Aunt by keeping track of the genealogy of her cats so that you can ask about her cats, their birthdays, etc…&lt;br /&gt;
&lt;br /&gt;
Solution: Write an algorithm to parse all the emails the Aunt sent and build up a genealogy using JavaScript and techniques that are taught along the way.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Sad Story of the Recluse&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Story: There was a recluse living in the mountains. He didn't do much, but one day he wanted to write something, so he decided to write a technical book. Instead of writing his book in HTML he decided to make up his own Markdown-ish language that he would later convert into HTML. Unfortunately, the recluse was struck by lightening and died. &lt;br /&gt;
&lt;br /&gt;
Solution: In his honor, the book guides you on how to write the program that the recluse only had dreamed.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Funny Code Examples&lt;/h3&gt;&lt;br /&gt;
Don't worry, there is no lack of code in this book. In fact some of the code is downright hilarious!&lt;br /&gt;
&lt;br /&gt;
In his explanation of the stack in JavaScript he shows asking the computer a really hard question that causes it to run out of space or "blow the stack"!&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: javascript;"&gt;function chicken() {
   return egg();
}

function egg() {
   return chicken();
}

print( chicken() + " came first." );
&lt;/pre&gt;&lt;br /&gt;
I wish I would have thought of that. A good example and funny! LOL&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Memorable Quotes&lt;/h3&gt;&lt;br /&gt;
As I wrote in my margins the following quotations from his book stood out to me, so I thought I would share them with you.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"The art of programming is the skill of controlling complexity" --Page 3&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;"Pure functions are the things that mathematicians mean when they say "function." They always return the same value when given the same argument and do not have side effects...Generally, when something can naturally be expressed as a pure function, write it that way. You'll thank  yourself later. If not, don't feel dirty for writing nonpure functions." --Page 37&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;"...[don't] worry about efficiency until your program is provably too slow. When it is, find out which parts are taking up the most time, and start exchanging elegance for efficiency in those parts." --Page 38&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;"If we build up a big string by concatenating lots of little string, new strings have to be created at every step, only to be thrown away when the next piece is concatenated to them. If, on the other hand, we store all the little strings in an array and then join them, only one big string has to be created." --Page 88&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;Summary&lt;/h3&gt;&lt;br /&gt;
I would target this book for both a beginner and intermediate developer. As I've mentioned before, the book was pretty easy to read and in some parts quite amusing ;)&lt;br /&gt;
&lt;br /&gt;
Even thought you might be tempted to skip a chapter here and there because you think you know something, I would encourage you to read it from start to end. You never what what small nuances you've been missing all these years about JavaScript.&lt;br /&gt;
&lt;br /&gt;
An older version of the material can be found free &lt;a href="http://eloquentjavascript.net/" target="_blank"&gt;online&lt;/a&gt; ( HTML/PDF ) and also a revised and updated version is available from &lt;a href="http://www.amazon.com/Eloquent-JavaScript-Marijn-Haverbeke/dp/1593272820" target="_blank"&gt;Amazon&lt;/a&gt; ( Paperback/Kindle ). &lt;br /&gt;
&lt;br /&gt;
Thanks Marijn Haverbeke for an informative and enjoyable book!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30404818-1891550285700433363?l=www.elijahmanor.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VudUfZ51gsnKOtmb6Gx0Va2rI7o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VudUfZ51gsnKOtmb6Gx0Va2rI7o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VudUfZ51gsnKOtmb6Gx0Va2rI7o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VudUfZ51gsnKOtmb6Gx0Va2rI7o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elijahmanor.com/feeds/1891550285700433363/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.elijahmanor.com/2011/03/book-review-eloquent-javascript.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/1891550285700433363?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30404818/posts/default/1891550285700433363?v=2" /><link rel="alternate" type="text/html" href="http://www.elijahmanor.com/2011/03/book-review-eloquent-javascript.html" title="Book Review: Eloquent JavaScript" /><author><name>Elijah Manor</name><uri>https://profiles.google.com/110944993173615692737</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-AtW_qomCJAo/AAAAAAAAAAI/AAAAAAAAKA4/4uIXuytCsyM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh3.googleusercontent.com/-q4xFNpoOwL4/TYGRZrx3n5I/AAAAAAAAJbE/QFCMWpTZuSc/s72-c/ejs.png" height="72" width="72" /><thr:total>0</thr:total></entry></feed>

