jQuery Tips and Tricks

JavascriptJquery

Javascript Problem Overview


Syntax

Data Storage

Optimization

Miscellaneous

Javascript Solutions


Solution 1 - Javascript

Creating an HTML Element and keeping a reference

var newDiv = $("<div />");

newDiv.attr("id", "myNewDiv").appendTo("body");

/* Now whenever I want to append the new div I created, 
   I can just reference it from the "newDiv" variable */


Checking if an element exists

if ($("#someDiv").length)
{
    // It exists...
}


Writing your own selectors

$.extend($.expr[":"], {
    over100pixels: function (e)
    {
        return $(e).height() > 100;
    }
});

$(".box:over100pixels").click(function ()
{
    alert("The element you clicked is over 100 pixels height");
});

Solution 2 - Javascript

jQuery's data() method is useful and not well known. It allows you to bind data to DOM elements without modifying the DOM.

Solution 3 - Javascript

Nesting Filters

You can nest filters (as https://stackoverflow.com/questions/382301/jquery-accordion-close-then-open#382828">nickf showed here).

.filter(":not(:has(.selected))")

Solution 4 - Javascript

I'm really not a fan of the $(document).ready(fn) shortcut. Sure it cuts down on the code but it also cuts way down on the readability of the code. When you see $(document).ready(...), you know what you're looking at. $(...) is used in far too many other ways to immediately make sense.

If you have multiple frameworks you can use jQuery.noConflict(); as you say, but you can also assign a different variable for it like this:

var $j = jQuery.noConflict();

$j("#myDiv").hide();

Very useful if you have several frameworks that can be boiled down to $x(...)-style calls.

Solution 5 - Javascript

Ooooh, let's not forget jQuery metadata! The data() function is great, but it has to be populated via jQuery calls.

Instead of breaking W3C compliance with custom element attributes such as:

<input 
  name="email" 
  validation="required" 
  validate="email" 
  minLength="7" 
  maxLength="30"/> 

Use metadata instead:

<input 
  name="email" 
  class="validation {validate: email, minLength: 2, maxLength: 50}" />

<script>
    jQuery('*[class=validation]').each(function () {
        var metadata = $(this).metadata();
        // etc.
    });
</script>

Solution 6 - Javascript

Live Event Handlers

Set an event handler for any element that matches a selector, even if it gets added to the DOM after the initial page load:

$('button.someClass').live('click', someFunction);

This allows you to load content via ajax, or add them via javascript and have the event handlers get set up properly for those elements automatically.

Likewise, to stop the live event handling:

$('button.someClass').die('click', someFunction);

These live event handlers have a few limitations compared to regular events, but they work great for the majority of cases.

For more info see the jQuery Documentation.

UPDATE: live() and die() are deprecated in jQuery 1.7. See http://api.jquery.com/on/ and http://api.jquery.com/off/ for similar replacement functionality.

UPDATE2: live() has been long deprecated, even before jQuery 1.7. For versions jQuery 1.4.2+ before 1.7 use delegate() and undelegate(). The live() example ($('button.someClass').live('click', someFunction);) can be rewritten using delegate() like that: $(document).delegate('button.someClass', 'click', someFunction);.

Solution 7 - Javascript

Replace anonymous functions with named functions. This really supercedes the jQuery context, but it comes into play more it seems like when using jQuery, due to its reliance on callback functions. The problems I have with inline anonymous functions, are that they are harder to debug (much easier to look at a callstack with distinctly-named functions, instead 6 levels of "anonymous"), and also the fact that multiple anonymous functions within the same jQuery-chain can become unwieldy to read and/or maintain. Additionally, anonymous functions are typically not re-used; on the other hand, declaring named functions encourages me to write code that is more likely to be re-used.

An illustration; instead of:

$('div').toggle(
    function(){
        // do something
    },
    function(){
        // do something else
    }
);

I prefer:

function onState(){
    // do something
}

function offState(){
    // do something else
}

$('div').toggle( offState, onState );

Solution 8 - Javascript

Defining properties at element creation

In jQuery 1.4 you can use an object literal to define properties when you create an element:

var e = $("<a />", { href: "#", class: "a-class another-class", title: "..." });

... You can even add styles:

$("<a />", {
    ...
    css: {
        color: "#FF0000",
        display: "block"
    }
});

Here's a http://api.jquery.com/jQuery/#jQuery2">link to the documentation.

Solution 9 - Javascript

instead of using a different alias for the jQuery object (when using noConflict), I always write my jQuery code by wrapping it all in a closure. This can be done in the document.ready function:

var $ = someOtherFunction(); // from a different library

jQuery(function($) {
    if ($ instanceOf jQuery) {
        alert("$ is the jQuery object!");
    }
});

alternatively you can do it like this:

(function($) {
    $('...').etc()    // whatever jQuery code you want
})(jQuery);

I find this to be the most portable. I've been working on a site which uses both Prototype AND jQuery simultaneously and these techniques have avoided all conflicts.

Solution 10 - Javascript

Check the Index

jQuery has .index but it is a pain to use, as you need the list of elements, and pass in the element you want the index of:

var index = e.g $('#ul>li').index( liDomObject );

The following is much easier:

If you want to know the index of an element within a set (e.g. list items) within a unordered list:

$("ul > li").click(function () {
    var index = $(this).prevAll().length;
});

Solution 11 - Javascript

Shorthand for the ready-event

The explicit and verbose way:

$(document).ready(function ()
{
    // ...
});

The shorthand:

$(function ()
{
    // ...
});

Solution 12 - Javascript

On the core jQuery function, specify the context parameter in addition to the selector parameter. Specifying the context parameter allows jQuery to start from a deeper branch in the DOM, rather than from the DOM root. Given a large enough DOM, specifying the context parameter should translate to performance gains.

Example: Finds all inputs of type radio within the first form in the document.

$("input:radio", document.forms[0]);

Reference: http://docs.jquery.com/Core/jQuery#expressioncontext

Solution 13 - Javascript

Not really jQuery only but I made a nice little bridge for jQuery and MS AJAX:

Sys.UI.Control.prototype.j = function Sys$UI$Control$j(){
  return $('#' + this.get_id());
}

It's really nice if you're doing lots of ASP.NET AJAX, since jQuery is supported by MS now having a nice bridge means it's really easy to do jQuery operations:

$get('#myControl').j().hide();

So the above example isn't great, but if you're writing ASP.NET AJAX server controls, makes it easy to have jQuery inside your client-side control implementation.

Solution 14 - Javascript

Optimize performance of complex selectors

Query a subset of the DOM when using complex selectors drastically improves performance:

var subset = $("");

$("input[value^='']", subset);

Solution 15 - Javascript

Speaking of Tips and Tricks and as well some tutorials. I found these series of tutorials (“jQuery for Absolute Beginners” Video Series) by Jeffery Way are VERY HELPFUL.

It targets those developers who are new to jQuery. He shows how to create many cool stuff with jQuery, like animation, Creating and Removing Elements and more...

I learned a lot from it. He shows how it's easy to use jQuery. Now I love it and i can read and understand any jQuery script even if it's complex.

Here is one example I like "Resizing Text"

1- jQuery...

<script language="javascript" type="text/javascript">
	$(function() {
		$('a').click(function() {
			var originalSize = $('p').css('font-size'); // get the font size 
			var number = parseFloat(originalSize, 10); // that method will chop off any integer from the specified variable "originalSize"
			var unitOfMeasure = originalSize.slice(-2);// store the unit of measure, Pixle or Inch

			$('p').css('font-size', number / 1.2 + unitOfMeasure);
			if(this.id == 'larger'){$('p').css('font-size', number * 1.2 + unitOfMeasure);}// figure out which element is triggered
		 });		
	 });
</script>

2- CSS Styling...

<style type="text/css" >
body{ margin-left:300px;text-align:center; width:700px; background-color:#666666;}
.box {width:500px; text-align:justify; padding:5px; font-family:verdana; font-size:11px; color:#0033FF; background-color:#FFFFCC;}
</style>

2- HTML...

<div class="box">
    <a href="#" id="larger">Larger</a> | 
    <a href="#" id="Smaller">Smaller</a>
    <p>
    In today’s video tutorial, I’ll show you how to resize text every time an associated anchor tag is clicked. We’ll be examining the “slice”, “parseFloat”, and “CSS” Javascript/jQuery methods. 
    </p>
</div>

Highly recommend these tutorials...

http://blog.themeforest.net/screencasts/jquery-for-absolute-beginners-video-series/

Solution 16 - Javascript

Asynchronous each() function

If you have really complex documents where running the jquery each() function locks up the browser during the iteration, and/or Internet Explorer pops up the 'do you want to continue running this script' message, this solution will save the day.

jQuery.forEach = function (in_array, in_pause_ms, in_callback)
{
    if (!in_array.length) return; // make sure array was sent

    var i = 0; // starting index
 
    bgEach(); // call the function

    function bgEach()
    {
        if (in_callback.call(in_array[i], i, in_array[i]) !== false)
        {
            i++; // move to next item

            if (i < in_array.length) setTimeout(bgEach, in_pause_ms);
        }
    }

    return in_array; // returns array
};


jQuery.fn.forEach = function (in_callback, in_optional_pause_ms)
{
    if (!in_optional_pause_ms) in_optional_pause_ms = 10; // default
    
    return jQuery.forEach(this, in_optional_pause_ms, in_callback); // run it
};


The first way you can use it is just like each():

$('your_selector').forEach( function() {} );

An optional 2nd parameter lets you specify the speed/delay in between iterations which may be useful for animations (the following example will wait 1 second in between iterations):

$('your_selector').forEach( function() {}, 1000 );

Remember that since this works asynchronously, you can't rely on the iterations to be complete before the next line of code, for example:

$('your_selector').forEach( function() {}, 500 );
// next lines of code will run before above code is complete


I wrote this for an internal project, and while I am sure it can be improved, it worked for what we needed, so hope some of you find it useful. Thanks -

Solution 17 - Javascript

Syntactic shorthand-sugar-thing--Cache an object collection and execute commands on one line:

Instead of:

var jQueryCollection = $("");

jQueryCollection.command().command();

I do:

var jQueryCollection = $("").command().command();

A somewhat "real" use case could be something along these lines:

var cache = $("#container div.usehovereffect").mouseover(function ()
{
    cache.removeClass("hover").filter(this).addClass("hover");
});

Solution 18 - Javascript

I like declare a $this variable at the beginning of anonymous functions, so I know I can reference a jQueried this.

Like so:

$('a').each(function() {
    var $this = $(this);

    // Other code
});

Solution 19 - Javascript

Save jQuery Objects in Variables for Reuse

Saving a jQuery object to a variable lets you reuse it without having to search back through the DOM to find it.

(As @Louis suggested, I now use $ to indicate that a variable holds a jQuery object.)

// Bad: searching the DOM multiple times for the same elements
$('div.foo').each...
$('div.foo').each...

// Better: saving that search for re-use
var $foos = $('div.foo');
$foos.each...
$foos.each...

As a more complex example, say you've got a list of foods in a store, and you want to show only the ones that match a user's criteria. You have a form with checkboxes, each one containing a criteria. The checkboxes have names like organic and lowfat, and the products have corresponding classes - .organic, etc.

var $allFoods, $matchingFoods;
$allFoods = $('div.food');

Now you can keep working with that jQuery object. Every time a checkbox is clicked (to check or uncheck), start from the master list of foods and filter down based on the checked boxes:

// Whenever a checkbox in the form is clicked (to check or uncheck)...
$someForm.find('input:checkbox').click(function(){

  // Start out assuming all foods should be showing
  // (in case a checkbox was just unchecked)
  var $matchingFoods = $allFoods;

  // Go through all the checked boxes and keep only the foods with
  // a matching class 
  this.closest('form').find("input:checked").each(function() {  
     $matchingFoods = $matchingFoods.filter("." + $(this).attr("name")); 
  });

  // Hide any foods that don't match the criteria
  $allFoods.not($matchingFoods).hide();
});

Solution 20 - Javascript

It seems that most of the interesting and important tips have been already mentioned, so this one is just a little addition.

The little tip is the jQuery.each(object, callback) function. Everybody is probably using the jQuery.each(callback) function to iterate over the jQuery object itself because it is natural. The jQuery.each(object, callback) utility function iterates over objects and arrays. For a long time, I somehow did not see what it could be for apart from a different syntax (I don’t mind writing all fashioned loops), and I’m a bit ashamed that I realized its main strength only recently.

The thing is that since the body of the loop in jQuery.each(object, callback) is a function, you get a new scope every time in the loop which is especially convenient when you create closures in the loop.

In other words, a typical common mistake is to do something like:

var functions = [];
var someArray = [1, 2, 3];
for (var i = 0; i < someArray.length; i++) {
    functions.push(function() { alert(someArray[i]) });
}

Now, when you invoke the functions in the functions array, you will get three times alert with the content undefined which is most likely not what you wanted. The problem is that there is just one variable i, and all three closures refer to it. When the loop finishes, the final value of i is 3, and someArrary[3] is undefined. You could work around it by calling another function which would create the closure for you. Or you use the jQuery utility which it will basically do it for you:

var functions = [];
var someArray = [1, 2, 3];
$.each(someArray, function(item) {
    functions.push(function() { alert(item) });
});

Now, when you invoke the functions you get three alerts with the content 1, 2 and 3 as expected.

In general, it is nothing you could not do yourself, but it’s nice to have.

Solution 21 - Javascript

Access jQuery functions as you would an array

Add/remove a class based on a boolean...

function changeState(b)
{
    $("selector")[b ? "addClass" : "removeClass"]("name of the class");
}

Is the shorter version of...

function changeState(b)
{
    if (b)
    {
        $("selector").addClass("name of the class");
    }
    else
    {
        $("selector").removeClass("name of the class");
    }
}

Not that many use-cases for this. Never the less; I think it's neat :)


Update

Just in case you are not the comment-reading-type, ThiefMaster points out that the http://api.jquery.com/toggleClass/">toggleClass accepts a boolean value, which determines if a class should be added or removed. So as far as my example code above goes, this would be the best approach...

$('selector').toggleClass('name_of_the_class', true/false);

Solution 22 - Javascript

Remove elements from a collection and preserve chainability

Consider the following:

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
    <li>Five</li>
</ul>


$("li").filter(function()
{
    var text = $(this).text();

    // return true: keep current element in the collection
    if (text === "One" || text === "Two") return true;

    // return false: remove current element from the collection
    return false;
}).each(function ()
{
    // this will alert: "One" and "Two"       
    alert($(this).text());
});

The filter() function removes elements from the jQuery object. In this case: All li-elements not containing the text "One" or "Two" will be removed.

Solution 23 - Javascript

Update:

Just include this script on the site and you’ll get a Firebug console that pops up for debugging in any browser. Not quite as full featured but it’s still pretty helpful! Remember to remove it when you are done.

<script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>

Check out this link:

http://css-tricks.com/snippets/html/use-firebug-in-any-browser/">From CSS Tricks

Update: I found something new; its the the JQuery Hotbox.

http://www.s3maphor3.org/demo/hotbox/">JQuery Hotbox

Google hosts several JavaScript libraries on Google Code. Loading it from there saves bandwidth and it loads quick cos it has already been cached.

<script src="http://www.google.com/jsapi"></script>  
<script type="text/javascript">  
  
    // Load jQuery  
    google.load("jquery", "1.2.6");  
  
    google.setOnLoadCallback(function() {  
        // Your code goes here.  
    });  
         
</script>

Or

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>

You can also use this to tell when an image is fully loaded.

$('#myImage').attr('src', 'image.jpg').load(function() {  
    alert('Image Loaded');  
});

The "console.info" of firebug, which you can use to dump messages and variables to the screen without having to use alert boxes. "console.time" allows you to easily set up a timer to wrap a bunch of code and see how long it takes.

console.time('create list');

for (i = 0; i < 1000; i++) {
    var myList = $('.myList');
    myList.append('This is list item ' + i);
}

console.timeEnd('create list');

Solution 24 - Javascript

Use filtering methods over pseudo selectors when possible so jQuery can use querySelectorAll (which is much faster than sizzle). Consider this selector:

$('.class:first')

The same selection can be made using:

$('.class').eq(0)

Which is must faster because the initial selection of '.class' is QSA compatible

Solution 25 - Javascript

Changing the type of an input element

I ran into this issue when I was trying to change the type of an input element already attached to the DOM. You have to clone the existing element, insert it before the old element, and then delete the old element. Otherwise it doesn't work:

var oldButton = jQuery("#Submit");
var newButton = oldButton.clone();

newButton.attr("type", "button");
newButton.attr("id", "newSubmit");
newButton.insertBefore(oldButton);
oldButton.remove();
newButton.attr("id", "Submit");

Solution 26 - Javascript

Judicious use of third-party jQuery scripts, such as form field validation or url parsing. It's worth seeing what's about so you'll know when you next encounter a JavaScript requirement.

Solution 27 - Javascript

Line-breaks and chainability

When chaining multiple calls on collections...

$("a").hide().addClass().fadeIn().hide();

You can increase readability with linebreaks. Like this:

$("a")
.hide()
.addClass()
.fadeIn()
.hide();

Solution 28 - Javascript

Use .stop(true,true) when triggering an animation prevents it from repeating the animation. This is especially helpful for rollover animations.

$("#someElement").hover(function(){
    $("div.desc", this).stop(true,true).fadeIn();
},function(){
    $("div.desc", this).fadeOut();
});

Solution 29 - Javascript

Using self-executing anonymous functions in a method call such as .append() to iterate through something. I.E.:

$("<ul>").append((function ()
{
    var data = ["0", "1", "2", "3", "4", "5", "6"],
        output = $("<div>"),
        x = -1,
        y = data.length;

    while (++x < y) output.append("<li>" + info[x] + "</li>");

    return output.children();
}()));

I use this to iterate through things that would be large and uncomfortable to break out of my chaining to build.

Solution 30 - Javascript

This one goes out to https://stackoverflow.com/users/7586/kobi">Kobi</a>;.

Consider the following snippet of code:

// hide all elements which contains the text "abc"
$("p").each(function ()
{
    var that = $(this);

    if (that.text().indexOf("abc") > -1) that.hide();
});    

Here's a shorthand... which is about twice as fast:

$("p.value:contains('abc')").hide();

Solution 31 - Javascript

HTML5 data attributes support, on steroids!

The http://api.jquery.com/data/">data function has been mentioned before. With it, you are able to associate data with DOM elements.

Recently the jQuery team has added support for http://dev.w3.org/html5/spec/elements.html#embedding-custom-non-visible-data-with-the-data-attributes">HTML5 custom data-* attributes. And as if that wasn't enough; they've force-fed the data function with steroids, which means that you are able to store complex objects in the form of JSON, directly in your markup.

The HTML:

<p data-xyz = '{"str": "hi there", "int": 2, "obj": { "arr": [1, 2, 3] } }' />


The JavaScript:

var data = $("p").data("xyz");

data.str // "hi there"
typeof data.str // "string"

data.int + 2 // 4
typeof data.int // "number"

data.obj.arr.join(" + ") + " = 6" // "1 + 2 + 3 = 6"
typeof data.obj.arr // "object" ... Gobbles! Errrghh!

Solution 32 - Javascript

Add a selector for elements above the fold

As a jQuery selector plugin

 $.extend($.expr[':'], {
 "aboveFold": function(a, i, m) {
   var container = m[3],
   var fold;
  if (typeof container === "undefined") {
     fold = $(window).height() + $(window).scrollTop();
  } else {
     if ($(container).length == 0 || $(container).offset().top == null) return false;
     fold = $(container).offset().top + $(container).height();
  }
  return fold >= $(a).offset().top;
 } 
});

Usage:

$("p:aboveFold").css({color:"red"});

Thx to http://flowcoder.com/scottymac">scottymac</a>

Solution 33 - Javascript

(This is a shamless plug)

Instead of writing repetitive form handling code, you can try out this plugin I wrote that adds to the fluent API of jQuery by adding form related methods:

// elementExists is also added
if ($("#someid").elementExists())
  alert("found it");
        
// Select box related
$("#mydropdown").isDropDownList();

// Can be any of the items from a list of radio boxes - it will use the name
$("#randomradioboxitem").isRadioBox("myvalue");
$("#radioboxitem").isSelected("myvalue");

// The value of the item selected. For multiple selects it's the first value
$("#radioboxitem").selectedValue();

// Various, others include password, hidden. Buttons also
$("#mytextbox").isTextBox();
$("#mycheck").isCheckBox();
$("#multi-select").isSelected("one", "two", "three");

// Returns the 'type' property or 'select-one' 'select-multiple'
var fieldType = $("#someid").formElementType();

Solution 34 - Javascript

On a more fundamental and high-level note, you could try to emulate the basic selector mechanism of jQuery by writing your own little framework (it's simpler than it sounds). Not only will it improve your Javascript no end, it will also help you to understand just why jQuery's $("#elementId") is many times faster than $(".elementClass") and is also faster than $("element#elementId") (which is perhaps on the surface counter-intuitive).

This will also force you to learn about object oriented Javascript which will help you to organise your code in a more modular fashion, thereby avoiding the spaghetti code nature that heavy jQuery script blocks can take on.

Solution 35 - Javascript

Access iFrame Elements Iframes aren’t the best solution to most problems, but when you do need to use one it’s very handy to know how to access the elements inside it with Javascript. jQuery’s contents() method makes this a breeze, enabling us to load the iframe’s DOM in one line like this:

$(function(){
	var iFrameDOM = $("iframe#someID").contents();
	//Now you can use <strong>find()</strong> to access any element in the iframe:
 
	iFrameDOM.find(".message").slideUp();
	//Slides up all elements classed 'message' in the iframe
});

source

Solution 36 - Javascript

The "ends with" element selector is great for ASP.NET web forms development because you don't need to worry about the prepended ctl00 silliness:

$("[id$='txtFirstName']");

As noted in the comments, this selector (as with any layer of abstraction) can be slow if used without care. Prefer to scope the selector to some containing element, e.g.,

$(".container [id$='txtFirstName']");

to reduce the number of required elements to traverse.

jQuery documentation

Solution 37 - Javascript

No-conflict mode

jQuery.noConflict();

> "Run this function to give control of the $ variable back to whichever library first implemented it. This helps to make sure that jQuery doesn't conflict with the $ object of other libraries. > > By using this function, you will only be able to access jQuery using the jQuery variable. For example, where you used to do $("div p"), you now must do jQuery("div p")".

Solution 38 - Javascript

Increment Row Index in name

Here is a neat way to increment a row index of a cloned input element if your input element name contains a row index like '0_row':

$(this).attr('name', $(this).attr('name').replace(/^\d+/, function(n){ return ++n; }));

The cloned element's name will now be '1_row'

Solution 39 - Javascript

A shameless plug... http://roosteronacid.com/blog/index.php/2011/02/10/the-jquery-template-plug-in-implementing-complex-logic-using-render-functions/">The jQuery template plug-in: implementing complex logic using render-functions

> The new jQuery template plug-in is > awesome. That being said, the > double-curly brace template-tags are > not exactly my cup of tea. In a more > complex template the tags obscure the > templates markup, and implementing > logic past simple if/else statements > is a pain. > > After messing around with the plug-in > for a few hours, my head began to hurt > from trying to distinguish the markup > in my template from the millions of > double curly braces. > > So I popped an aspirin and began work > on an alternative

Solution 40 - Javascript

Bind to an event and execute the event handler immediately:

$('selector').bind('change now', function () { // bind to two events: 'change' and 'now'
    // update other portions of the UI
}).trigger('now'); // 'now' is a custom event

This is like

function update() {
    // update other portions of the UI
}
$('selector').change(update);
update();

but without the need to create a separate named function.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncllpseView Question on Stackoverflow
Solution 1 - JavascriptAndreas GrechView Answer on Stackoverflow
Solution 2 - JavascriptclawrView Answer on Stackoverflow
Solution 3 - JavascriptNathan LongView Answer on Stackoverflow
Solution 4 - JavascriptOliView Answer on Stackoverflow
Solution 5 - JavascriptFilip DupanovićView Answer on Stackoverflow
Solution 6 - JavascriptTM.View Answer on Stackoverflow
Solution 7 - JavascriptkenView Answer on Stackoverflow
Solution 8 - JavascriptcllpseView Answer on Stackoverflow
Solution 9 - JavascriptnickfView Answer on Stackoverflow
Solution 10 - JavascriptredsquareView Answer on Stackoverflow
Solution 11 - JavascriptcllpseView Answer on Stackoverflow
Solution 12 - JavascriptmshafrirView Answer on Stackoverflow
Solution 13 - JavascriptAaron PowellView Answer on Stackoverflow
Solution 14 - JavascriptcllpseView Answer on Stackoverflow
Solution 15 - JavascriptegyamadoView Answer on Stackoverflow
Solution 16 - JavascriptOneNerdView Answer on Stackoverflow
Solution 17 - JavascriptcllpseView Answer on Stackoverflow
Solution 18 - JavascriptBen CrouseView Answer on Stackoverflow
Solution 19 - JavascriptNathan LongView Answer on Stackoverflow
Solution 20 - JavascriptJan ZichView Answer on Stackoverflow
Solution 21 - JavascriptcllpseView Answer on Stackoverflow
Solution 22 - JavascriptcllpseView Answer on Stackoverflow
Solution 23 - JavascriptOrsonView Answer on Stackoverflow
Solution 24 - JavascriptRalph HolzmannView Answer on Stackoverflow
Solution 25 - JavascriptVivin PaliathView Answer on Stackoverflow
Solution 26 - JavascriptharriyottView Answer on Stackoverflow
Solution 27 - JavascriptcllpseView Answer on Stackoverflow
Solution 28 - JavascriptKenneth JView Answer on Stackoverflow
Solution 29 - JavascriptRixiusView Answer on Stackoverflow
Solution 30 - JavascriptcllpseView Answer on Stackoverflow
Solution 31 - JavascriptcllpseView Answer on Stackoverflow
Solution 32 - JavascriptadardesignView Answer on Stackoverflow
Solution 33 - JavascriptChris SView Answer on Stackoverflow
Solution 34 - JavascriptrbgingeView Answer on Stackoverflow
Solution 35 - JavascriptShahinView Answer on Stackoverflow
Solution 36 - JavascriptbttView Answer on Stackoverflow
Solution 37 - JavascriptcllpseView Answer on Stackoverflow
Solution 38 - JavascriptadamView Answer on Stackoverflow
Solution 39 - JavascriptcllpseView Answer on Stackoverflow
Solution 40 - JavascriptngnView Answer on Stackoverflow