version of jQuery core Performance improvements and bug fixes are usually made between each version Older versions (eg. 1.4.2) won’t offer these instant benefits
equally Fastest to slowest selectors are: ◦ The ID Selectors (“#AnElementWithID”) ◦ Element selectors (“form”, “input”, etc.) ◦ Class selectors (“.someClass”) ◦ Pseudo & Attribute selectors (“:visible, :hidden, [attribute=value] etc.”) ID and element are fastest as backed by native DOM operations.
be run against all the elements in your search space Pseudo/Attrib selectors have no browser-based call to take advantage of if ( jQuery.expr && jQuery.expr.filters ) { jQuery.expr.filters.hidden = function( elem ) { var width = elem.offsetWidth, height = elem.offsetHeight; return (width === 0 && height === 0) || (! jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css ( elem, "display" )) === "none"); }; jQuery.expr.filters.visible = function( elem ) { return !jQuery.expr.filters.hidden( elem ); }; }
search of the DOM and return a new collection Bad! - use caching! (ie. parents. find(‘.child’)) You can then do whatever.show()/hide/stuff to your heart’s content. var parents = $(‘.parents’); var children = $(‘.parents’).find(‘.child’) //bad
Object and support chaining After you’ve run a method on your selection, you can continue running more! Less code, easier to write and it runs faster! var parents = $(‘.parents’).doSomething().doSomethingElse();
do you REALLY know the differences? Delegates let you attach an event handler to a common parent of your elements rather than a discrete one to each of them Also fires for NEW DOM nodes too Use when binding same handler to multiple elements
treat it like one, but that doesn’t make it so Every DOM insertion is costly Minimize by building HTML strings and using single a single append() as late as possible Use detach() if doing heavy interaction with a node then re-insert it when done
If not necessary, avoid loops. They’re slow in every programming language If possible, use the selector engine instead to address the elements that are needed There *are* places where loops can’t be substituted but try your best to optimize
default values in an array*/ var defaultSettings = {}; defaultSettings['carModel'] = 'Mercedes'; defaultSettings['carYear’] = 2010; defaultSettings['carMiles'] = 5000; defaultSettings['carTint'] = 'Metallic Blue'; /*Let's do something with this data if a checkbox is clicked*/ $('.someCheckbox').click(function(){ if (this.checked){ $('#input_carModel').val(activeSettings.carModel); $('#input_carYear').val(activeSettings.carYear); $('#input_carMiles').val(activeSettings.carMiles); $('#input_carTint').val(activeSettings.carTint); } else { $('#input_carModel').val(''); $('#input_carYear').val(''); $('#input_carMiles').val(''); $('#input_carTint).val(''); } });
var checked = this.checked; /* What are we repeating? 1. input_ precedes each field name 2. accessing the same array for settings 3. repeating value resets What can we do? 1. programmatically generate the field names 2. access array by key 3. merge this call using terse coding (ie. if checked, set a value, otherwise don't) */ $.each(['carModel', 'carYear', 'carMiles', 'carTint'], function(i,key){ $('#input_' + v).val(checked ? defaultSettings[key] : ''); }); });
to create tests comparing the perf of different JS snippets Uses Benchmark.js - a neat benchmarking utility that works cross-platform Easy to share your code or modify other tests