<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>James Padolsey&#187; Code Snippets category &#8211; James Padolsey</title>
	<atom:link href="http://james.padolsey.com/category/snippets/feed/" rel="self" type="application/rss+xml" />
	<link>http://james.padolsey.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 22 Jan 2012 17:04:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Detect IE in JS using conditional comments</title>
		<link>http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments/</link>
		<comments>http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 14:10:21 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Cool Stuff]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1659</guid>
		<description><![CDATA[A short snippet for detecting versions of IE in JavaScript without resorting to user-agent sniffing]]></description>
			<content:encoded><![CDATA[<p>I originally posted this as a gist, <a href="http://gist.github.com/527683">here</a>. I thought it best to keep my readers informed so that&#8217;s why I&#8217;m posting it here too:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="co1">// ----------------------------------------------------------</span>
<span class="co1">// A short snippet for detecting versions of IE in JavaScript</span>
<span class="co1">// without resorting to user-agent sniffing</span>
<span class="co1">// ----------------------------------------------------------</span>
<span class="co1">// If you're not in IE (or IE version is less than 5) then:</span>
<span class="co1">//     ie === undefined</span>
<span class="co1">// If you're in IE (&gt;=5) then you can determine which version:</span>
<span class="co1">//     ie === 7; // IE7</span>
<span class="co1">// Thus, to detect IE:</span>
<span class="co1">//     if (ie) {}</span>
<span class="co1">// And to detect the version:</span>
<span class="co1">//     ie === 6 // IE6</span>
<span class="co1">//     ie &gt; 7 // IE8, IE9 ...</span>
<span class="co1">//     ie &lt; 9 // Anything less than IE9</span>
<span class="co1">// ----------------------------------------------------------</span>
&nbsp;
<span class="co1">// UPDATE: Now using Live NodeList idea from @jdalton</span>
&nbsp;
<span class="kw2">var</span> ie <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
    <span class="kw2">var</span> undef<span class="sy0">,</span>
        v <span class="sy0">=</span> <span class="nu0">3</span><span class="sy0">,</span>
        div <span class="sy0">=</span> document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="sy0">,</span>
        all <span class="sy0">=</span> div.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">'i'</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">while</span> <span class="br0">&#40;</span>
        div.<span class="me1">innerHTML</span> <span class="sy0">=</span> <span class="st0">'&lt;!--[if gt IE '</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="sy0">++</span>v<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">']&gt;&lt;i&gt;&lt;/i&gt;&lt;![endif]--&gt;'</span><span class="sy0">,</span>
        all<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>
    <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">return</span> v <span class="sy0">&gt;</span> <span class="nu0">4</span> <span class="sy0">?</span> v <span class="sy0">:</span> undef<span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p class="video"><strong><a href="http://gist.github.com/527683">http://gist.github.com/527683</a></strong></p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Library foundation code</title>
		<link>http://james.padolsey.com/javascript/library-foundation-code/</link>
		<comments>http://james.padolsey.com/javascript/library-foundation-code/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 17:48:19 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[JavaScript libraries]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1527</guid>
		<description><![CDATA[It should now be universally accepted that extending the DOM directly (via <code>Element.prototype</code>, <code>Node.prototype</code> etc.) <a href="http://perfectionkills.com/whats-wrong-with-extending-the-dom/">is a bad idea</a>. To combat the inherent problems with doing this]]></description>
			<content:encoded><![CDATA[<p>It should now be universally accepted that extending the DOM directly (via <code>Element.prototype</code>, <code>Node.prototype</code> etc.) <a href="http://perfectionkills.com/whats-wrong-with-extending-the-dom/">is a bad idea</a>. To combat the inherent problems with doing this, quite a few libraries (jQuery, BBC Glow, etc.) employ the &#8220;wrapper&#8221; technique which involves taking a bunch of DOM elements and stuffing them into an array-like object that inherits from a <em>safely</em>-extendible prototype.</p>

<p>If you want to have a go at creating your own jQuery-like DOM library, here&#8217;s something to get you started:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">window.<span class="me1">myWrapper</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
    <span class="co1">// &quot;cache&quot; useful methods, so they don't</span>
    <span class="co1">// have to be resolved every time they're used</span>
    <span class="kw2">var</span> push <span class="sy0">=</span> Array.<span class="me1">prototype</span>.<span class="me1">push</span><span class="sy0">,</span>
        slice <span class="sy0">=</span> Array.<span class="me1">prototype</span>.<span class="me1">slice</span><span class="sy0">,</span>
        toString <span class="sy0">=</span> Object.<span class="me1">prototype</span>.<span class="me1">toString</span><span class="sy0">,</span>
&nbsp;
        isArray <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            toString.<span class="me1">call</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="sy0">===</span> <span class="st0">'[object Array]'</span><span class="sy0">;</span>
        <span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
        toArray <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
            <span class="kw1">try</span> <span class="br0">&#123;</span>
&nbsp;
                <span class="co1">// Return a basic slice() if the environment</span>
                <span class="co1">// is okay with converting NodeLists to</span>
                <span class="co1">// arrays using slice()</span>
&nbsp;
                slice.<span class="me1">call</span><span class="br0">&#40;</span>document.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">return</span> <span class="kw2">function</span><span class="br0">&#40;</span>arrayLike<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                    <span class="kw1">return</span> slice.<span class="me1">call</span><span class="br0">&#40;</span>arrayLike<span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
            <span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
&nbsp;
            <span class="co1">// Otherwise return the slower approach</span>
&nbsp;
            <span class="kw1">return</span> <span class="kw2">function</span><span class="br0">&#40;</span>arrayLike<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
                <span class="kw2">var</span> ret <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">,</span> i <span class="sy0">=</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">,</span> len <span class="sy0">=</span> arrayLike.<span class="me1">length</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">++</span>i <span class="sy0">&lt;</span> len<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                    ret<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">=</span> arrayLike<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
&nbsp;
                <span class="kw1">return</span> ret<span class="sy0">;</span>
&nbsp;
            <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
        <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw2">function</span> NodeList<span class="br0">&#40;</span>elems<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="kw1">this</span>.<span class="me1">length</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp;
        push.<span class="me1">apply</span><span class="br0">&#40;</span>
            <span class="kw1">this</span><span class="sy0">,</span>
            elems.<span class="me1">nodeType</span> <span class="sy0">?</span>
                <span class="br0">&#91;</span>elems<span class="br0">&#93;</span> <span class="co1">// Single node</span>
                <span class="sy0">:</span> isArray<span class="br0">&#40;</span>elems<span class="br0">&#41;</span> <span class="sy0">?</span>
                    elems <span class="co1">// Real array</span>
                    <span class="sy0">:</span> toArray<span class="br0">&#40;</span>elems<span class="br0">&#41;</span> <span class="co1">// NodeList/Array-like-object</span>
        <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw2">function</span> myWrapper<span class="br0">&#40;</span>elems<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="co1">// Instantiate and return new NodeList</span>
        <span class="kw1">return</span> <span class="kw2">new</span> NodeList<span class="br0">&#40;</span>elems<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    myWrapper.<span class="me1">NodeList</span> <span class="sy0">=</span> NodeList<span class="sy0">;</span>
&nbsp;
    NodeList.<span class="me1">prototype</span> <span class="sy0">=</span> <span class="br0">&#123;</span>
&nbsp;
        each<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>fn<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
            <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">,</span> l <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">length</span><span class="sy0">;</span> <span class="sy0">++</span>i <span class="sy0">&lt;</span> l<span class="sy0">;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                fn.<span class="me1">call</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">,</span> i<span class="sy0">,</span> l<span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
&nbsp;
            <span class="kw1">return</span> <span class="kw1">this</span><span class="sy0">;</span>
&nbsp;
        <span class="br0">&#125;</span>
&nbsp;
    <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">return</span> myWrapper<span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>There&#8217;s no selector engine, but it&#8217;s easy enough to slot one in:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw2">function</span> myWrapper<span class="br0">&#40;</span>elems<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="co1">// E.g. using Sizzle as the selector engine</span>
    <span class="kw1">return</span> <span class="kw2">new</span> NodeList<span class="br0">&#40;</span> <span class="kw1">typeof</span> elems <span class="sy0">===</span> <span class="st0">'string'</span> <span class="sy0">?</span> Sizzle<span class="br0">&#40;</span>elems<span class="br0">&#41;</span> <span class="sy0">:</span> elems <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>




<p>Example of usage:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">myWrapper<span class="br0">&#40;</span>document.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="kw3">alert</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">id</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// Etc.</span></pre></div></div>




<p>Extending <code>NodeList</code>:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">myWrapper.<span class="me1">NodeList</span>.<span class="me1">prototype</span>.<span class="me1">applyCSS</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
    <span class="kw2">var</span> hasOwn <span class="sy0">=</span> Object.<span class="me1">prototype</span>.<span class="me1">hasOwnProperty</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">return</span> <span class="kw2">function</span><span class="br0">&#40;</span>props<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">,</span> l <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">length</span><span class="sy0">;</span> <span class="sy0">++</span>i <span class="sy0">&lt;</span> l<span class="sy0">;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> p <span class="kw1">in</span> props<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">if</span> <span class="br0">&#40;</span>hasOwn.<span class="me1">call</span><span class="br0">&#40;</span>props<span class="sy0">,</span> p<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                    <span class="kw1">this</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">style</span><span class="br0">&#91;</span>p<span class="br0">&#93;</span> <span class="sy0">=</span> props<span class="br0">&#91;</span>p<span class="br0">&#93;</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">return</span> <span class="kw1">this</span><span class="sy0">;</span>
&nbsp;
    <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Usage:</span>
myWrapper<span class="br0">&#40;</span>document.<span class="me1">body</span><span class="br0">&#41;</span>.<span class="me1">applyCSS</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
    background<span class="sy0">:</span> <span class="st0">'red'</span><span class="sy0">,</span>
    color<span class="sy0">:</span> <span class="st0">'yellow'</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>


]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/library-foundation-code/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Sorting elements with jQuery</title>
		<link>http://james.padolsey.com/javascript/sorting-elements-with-jquery/</link>
		<comments>http://james.padolsey.com/javascript/sorting-elements-with-jquery/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 00:03:18 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1491</guid>
		<description><![CDATA[There are quite a few table-sorting functions/plugins out there, but I've yet to find something sufficiently low-level for general element-sorting. What I wanted was a simple jQuery plugin that would take a sorting function (just like <code>Array.prototype.sort</code>) as an argument and]]></description>
			<content:encoded><![CDATA[<p>There are quite a few table-sorting functions/plugins out there, but I&#8217;ve yet to find something sufficiently low-level for general element-sorting. What I wanted was a simple jQuery plugin that would take a sorting function (just like <code>Array.prototype.sort</code>) as an argument and sort the DOM elements in-place, and would handle situations where the elements didn&#8217;t all have the same parent.</p>

<p>To be honest, I didn&#8217;t search for very long &#8212; I prefer making this kind of stuff myself anyway &#8212; so, I present what I think is one of the simplest ways possible to implement a reliable element-sorting function. </p>

<p class="video" style="background-color:#E4F2CF;">Name changed from <code>sort</code> to <code>sortElements</code> as per <a href="http://james.padolsey.com/javascript/sorting-elements-with-jquery/comment-page-1/#comment-29421">David&#8217;s comment</a>.</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="coMULTI">/**
 * jQuery.fn.sortElements
 * --------------
 * @param Function comparator:
 *   Exactly the same behaviour as [1,2,3].sort(comparator)
 *   
 * @param Function getSortable
 *   A function that should return the element that is
 *   to be sorted. The comparator will run on the
 *   current collection, but you may want the actual
 *   resulting sort to occur on a parent or another
 *   associated element.
 *   
 *   E.g. $('td').sortElements(comparator, function(){
 *      return this.parentNode; 
 *   })
 *   
 *   The &lt;td&gt;'s parent (&lt;tr&gt;) will be sorted instead
 *   of the &lt;td&gt; itself.
 */</span>
jQuery.<span class="me1">fn</span>.<span class="me1">sortElements</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
    <span class="kw2">var</span> sort <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>.<span class="me1">sort</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">return</span> <span class="kw2">function</span><span class="br0">&#40;</span>comparator<span class="sy0">,</span> getSortable<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        getSortable <span class="sy0">=</span> getSortable <span class="sy0">||</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw1">return</span> <span class="kw1">this</span><span class="sy0">;</span><span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw2">var</span> placements <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">map</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
            <span class="kw2">var</span> sortElement <span class="sy0">=</span> getSortable.<span class="me1">call</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">,</span>
                parentNode <span class="sy0">=</span> sortElement.<span class="me1">parentNode</span><span class="sy0">,</span>
&nbsp;
                <span class="co1">// Since the element itself will change position, we have</span>
                <span class="co1">// to have some way of storing its original position in</span>
                <span class="co1">// the DOM. The easiest way is to have a 'flag' node:</span>
                nextSibling <span class="sy0">=</span> parentNode.<span class="me1">insertBefore</span><span class="br0">&#40;</span>
                    document.<span class="me1">createTextNode</span><span class="br0">&#40;</span><span class="st0">''</span><span class="br0">&#41;</span><span class="sy0">,</span>
                    sortElement.<span class="me1">nextSibling</span>
                <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">return</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
                <span class="kw1">if</span> <span class="br0">&#40;</span>parentNode <span class="sy0">===</span> <span class="kw1">this</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                    <span class="kw1">throw</span> <span class="kw2">new</span> Error<span class="br0">&#40;</span>
                        <span class="st0">&quot;You can't sort elements if any one is a descendant of another.&quot;</span>
                    <span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
&nbsp;
                <span class="co1">// Insert before flag:</span>
                parentNode.<span class="me1">insertBefore</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">,</span> nextSibling<span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="co1">// Remove flag:</span>
                parentNode.<span class="me1">removeChild</span><span class="br0">&#40;</span>nextSibling<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
        <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">return</span> sort.<span class="me1">call</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">,</span> comparator<span class="br0">&#41;</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#123;</span>
            placements<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">call</span><span class="br0">&#40;</span>getSortable.<span class="me1">call</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<h3>Features:</h3>

<ul>
<li>It&#8217;s low-level &#8212; you have control over how it sorts (see the &#8220;comparator&#8221; argument).</li>
<li>It lets you sort any arbitrary DOM nodes, as long as none of those nodes are within another one of the nodes to be sorted.</li>
<li>It lets you specify what elements will actually be moved (see the &#8220;getSortable&#8221; argument).</li>
</ul>

<h3>Usage:</h3>

<p>Assuming the following markup:</p>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span>Banana<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span>Carrot<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span>Apple<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span></pre></div></div>




<p>You could sort the items alphabetically like so:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span class="br0">&#40;</span><span class="st0">'li'</span><span class="br0">&#41;</span>.<span class="me1">sortElements</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>a<span class="sy0">,</span> b<span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="kw1">return</span> $<span class="br0">&#40;</span>a<span class="br0">&#41;</span>.<span class="me1">text</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> $<span class="br0">&#40;</span>b<span class="br0">&#41;</span>.<span class="me1">text</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">?</span> <span class="nu0">1</span> <span class="sy0">:</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>That would result in:</p>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span>Apple<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span>Banana<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span>Carrot<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span></pre></div></div>




<p><a href="http://qd9.co.uk/projects/jQuery-Plugins/sort/demo.html">See a rather basic demo here.</a></p>

<p class="video"><strong><a href="http://github.com/padolsey/jQuery-Plugins/tree/master/sortElements/"><code>jQuery.fn.sortElements</code> on Github</a></strong></p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/sorting-elements-with-jquery/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Cross-domain requests with jQuery</title>
		<link>http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/</link>
		<comments>http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 13:44:41 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[YQL]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1365</guid>
		<description><![CDATA[Chris Heilmann <a href="http://www.wait-till-i.com/2010/01/10/loading-external-content-with-ajax-using-jquery-and-yql/">recently posted</a> on how to use YQL to make cross-domain requests, which would usually be prohibited due to the same-domain-policy. I already knew about YQL, but I had no idea that it]]></description>
			<content:encoded><![CDATA[<p>Chris Heilmann <a href="http://www.wait-till-i.com/2010/01/10/loading-external-content-with-ajax-using-jquery-and-yql/">recently posted</a> on how to use YQL to make cross-domain requests, which would usually be prohibited due to the same-domain-policy. I already knew about YQL, but I had no idea that it allowed retrieval of HTML from other sites, via JSON, returned <strong>as a single string</strong>! </p>

<p>Instead of asking for <code>JSON</code> format, ask for <code>XML</code>, but also add a <code>callback</code> parameter to your query. <a href="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%20%3D%20%22http://google.com%22%20and%20xpath%3D%22*%22&#038;format=xml&#038;callback=cbfunc">Voila</a>!</p>

<p>So, in short, YQL allows us to make cross-domain GET requests!</p>

<p>Chris also posted <a href="http://icant.co.uk/articles/crossdomain-ajax-with-jquery/error-handling.html">a demo</a>!</p>

<p>With a bit of hacking, we can make jQuery work with YQL for all cross-domain GET requests. <strong>UPDATE</strong>: I&#8217;ve decided to put this in my &#8220;<a href="http://github.com/padolsey/jQuery-Plugins/">jQuery Plugins</a>&#8221; repo at Github:</p>

<p class="video">
    <strong><a href="http://github.com/padolsey/jQuery-Plugins/tree/master/cross-domain-ajax/">Cross-Domain Ajax mod @ Github</a></strong>
</p>

<p>With this mod, any GET request made via <code>jQuery.ajax</code> to another domain will work!</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span class="br0">&#40;</span><span class="st0">'#container'</span><span class="br0">&#41;</span>.<span class="me1">load</span><span class="br0">&#40;</span><span class="st0">'http://google.com'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// SERIOUSLY!</span>
&nbsp;
$.<span class="me1">ajax</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
    url<span class="sy0">:</span> <span class="st0">'http://news.bbc.co.uk'</span><span class="sy0">,</span>
    type<span class="sy0">:</span> <span class="st0">'GET'</span><span class="sy0">,</span>
    success<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>res<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw2">var</span> headline <span class="sy0">=</span> $<span class="br0">&#40;</span>res.<span class="me1">responseText</span><span class="br0">&#41;</span>.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">'a.tsh'</span><span class="br0">&#41;</span>.<span class="me1">text</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">alert</span><span class="br0">&#40;</span>headline<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Works with $.get too!</span></pre></div></div>




<p>Have fun!</p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>Simple pulse plugin for jQuery</title>
		<link>http://james.padolsey.com/javascript/simple-pulse-plugin-for-jquery/</link>
		<comments>http://james.padolsey.com/javascript/simple-pulse-plugin-for-jquery/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 21:09:08 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1305</guid>
		<description><![CDATA[A while ago I wrote a little "pulse" plugin for jQuery which would make an element pulse between two or more states. I won't bother linking to it because it's offline. I decided to have another go at developing it]]></description>
			<content:encoded><![CDATA[<p>A while ago I wrote a little &#8220;pulse&#8221; plugin for jQuery which would make an element pulse between two or more states. I won&#8217;t bother linking to it because it&#8217;s offline. I decided to have another go at developing it, this time with a more refined and intuitive API.</p>

<p>I&#8217;ve tried to emulate the characteristics of jQuery&#8217;s <code>animate()</code> method as much as possible. There are only a few slight differences. Here&#8217;s a typical call to the new &#8220;pulse&#8221; plugin:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span class="br0">&#40;</span>element<span class="br0">&#41;</span>.<span class="me1">pulse</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
    opacity<span class="sy0">:</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span>
    backgroundColor<span class="sy0">:</span> <span class="br0">&#91;</span><span class="st0">'red'</span><span class="sy0">,</span> <span class="st0">'yellow'</span><span class="br0">&#93;</span>
<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">1000</span><span class="sy0">,</span> <span class="nu0">5</span><span class="sy0">,</span> <span class="st0">'linear'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;I'm done pulsing!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>    
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>It&#8217;s almost exactly the same parameter pattern as <code>animate()</code>, except that you have to specify an array of values for each CSS property, and also an additional numerical parameter, after the duration, which signifies how many times you want the pulse to run (the above code will run the pulse five times).</p>

<p>It also works with an &#8220;options&#8221; object, just like <code>animate()</code>:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span class="br0">&#40;</span>element<span class="br0">&#41;</span>.<span class="me1">pulse</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
    opacity<span class="sy0">:</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#93;</span>
<span class="br0">&#125;</span><span class="sy0">,</span> <span class="br0">&#123;</span>
    duration<span class="sy0">:</span> <span class="nu0">100</span><span class="sy0">,</span> <span class="co1">// duration of EACH individual animation</span>
    times<span class="sy0">:</span> <span class="nu0">3</span><span class="sy0">,</span> <span class="co1">// Will go three times through the pulse array [0,1]</span>
    easing<span class="sy0">:</span> <span class="st0">'linear'</span><span class="sy0">,</span> <span class="co1">// easing function for each individual animation</span>
    complete<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;I'm done pulsing!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>You should note that the <code>duration</code> option only defines how long each individual animation will run, not the entire pulse. To dictate the length of the entire pulse you need to use the <code>times</code> option. Also note that the <code>times</code> option refers to an entire run-through of the largest array found in the properties option.</p>

<p>You can &#8220;pulse&#8221; through as many values as you want:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span class="br0">&#40;</span>element<span class="br0">&#41;</span>.<span class="me1">pulse</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
    backgroundColor<span class="sy0">:</span> <span class="br0">&#91;</span><span class="st0">'red'</span><span class="sy0">,</span> <span class="st0">'yellow'</span><span class="sy0">,</span> <span class="st0">'green'</span><span class="sy0">,</span> <span class="st0">'blue'</span><span class="br0">&#93;</span><span class="sy0">,</span>
    opacity<span class="sy0">:</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>The arrays don&#8217;t all have to be of equal length &#8211; with the above code, the opacity would keep changing as is defined by its array.</p>

<p>The plugin itself is quite small. I&#8217;ve decided to start a new repo at Github, just for small and useful jQuery plugins like this.</p>

<p class="video">
    <strong><a href="http://github.com/jamespadolsey/jQuery-Plugins/tree/master/pulse/">Pulse plugin on Github</a></strong>
</p>

<p>I haven&#8217;t tested it extensively yet, so, as usual please notify me of any bugs/issues. Thanks!</p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/simple-pulse-plugin-for-jquery/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Partial loop &#8220;unrolling&#8221;</title>
		<link>http://james.padolsey.com/javascript/partial-loop-unrolling/</link>
		<comments>http://james.padolsey.com/javascript/partial-loop-unrolling/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 09:31:49 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1215</guid>
		<description><![CDATA[In Thomas Fuchs' latest <a href="http://www.slideshare.net/madrobby/extreme-javascript-performance?src=embed">JavaScript performance presentation</a> he talks about the speed gains that can be experienced by using "unrolled" loops. ]]></description>
			<content:encoded><![CDATA[<p>In Thomas Fuchs&#8217; latest <a href="http://www.slideshare.net/madrobby/extreme-javascript-performance?src=embed">JavaScript performance presentation</a> he talks about the speed gains that can be experienced by using &#8220;unrolled&#8221; loops.</p>

<p>A conventional loop:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="nu0">10</span><span class="sy0">;</span> <span class="sy0">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    doFoo<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>




<p>The &#8220;unrolled&#8221; version of that loop:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw2">var</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span> doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span> doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span> doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span> doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span>
doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span> doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span> doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span> doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span> doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>A <em>partially</em> unrolled version:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="nu0">10</span><span class="sy0">;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
    doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span>
    doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span>
    doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span>
    doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span>
    doFoo<span class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>




<p>Interestingly, speed gains can be experienced dependent on the loop size, albeit marginal at best. I thought about ways to build this into a clever <code>forEach</code> function and came up with something that &#8216;pre-compiles&#8217; functions containing <em>partially</em> unrolled loops. Have a look:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw2">var</span> forEach <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
    <span class="kw2">var</span> fns <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">,</span>
        callers <span class="sy0">=</span> <span class="st0">&quot;true&quot;</span><span class="sy0">,</span>
        numberFn <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">,</span>
        i <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy0">;</span> i <span class="sy0">&lt;=</span> numberFn<span class="sy0">;</span> <span class="sy0">++</span>i <span class="br0">&#41;</span> <span class="br0">&#123;</span>
        callers <span class="sy0">+=</span> <span class="st0">&quot;&amp;&amp;f(a[++i])!==false&quot;</span><span class="sy0">;</span>
        fns<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw2">new</span> <span class="kw2">Function</span><span class="br0">&#40;</span><span class="st0">&quot;a&quot;</span><span class="sy0">,</span> <span class="st0">&quot;f&quot;</span><span class="sy0">,</span> <span class="st0">&quot;l&quot;</span><span class="sy0">,</span> <span class="st0">&quot;var i=0;while (i&lt;l) {&quot;</span><span class="sy0">+</span>callers<span class="sy0">+</span><span class="st0">&quot;}&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">return</span> <span class="kw2">function</span><span class="br0">&#40;</span> array<span class="sy0">,</span> fn <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="kw2">var</span> len <span class="sy0">=</span> array.<span class="me1">length</span><span class="sy0">,</span>
            n <span class="sy0">=</span> numberFn<span class="sy0">,</span> i<span class="sy0">;</span>
&nbsp;
        <span class="kw1">while</span> <span class="br0">&#40;</span>i <span class="sy0">=</span> n<span class="sy0">--</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span> len <span class="sy0">%</span> i <span class="sy0">===</span> <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">return</span> fns<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#40;</span>array<span class="sy0">,</span> fn<span class="sy0">,</span> len<span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
&nbsp;
    <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>This function will run one of 10 &#8216;pre-compiled&#8217; functions on the passed array, dependent on the highest factor of the array&#8217;s length. I&#8217;m only creating 10 different functions in this example, you could create more.</p>

<p>If you were to pass an array with a length of 14, then <code>fns[7]</code> would be used, since 7 is the highest available factor (the highest number below 10 that 14 can be divided by, to gain a whole number). <code>fns[7]</code> looks something like this:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw2">function</span> anonymous<span class="br0">&#40;</span>a<span class="sy0">,</span> f<span class="sy0">,</span> l<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw2">var</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
    <span class="kw1">while</span> <span class="br0">&#40;</span>i <span class="sy0">&lt;</span> l<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw2">true</span> <span class="sy0">&amp;&amp;</span>
            f<span class="br0">&#40;</span>a<span class="br0">&#91;</span><span class="sy0">++</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span>
            f<span class="br0">&#40;</span>a<span class="br0">&#91;</span><span class="sy0">++</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span>
            f<span class="br0">&#40;</span>a<span class="br0">&#91;</span><span class="sy0">++</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span>
            f<span class="br0">&#40;</span>a<span class="br0">&#91;</span><span class="sy0">++</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span>
            f<span class="br0">&#40;</span>a<span class="br0">&#91;</span><span class="sy0">++</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span>
            f<span class="br0">&#40;</span>a<span class="br0">&#91;</span><span class="sy0">++</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span>
            f<span class="br0">&#40;</span>a<span class="br0">&#91;</span><span class="sy0">++</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>




<p>The <code>!== false</code> part is used to create the effect of loop-breaking. Notice that the success of this boolean expression is depended upon to continue the chain of expressions (<code>a &#038;&#038; b &#038;&#038; c</code>)</p>

<p>I&#8217;ve only tested it briefly, and to be honest, there doesn&#8217;t seem to be a notable benefit. In IE, I can see a bit of improvement over the conventional <code>forEach</code> implementation but only if I&#8217;m using arrays with 1000+ lengths. I think this would only be useful in situations where you absolutely have to squeeze every inch of potential performance out of your app. Anyway, it&#8217;s still pretty interesting, I wonder what other fancy things can be created by using pre-compiled functions.</p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/partial-loop-unrolling/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>JavaScript comment removal &#8211; revisited</title>
		<link>http://james.padolsey.com/javascript/javascript-comment-removal-revisted/</link>
		<comments>http://james.padolsey.com/javascript/javascript-comment-removal-revisted/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 18:00:11 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Comments]]></category>
		<category><![CDATA[Regular Expressions]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1176</guid>
		<description><![CDATA[A while ago I posted a method I had been using at the time to remove comments from JavaScript code. It was pretty decent - instead of using a regular expression it steps through each character and removes comments where it finds them]]></description>
			<content:encoded><![CDATA[<p>A while ago I <a href="http://james.padolsey.com/javascript/removing-comments-in-javascript/">posted a method</a> I had been using at the time to remove comments from JavaScript code. It was pretty decent &#8211; instead of using a regular expression it steps through each character and removes comments where it finds them.</p>

<p>At the time I thought stepping through a string character-by-character was the only <em>reliable</em> way to solve the &#8220;comments problem&#8221; but after giving it another attempt I found that it was possible with a only a few regular expressions and a fairly moderate dose of JavaScript&#8217;s <code>replace()</code> function.</p>

<p><strong>Here it is</strong>:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw2">function</span> removeComments<span class="br0">&#40;</span>str<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
    <span class="kw2">var</span> uid <span class="sy0">=</span> <span class="st0">'_'</span> <span class="sy0">+</span> <span class="sy0">+</span><span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>
        primatives <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">,</span>
        primIndex <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">return</span> <span class="br0">&#40;</span>
        str
        <span class="co2">/* Remove strings */</span>
        .<span class="me1">replace</span><span class="br0">&#40;</span><span class="co2">/(['&quot;])(\\\1|.)+?\1/g</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>match<span class="br0">&#41;</span><span class="br0">&#123;</span>
            primatives<span class="br0">&#91;</span>primIndex<span class="br0">&#93;</span> <span class="sy0">=</span> match<span class="sy0">;</span>
            <span class="kw1">return</span> <span class="br0">&#40;</span>uid <span class="sy0">+</span> <span class="st0">''</span><span class="br0">&#41;</span> <span class="sy0">+</span> primIndex<span class="sy0">++;</span>
        <span class="br0">&#125;</span><span class="br0">&#41;</span>
&nbsp;
        <span class="co2">/* Remove Regexes */</span>
        .<span class="me1">replace</span><span class="br0">&#40;</span><span class="co2">/([^\/])(\/(?!\*|\/)(\\\/|.)+?\/[gim]{0,3})/g</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>match<span class="sy0">,</span> $<span class="nu0">1</span><span class="sy0">,</span> $<span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
            primatives<span class="br0">&#91;</span>primIndex<span class="br0">&#93;</span> <span class="sy0">=</span> $<span class="nu0">2</span><span class="sy0">;</span>
            <span class="kw1">return</span> $<span class="nu0">1</span> <span class="sy0">+</span> <span class="br0">&#40;</span>uid <span class="sy0">+</span> <span class="st0">''</span><span class="br0">&#41;</span> <span class="sy0">+</span> primIndex<span class="sy0">++;</span>
        <span class="br0">&#125;</span><span class="br0">&#41;</span>
&nbsp;
        <span class="coMULTI">/*
        - Remove single-line comments that contain would-be multi-line delimiters
            E.g. // Comment /* &lt;--
        - Remove multi-line comments that contain would be single-line delimiters
            E.g. /* // &lt;-- 
       */</span>
        .<span class="me1">replace</span><span class="br0">&#40;</span><span class="co2">/\/\/.*?\/?\*.+?(?=\n|\r|$)|\/\*[\s\S]*?\/\/[\s\S]*?\*\//g</span><span class="sy0">,</span> <span class="st0">''</span><span class="br0">&#41;</span>
&nbsp;
        <span class="coMULTI">/*
        Remove single and multi-line comments,
        no consideration of inner-contents
       */</span>
        .<span class="me1">replace</span><span class="br0">&#40;</span><span class="co2">/\/\/.+?(?=\n|\r|$)|\/\*[\s\S]+?\*\//g</span><span class="sy0">,</span> <span class="st0">''</span><span class="br0">&#41;</span>
&nbsp;
        <span class="coMULTI">/*
        Remove multi-line comments that have a replaced ending (string/regex)
        Greedy, so no inner strings/regexes will stop it.
       */</span>
        .<span class="me1">replace</span><span class="br0">&#40;</span>RegExp<span class="br0">&#40;</span><span class="st0">'<span class="es0">\\</span>/<span class="es0">\\</span>*[<span class="es0">\\</span>s<span class="es0">\\</span>S]+'</span> <span class="sy0">+</span> uid <span class="sy0">+</span> <span class="st0">'<span class="es0">\\</span>d+'</span><span class="sy0">,</span> <span class="st0">'g'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st0">''</span><span class="br0">&#41;</span>
&nbsp;
        <span class="co2">/* Bring back strings &amp; regexes */</span>
        .<span class="me1">replace</span><span class="br0">&#40;</span>RegExp<span class="br0">&#40;</span>uid <span class="sy0">+</span> <span class="st0">'(<span class="es0">\\</span>d+)'</span><span class="sy0">,</span> <span class="st0">'g'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>match<span class="sy0">,</span> n<span class="br0">&#41;</span><span class="br0">&#123;</span>
            <span class="kw1">return</span> primatives<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span><span class="br0">&#41;</span>
    <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div>




<p>Theoretically this should work perfectly in almost all situations. Don&#8217;t bother even trying it with <a href="http://en.wikipedia.org/wiki/ECMAScript_for_XML">E4X</a> as that definitely won&#8217;t work! E.g.</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw2">var</span> someE4X <span class="sy0">=</span> <span class="sy0">&lt;</span>box<span class="sy0">&gt;</span><span class="co1">// this is NOT a comment&lt;/box&gt;;</span></pre></div></div>




<p>It&#8217;s impossible to cater to E4X with regular expressions because XML is a recursive structure. I&#8217;m not bothered though as E4X isn&#8217;t exactly a widely used extension. It also doesn&#8217;t play well with conditional compilation but frankly, conditional compilation shouldn&#8217;t exist anyway.</p>

<p>Anyway, back to the solution. It takes a pretty conventional approach of removing all strings and regular expressions first and then moving on to the comments. Unfortunately comments are not as simple as <code>\/\*.+?\*\/</code> &#8211; there are nested comments within strings, nested comments within literal-regular-expressions and nested comments within other comments.</p>

<span id="more-1176"></span>

<p>The only part of my solution which might need further explanation is the following expression:</p>


<div class="wp_syntax"><div class="code"><pre class="regex" style="font-family:monospace;">/\/\/.*?\/?\*.+?(?=\n|\r)|\/\*[\s\S]*?\/\/[\s\S]*?\*\//g</pre></div></div>




<p>This regex searches for single-line or multi-line comments that have the starting delimiter of the other type of comment within. For example:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="coMULTI">/*
    This is a multi-line comment
    // Still a multi-line comment
*/</span>
&nbsp;
<span class="co1">// This is a single-line comment /* ...still a single-line comment</span></pre></div></div>




<p>These two situations need to be catered to so that the subsequently executed regular expression doesn&#8217;t remove the wrong parts of such comments.</p>

<p>I&#8217;ve tested it with the following JavaScript and it works perfectly:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="st0">'string<span class="es0">\'</span> // still a string'</span><span class="sy0">;</span> <span class="co1">// comment /* not-a-nested-comment</span>
<span class="co2">/regex/</span><span class="sy0">;</span> <span class="co1">// comment */* still-a-comment</span>
<span class="st0">' /**/ string '</span> <span class="coMULTI">/* &quot;comment...&quot;
// still-a-comment */</span> <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">'This isn<span class="es0">\'</span>t a comment!'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co2">/\/* this isn't a comment! */</span><span class="sy0">;</span> <span class="co1">//* comment</span>
<span class="coMULTI">/*
    //a comment... // still-a-comment
    12345
    &quot;Foo /bar/ &quot;&quot;
*/</span>
<span class="coMULTI">/*//Boo*/</span>
<span class="coMULTI">/*/**/</span></pre></div></div>




<p class="video"><strong><a href="http://james.padolsey.com/demos/comment-removal-js.html">Try the demo</a></strong>!</p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/javascript-comment-removal-revisted/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Contextual SCRIPT tags</title>
		<link>http://james.padolsey.com/javascript/contextual-script-tags/</link>
		<comments>http://james.padolsey.com/javascript/contextual-script-tags/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 22:41:49 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Idea]]></category>
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1156</guid>
		<description><![CDATA[Here's a nifty little trick that allows you to write "contextual" JavaScript. It's incredibly obtrusive and probably shouldn't be used at all but it's still a pretty cool idea]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a nifty little trick that allows you to write &#8220;contextual&#8221; JavaScript. It&#8217;s <em>incredibly</em> obtrusive and probably shouldn&#8217;t be used at all but it&#8217;s still a pretty cool idea:</p>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;some-div&quot;</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;:contextual&quot;</span>&gt;</span>
        alert(this.id); // &quot;some-div&quot; is alerted
    <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span></pre></div></div>




<p>Instead of the <code>this</code> keyword referencing the global object (<code>window</code>) we can make it reference the <code>parentNode</code> of the script element. Here&#8217;s the code that makes it work:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
    <span class="kw2">var</span> scripts <span class="sy0">=</span> document.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">'script'</span><span class="br0">&#41;</span><span class="sy0">,</span>
        script<span class="sy0">,</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">while</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span>script <span class="sy0">=</span> scripts<span class="br0">&#91;</span>i<span class="sy0">++</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="co2">/:contextual$/</span>.<span class="me1">test</span><span class="br0">&#40;</span>script.<span class="me1">type</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="br0">&#40;</span><span class="kw2">new</span> <span class="kw2">Function</span><span class="br0">&#40;</span>script.<span class="me1">innerHTML</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">call</span><span class="br0">&#40;</span>script.<span class="me1">parentNode</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>Take it or leave it! &#8211; I&#8217;m indifferent either way &#8211; yes, it&#8217;s obtrusive but you&#8217;ve got to admit, contextual JavaScript looks pretty neat!</p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/contextual-script-tags/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Satisfy that selector!</title>
		<link>http://james.padolsey.com/javascript/satisfy-that-selector/</link>
		<comments>http://james.padolsey.com/javascript/satisfy-that-selector/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 17:27:21 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1149</guid>
		<description><![CDATA[<strong><em>Satisfy</em></strong> is a development-only jQuery plugin that you can use to quickly generate HTML for testing/debugging. The idea is that you provide a CSS selector and then the plugin will "satisfy" it by generating an HTML structure in accordance with that selector]]></description>
			<content:encoded><![CDATA[<p><strong><em>Satisfy</em></strong> is a development-only <del datetime="2009-08-23T20:46:24+00:00">jQuery plugin</del><strong>*</strong> that you can use to quickly generate HTML for testing/debugging. The idea is that you provide a CSS selector and then the plugin will &#8220;satisfy&#8221; it by generating an HTML structure in accordance with that selector.</p>

<p class="video">* &#8211; UPDATE: This is no longer <em>just</em> a jQuery plugin &#8211; as of version <strong>0.2</strong> <strong><em><a href="http://github.com/jamespadolsey/satisfy/tree/master">Satisfy</a></em></strong> has no dependencies. See the comments for more info.</p>

<p>For example:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span class="br0">&#40;</span><span class="st0">'div a'</span><span class="br0">&#41;</span>.<span class="me1">satisfy</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>&#8230; would return the following HTML structure:</p>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span></pre></div></div>




<p>A more snazzy example:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span class="br0">&#40;</span><span class="st0">'ul li:5 span[innerHTML=&quot;link&quot;]'</span><span class="br0">&#41;</span>.<span class="me1">satisfy</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>&#8230; which would return the following:</p>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">span</span>&gt;</span>link<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">span</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">span</span>&gt;</span>link<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">span</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">span</span>&gt;</span>link<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">span</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">span</span>&gt;</span>link<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">span</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
    <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">span</span>&gt;</span>link<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">span</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span></pre></div></div>




<p>(<em>Note: It ignores combinators (+|~|>) and pseudo-classes (:pseudo). It adds support for numerical pseudo-classes (e.g. &#8220;:5&#8243;) which you can use to specify how many of a particular element you want.</em>)</p>

<p>More information and source available at Github &#8211; <a href="http://github.com/jamespadolsey/satisfy/tree/master"><strong>&#8220;satisfy&#8221; @ GitHub</strong></a></p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/satisfy-that-selector/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>jQuery.fn.map enhancement</title>
		<link>http://james.padolsey.com/javascript/jqueryfnmap-enhancement/</link>
		<comments>http://james.padolsey.com/javascript/jqueryfnmap-enhancement/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 22:16:43 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=1055</guid>
		<description><![CDATA[This is not a suggestion for the jQuery core; it's just something I required recently that some of you may find useful/intriguing]]></description>
			<content:encoded><![CDATA[<p>This is not a suggestion for the jQuery core; it&#8217;s just something I required recently that some of you may find useful/intriguing&#8230;</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery.<span class="me1">fn</span>.<span class="me1">map</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>_map<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">return</span> <span class="kw2">function</span><span class="br0">&#40;</span>toMap<span class="sy0">,</span> prop<span class="sy0">,</span> jQueryOb<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">typeof</span> toMap <span class="sy0">===</span> <span class="st0">'string'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
            <span class="kw2">var</span> parts <span class="sy0">=</span> toMap.<span class="me1">match</span><span class="br0">&#40;</span><span class="co2">/(\\:|[^:])+/g</span><span class="br0">&#41;</span><span class="sy0">,</span>
                method <span class="sy0">=</span> parts.<span class="me1">shift</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>
                args <span class="sy0">=</span> parts<span class="sy0">,</span>
                mapped <span class="sy0">=</span> _map.<span class="me1">call</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
                    <span class="kw2">var</span> $this <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">,</span>
                        result <span class="sy0">=</span> $this<span class="br0">&#91;</span>method<span class="br0">&#93;</span>.<span class="me1">apply</span><span class="br0">&#40;</span> $this<span class="sy0">,</span> args <span class="br0">&#41;</span><span class="sy0">;</span>
                    <span class="kw1">return</span> prop <span class="sy0">?</span> result<span class="br0">&#91;</span>prop<span class="br0">&#93;</span> <span class="sy0">:</span> result<span class="sy0">;</span>
                <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">return</span> jQueryOb <span class="sy0">?</span> mapped <span class="sy0">:</span> mapped.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
            <span class="kw1">return</span> _map.<span class="me1">apply</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">,</span> arguments<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
    <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span>jQuery.<span class="me1">fn</span>.<span class="me1">map</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Note: this only modifies $.fn.map; not $.map</span></pre></div></div>




<p>It allows you to pass a string to <code>$(collection).map(...)</code> instead of a function; it&#8217;s useful for returning attributes, DOM properties, CSS styles or data tied to each element without having to spend time/space writing a function, e.g.</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span class="br0">&#40;</span><span class="st0">'a'</span><span class="br0">&#41;</span>.<span class="me1">map</span><span class="br0">&#40;</span><span class="st0">'attr:href'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// =&gt; ['http://abc.com', 'http://123.com', ... (all HREFs)</span>
$<span class="br0">&#40;</span><span class="st0">'p'</span><span class="br0">&#41;</span>.<span class="me1">map</span><span class="br0">&#40;</span><span class="st0">'css:fontSize'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// =&gt; ['16px', '12px', '19px' ... (all font-sizes)</span>
$<span class="br0">&#40;</span><span class="st0">'.class'</span><span class="br0">&#41;</span>.<span class="me1">map</span><span class="br0">&#40;</span><span class="st0">'offset'</span><span class="sy0">,</span> <span class="st0">'left'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// =&gt; ['200px', '430px', ... (all left offsets)</span>
$<span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span>.<span class="me1">map</span><span class="br0">&#40;</span><span class="st0">'data:someData'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// =&gt; ['data', ... (added via jQuery.fn.data)</span></pre></div></div>




<p>The first argument is split at each colon (use <code>\</code> to escape a colon), the first part of the split string is assumed to be the jQuery method name which you want to call (e.g. <code>"css" => $().css()</code>). All remaining parts are assumed to be arguments for that method. The second argument (to <code>map()</code>) is an optional property to access following retrieval; this is demonstrated with the &#8220;offset&#8221; example in the code above. The last argument is a boolean; passing true will make it return a jQuery object instead of a real array.</p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/jqueryfnmap-enhancement/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

