SlideShare una empresa de Scribd logo
1 de 68
jQuery Anti-Patterns for
Performance &
Compression
Paul Irish
NC JavaScript Camp ’10
jQuery Anti-Patterns for
Performance &
Compression
Paul Irish
NC JavaScript Camp ’10
Me.
Interaction Designer at Molecular, Inc.
jQuery Team Member - Dev. Relations



     @paul_irish

http://paulirish.com Front-end development blog

http://aurgasm.us Eclectic music blog
Performance
Performance
wassup shawty? how u doin’
                  Taskspeed Test Lines of Code
200



150



100



50



 0
      YUI   Dojo 1.3.1 Dojo 1.2.3 Qooxdoo MooTools Prototype.js   jQuery   PureDOM
Oft cited best practices
 Cache length during loops
 Cache your selections
 Leverage documentFragment
 Append new content outside the loop
Oft cited best practices
 Cache length during loops
// appending inside. bad.
$.each(reallyLongArray, function(count, item) {
 Cache your selections
    var newLI = '<li>' + item + '</li>';
 Leverage documentFragment
    $('#ballers').append(newLI);
});
 Append new content outside the loop
// documentFragment off-DOM
var frag = document.createDocumentFragment();
$.each(reallyLongArray, function(count, item) {
    var newLI = '<li>' + item + '</li>';
    frag.appendChild(newLI[0]);
});
$('#ballers')[0].appendChild(frag);
var newLI = '<li>' + item + '</li>';
      $('#ballers').append(newLI);
});
Oft cited best practices
// documentFragment off-DOM
var frag = document.createDocumentFragment();
 Cache length during loops
$.each(reallyLongArray, function(count, item) {
    var newLI = '<li>' + item + '</li>';
 Cache your selections
    frag.appendChild(newLI[0]);
});
 Leverage documentFragment
$('#ballers')[0].appendChild(frag);
 Append new content outside the loop
// string concatenate and set innerHTML
var myhtml = '';
$.each(reallyLongArray, function(count, item) {
    myhtml += '<li>' + item + '</li>';
});
$('#ballers').html(myhtml);
Keep things DRY


 If you’re repeating
 yourself, you’re doing it
 wrong
Moar DRY plz?

if ($ventfade.data('currently') != 'showing') {
  $ventfade.stop();
}
if ($venthover.data('currently') != 'showing') {
  $venthover.stop();
}
if ($spans.data('currently') != 'showing') {
  $spans.stop();
}



                       from http://mt-ventures.com/_js/global.js
All clean! Thx

var elems = [$ventfade,$venthover,$spans];

$.each(elems,function(k,v){
    if (v.data('currently') != 'showing'){
         v.stop();
    }
})
Architecture Anti-Patterns
 Anonymous functions bound everywhere suck

$(document).ready(function(){
    ...
    $('#magic').click(function(e){

            $('#yayeffects').slideUp(function(){
                ...
            });
      });

      $('#happiness').load(url+' #unicorns',function(){
          ...
      })
});
Architecture - Object Literal
var PI = {
  onReady   : function(){
      ...
      $('#magic').click(PI.candyMtn);
      $('#happiness').load(url+' #unicorns',PI.unicornCb);
  },
  candyMtn : function(e){
     $('#yayeffects').slideUp(PI.slideCb);
  },
  slideCb   : function(){
      ...
  },
  unicornCb : function(){
      ...
  }
}

$(document).ready(PI.onReady);
Architecture - Object Literal
 Advantages:
  Easier to navigate and discuss
  Profilers give you actual names to work with
  You can execute these from firebug console
  You can write unit tests against them
Anti-Pattern: The requery
// create and append your element
$(document.body).append("<div class='baaron'/>");
// requery to bind stuff
$("div.baaron").click(function(){});




// better:
// swap to appendTo to hold your elem
$("<div class='baaron'/>")
    .appendTo(document.body)
    .click(function(){});
$(‘#whats .the’,context)
This is not the .context property

  // find all stylesheets in the body
  var bodySheets = $('style',document.body);
  bodySheets.context // ==> BODY element


  Ignore that for the moment, I know no one that’s
  found a use
$(‘#whats .the’,context)
 Never pass it a selector string. Ever.
 No performance gain vs $(root).find(selector)

   var arms = $('div.robotarm', '#container');
   // instead do:
   var arms = $('#container').find('div.robotarm');
$(‘#whats .the’,context)
 You typically pass it this, but it’s purely a
 convenience to avoid find()

 $('form.comments',this).submit(captureSubmit);
 // exact same as
 $(this).find('form.comments').submit(captureSubmit);


 Which is more readable?

$('.reply_form', $(this).closest('.comment')).hide();

$(this).closest('.comment').find('.reply_form').hide();
The Crowd Say Bo Selector
Come on, my selector
Selector engines have come a long, long way.
Come on, my selector
Selector engines have come a long, long way.
Come on, my selector
Engines work in different ways
Top-down, bottom-up, function creation, other crazy shit


// from NWMatcher:

// selecting '.outmost #outer span'


T=e.nodeName;if(T=="SPAN"||T=="span")
{while((e=e.parentNode)&&e.nodeType==1)
{if((n=e.getAttributeNode("id"))&&n.value=="outer")
{if((e=e.parentNode)&&e.nodeType==1)
{C=e.className;if(C&&(" "+C+" ").indexOf(" outmost ")>-1)
{r[X++]=N;continue main;}}}}}
Selector engines, parse direction
 Left to right (Top-down)      Right to left (Bottom-up)

        Mootools                           Sizzle

           Sly                             YUI 3

         Peppy                         NWMatcher

       Dojo Acme

         Ext JS

      Prototype.js
                        details: http://alexsexton.com/selectors/
Selector engines, parse direction
  div.data table.attendees .gonzalez

 Left to right (Top-down)      Right to left (Bottom-up)

        Mootools                           Sizzle

           Sly                             YUI 3

         Peppy                         NWMatcher

       Dojo Acme

         Ext JS

      Prototype.js
                        details: http://alexsexton.com/selectors/
Selector engines, parse direction
 Left to right (Top-down)      Right to left (Bottom-up)

        Mootools                           Sizzle

           Sly                             YUI 3

         Peppy                         NWMatcher

       Dojo Acme

         Ext JS

      Prototype.js
                        details: http://alexsexton.com/selectors/
Selector engines, parse direction
 Left to right (Top-down)      Right to left (Bottom-up)

        Mootools                           Sizzle

           Sly                             YUI 3

         Peppy                         NWMatcher

       Dojo Acme                 querySelectorAll (qSA)

         Ext JS

      Prototype.js
                        details: http://alexsexton.com/selectors/
Selector Optimization
 Specific on the right, light on the left


 // let's find scott
 div.data .gonzalez

 // specific on right, light on the left
 .data td.gonzalez


 tag.class if possible on your right-most selector.
 just tag or just .class on left.
Selector Optimization
 Of course, descending from an #id is best


// basic #id-based selector
var arms = $('#container div.robotarm');

// hyper-optimized #id case first, then find:
var arms = $('#container').find('div.robotarm');
Selector Optimization
 Don’t be needlessly specific

 // let's find scott
 .data table.attendees td.gonzalez

 // better: drop the middle
 .data td.gonzalez




A flatter DOM helps, so move to HTML5
   Also a wider range of tags speeds up filters
Selector Optimization
 Avoid the universal selector
 Avoid the implied universal selector

 $('.buttons > *') // terribly costly
 $('.buttons').children() // much better




 $('.gender :radio') // implied universal
 $('.gender *:radio') // exact same, explicit now
 $('.gender input:radio') // much better
Selector Optimization
 Google PageSpeed’s efficient selectors analysis
 MDC: Writing Efficient CSS
  https://developer.mozilla.org/en/Writing_Efficient_CSS

 Benchmark.js
  http://code.paulirish.com/sandbox/benchmark.js
Event Delegation

 function delegate(type, delegate, handler) {
     return $(document).bind(type, function(event) {
         var target = $(event.target);
         if (target.is(delegate)) {
             return handler.apply(target, arguments);
         }
     });
 }

 delegate('click','td.jehl',createRockstar);

 // and with live():
 $('td.jehl').live('click',createRockstar);
Event Delegation
live() isn’t just for dynamic content
Speeds up page load
  Only one event handler is bound vs many
Good for >3 elements all getting the same handler

 // using live(), skipping selection on load
 var jqElem = $(document);
 jqElem.selector = 'li.ui';
 jqElem.live('dblclick', dblhandler);
Event Delegation
live() isn’t just for dynamic content
Speeds up page load
  Only one event handler is bound vs many
Good for >3 elements all getting the same handler

 // using live(), skipping selection on load
 var jqElem = $(document);
 jqElem.selector = 'li.ui';
 jqElem.live('dblclick', dblhandler);
Event Delegation
   delegate() bakes in huge performance gains
   explicit context reduces overhead by ~80%
   Use it instead of live() if possible


// awkward but equivalent
$('a.trigger',$('#container')[0]).live('click',handlerFn)

// so damn fine
$('#container').delegate('click','a.trigger',handlerFn)
Event Delegation                               new
                                                1.4     in
                                                    .2!
   delegate() bakes in huge performance gains
   explicit context reduces overhead by ~80%
   Use it instead of live() if possible


// awkward but equivalent
$('a.trigger',$('#container')[0]).live('click',handlerFn)

// so damn fine
$('#container').delegate('click','a.trigger',handlerFn)
The DOM is slow
Pull elements off the DOM while you toy with them

var table = $('#some-table');
var parent = table.parent();

table.detach();
table.addLotsAndLotsOfRows();
parent.append(table);
The DOM is slow
Pull elements off the DOM while you toy with them

var table = $('#some-table');
var parent = table.parent();
                                         new
table.detach();
                                       in 1
                                            .4
table.addLotsAndLotsOfRows();
parent.append(table);
Minimize DOM touches
       Use classes, but if a style change user-selected:

  jQuery('a.swedberg').css('color', '#BADA55');

  jQuery('<style type="text/css"> a.swedberg { color: BADA55; } </style>')
    .appendTo('head');




3000                                                     Timings for X elements

2250                                                     (1000 iterations)

1500                                                         css()
                                                             style tag
750
  0
       1        5           10          20          50
Minimize DOM touches
Don’t treat jQuery as a Black Box
 Use the source as your documentation
 Add this to your bookmark bar, NOW!
   http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js
   http://bit.ly/jqsource
 Determine which are convenience methods:
   getScript: function( url, callback ) {
       return jQuery.get(url, null, callback, "script");
   },
   getJSON: function( url, data, callback ) {
       return jQuery.get(url, data, callback, "json");
   },
Don’t treat jQuery as a Black Box
 Learn the lesser-known methods

   map(), slice(), stop(), (de)queue(),
   prevAll(), pushStack(), inArray() , etc

 // index() in jQuery <= 1.3.2
 $('#rdworth').parent().children().index( $('#rdworth')[0] )

 // using prevAll() is 10% faster (also sexier)
 $('#rdworth').prevAll().length

 // in jQuery 1.4
 $('#rdworth').index()
Don’t act on absent elements
 jQuery is very kind and doesn’t throw errors at you
 Don’t assume it’s just fine to do


   $('#doesntexist').slideUp()
   // this will execute genFx(), speed() and animate()
   //   before it hits an each()


 jQuery UI widgets have a lot of overhead you’ll hit
Don’t act on absent elements

 jQuery.fn.doOnce = function(func){
     this.length && func.apply(this);
     return this;
 }


 $('li.cartitems').doOnce(function(){
     // make it ajax! o/
 });
Don’t act on absent elements


 $.fn.plugin = function(opts){
    if(!this.length) return this;
    var opts = $.extend(......
    ...
    return this.each(...
Setter Methods



view-source:setters.js
new
New Element Creation                        1.4
                                                !
                                                  in

jQuery("<div/>", {
    id: "foo",
    rel : "something"
    css: {
        height: "50px",
        width: "50px",
        color: "blue",
        backgroundColor: "#ccc"
    },
    click: function() {
       $(this).css("backgroundColor", "red");
    }
}).appendTo("body");
new
eq(), first(), last()                1.4
                                         !
                                           in




var lastelem = $elems.eq(-1); // get() too!



$('#nav li:first') === $('#nav li').first()

$('#nav li:last') === $('#nav li').last()
Data()

// regular:
$(elem).data(key,value);

// omg like 10x faster:
$.data(elem,key,value);
Compression
Compression
YUI Compressor
  Sits on Rhino.
Comments, whitespace, variable replacement


//it already does these micro-optimizations:
object['prop'] ==> object.prop
{'key':123} ==> {key:123}
'jon's apostophes' ==> "jon's apostrophes"
'bigass ' + 'string' ==> 'bigass string'
Variable definition

// old 'n busted            // new hotness
var test1 = 1;              var test1 = 1,
var test2 = function() {        test2 = function() {
    // function code                // function code
};                              },
var test3 = test2(test1);       test3 = test2(test1);
Munge the primitives
Define shortcuts at the top of your scope
  Good for both compression and scope chain traversal



var TRUE = true,
    FALSE = false,
    NULL = null,
    window = self,
    undefined = undefined;
Munge the primitives
Define shortcuts at the top of your scope
  Good for both compression and scope chain traversal



var TRUE = true,
    FALSE = false,
    NULL = null,
    window = self,
    undefined;
    undefined = undefined;
Munge the primitives

(function(){
   var window = this, document = document,
undefined;
   /* code */
})();


(function(window, document, undefined){
   /* code */
})(this,this.document);
var str=‘Let’s put this into
action’

 // html.no-js html>
 <!doctype ==> html.js
 var elem = document.getElementsByTagName('html')[0];
 elem.className = elem.className.replace('no-js','js');
 <html class="no-js">
 // quicker reference, safer replace
 <head>
 var elem = document.documentElement;
 elem.className = elem.className.replace(/bno-jsb/,'js');
    <script>
 // one// change the html class to 'js'
        line ftw!
       // in the head, no FOUC
 document.documentElement.className =
 document.documentElement.className.replace(/bno-jsb/,
    </script>
 'js');
 </body>
 // shorter with a self-executing anonymous function
 (function(B){B.className=B.className.replace(/bno-jsb/,
var str=‘Let’s put this into
action’

 // html.no-js ==> html.js
 var elem = document.getElementsByTagName('html')[0];
 elem.className = elem.className.replace('no-js','js');

 // quicker reference, safer replace
 var elem = document.documentElement;
 elem.className = elem.className.replace(/bno-jsb/,'js');

 // one line ftw!
 document.documentElement.className =
 document.documentElement.className.replace(/bno-jsb/,
 'js');

 // shorter with a self-executing anonymous function
 (function(B){B.className=B.className.replace(/bno-jsb/,
// html.no-js ==> html.js

var str=‘Let’s put this into
var elem = document.getElementsByTagName('html')[0];
elem.className = elem.className.replace('no-js','js');

action’
// quicker reference, safer replace
var elem = document.documentElement;
elem.className = elem.className.replace(/bno-jsb/,'js');

// one line ftw!
document.documentElement.className =
document.documentElement.className.replace(/bno-jsb/,
'js');

// shorter with a self-executing anonymous function
(function(B){B.className=B.className.replace(/bno-jsb/,
'js')})(document.documentElement);

// pass className, object string notation
(function(H,C){H[C]=H[C].replace(/bno-jsb/,'js')})
(document.documentElement,'className')
Conditionals


// old 'n busted
if ( type === 'foo' || type === 'bar' ) {}

// regex test
if ( /^(foo|bar)$/.test(type) ) {}

// obj literal lookup (smaller if <5 items)
if ( ({foo:1,bar:1})[type] ) {}
Logic and Ternary operands
// basic function detection
document.querySelectorAll && document.querySelectorAll('a:nth-child(2)')

// assignment is legal, but it evaluates to the right expression
callback && (isCallbackCalled = true) && callback(returnVal);

// call or cache the callback function
(isCallbackCalled || returnVal) ? fn(returnVal) : (callback = fn);

// inline function calls
isToday('Saturday') && Math.round(Math.random()) && $('#winnar').show()

// if JSON2.js or Native JSON is present, otherwise eval.
data = window.JSON && JSON.parse(data) || eval('('+data +')');
Write maintainable code
                   As a developer,

       you should work first   and foremost
            for the user of your products.

  The second most important person to work for is

        the developer that takes over from you.
                                   - Christian Heilmann
Comments
/*!
 * Will not be removed by YUI Compressor
 */



// for quick toggling on and off:
/* */
 aaaahYeah();
/* */

/* * /
 ohHellNo();
/* */
Compression Tools
CompressorRater
  http://compressorrater.thruhere.net/
YUI Compressor front-end
  http://refresh-sf.com/yui/
Thanks, ya’ll.
 Slides at http://paulirish.com/perf


      @paul_irish




thx:
 Alex Sexton, Ben Alman, Adam Sontag,
 James Padolsey, temp01, #jquery on Freenode
todo
shadow effect to code samples
more context research and this: http://
groups.google.com/group/jquery-dev/msg/
b4b7935a4013dfe7 and http://ispeakwebstuff.co.uk/
web-design-development-tutorials/clever-jquery-
selectors/
`
    // pngfix for IE6
    // e.g. FL.pngfix('img.bigProdShot,a.thumb');
    pngfix : function(sel){
      // conditional comments for inclusion of that js.
      if (typeof DD_belatedPNG == 'undefined'){ return;
      } else {
        // delay pngfix until window onload
        $(window).load(function(){ $(sel).each(function()
    { DD_belatedPNG.fixPng(arguments[1]); }); });
      }
    } // end of FL.pngfix()

Más contenido relacionado

La actualidad más candente

Using Objects to Organize your jQuery Code
Using Objects to Organize your jQuery CodeUsing Objects to Organize your jQuery Code
Using Objects to Organize your jQuery CodeRebecca Murphey
 
JavaScript and HTML5 - Brave New World (revised)
JavaScript and HTML5 - Brave New World (revised)JavaScript and HTML5 - Brave New World (revised)
JavaScript and HTML5 - Brave New World (revised)Robert Nyman
 
An Introduction to Jquery
An Introduction to JqueryAn Introduction to Jquery
An Introduction to JqueryPhil Reither
 
The Spirit of Testing
The Spirit of TestingThe Spirit of Testing
The Spirit of TestingMarco Cedaro
 
Using Templates to Achieve Awesomer Architecture
Using Templates to Achieve Awesomer ArchitectureUsing Templates to Achieve Awesomer Architecture
Using Templates to Achieve Awesomer ArchitectureGarann Means
 
Advanced jQuery
Advanced jQueryAdvanced jQuery
Advanced jQuerysergioafp
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony AppsKris Wallsmith
 
Write Less Do More
Write Less Do MoreWrite Less Do More
Write Less Do MoreRemy Sharp
 
Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)brockboland
 
Jquery Best Practices
Jquery Best PracticesJquery Best Practices
Jquery Best Practicesbrinsknaps
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Bongwon Lee
 
Learning jQuery in 30 minutes
Learning jQuery in 30 minutesLearning jQuery in 30 minutes
Learning jQuery in 30 minutesSimon Willison
 
Prototype & jQuery
Prototype & jQueryPrototype & jQuery
Prototype & jQueryRemy Sharp
 

La actualidad más candente (20)

Using Objects to Organize your jQuery Code
Using Objects to Organize your jQuery CodeUsing Objects to Organize your jQuery Code
Using Objects to Organize your jQuery Code
 
The jQuery Divide
The jQuery DivideThe jQuery Divide
The jQuery Divide
 
jQuery Basic API
jQuery Basic APIjQuery Basic API
jQuery Basic API
 
JavaScript and HTML5 - Brave New World (revised)
JavaScript and HTML5 - Brave New World (revised)JavaScript and HTML5 - Brave New World (revised)
JavaScript and HTML5 - Brave New World (revised)
 
An Introduction to Jquery
An Introduction to JqueryAn Introduction to Jquery
An Introduction to Jquery
 
The Spirit of Testing
The Spirit of TestingThe Spirit of Testing
The Spirit of Testing
 
Using Templates to Achieve Awesomer Architecture
Using Templates to Achieve Awesomer ArchitectureUsing Templates to Achieve Awesomer Architecture
Using Templates to Achieve Awesomer Architecture
 
Advanced jQuery
Advanced jQueryAdvanced jQuery
Advanced jQuery
 
jQuery Essentials
jQuery EssentialsjQuery Essentials
jQuery Essentials
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony Apps
 
Write Less Do More
Write Less Do MoreWrite Less Do More
Write Less Do More
 
Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)
 
Jquery Best Practices
Jquery Best PracticesJquery Best Practices
Jquery Best Practices
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9
 
Learning jQuery in 30 minutes
Learning jQuery in 30 minutesLearning jQuery in 30 minutes
Learning jQuery in 30 minutes
 
Jquery Fundamentals
Jquery FundamentalsJquery Fundamentals
Jquery Fundamentals
 
Matters of State
Matters of StateMatters of State
Matters of State
 
JQuery Basics
JQuery BasicsJQuery Basics
JQuery Basics
 
YUI on the go
YUI on the goYUI on the go
YUI on the go
 
Prototype & jQuery
Prototype & jQueryPrototype & jQuery
Prototype & jQuery
 

Destacado

Apple a český mobilní život
Apple a český mobilní životApple a český mobilní život
Apple a český mobilní životTomas Pflanzer
 
зайны сургалт
зайны сургалтзайны сургалт
зайны сургалтZaya80
 
All 10 finished document and prompt
All 10 finished document and promptAll 10 finished document and prompt
All 10 finished document and promptjt861906mhs
 
Q1 2012 Investment Outlook: Are the Nightmares Behind Us?
Q1 2012 Investment Outlook: Are the Nightmares Behind Us?Q1 2012 Investment Outlook: Are the Nightmares Behind Us?
Q1 2012 Investment Outlook: Are the Nightmares Behind Us?NAFCU Services Corporation
 
Moved to Care launch presentations
Moved to Care launch presentationsMoved to Care launch presentations
Moved to Care launch presentationsILC- UK
 
7 Ways to Boost Email Campaign Conversion
7 Ways to Boost Email Campaign Conversion7 Ways to Boost Email Campaign Conversion
7 Ways to Boost Email Campaign ConversionEmail Delivered
 
Exploring patterns of expenditure among older people and what explains these
Exploring patterns of expenditure among older people and what explains theseExploring patterns of expenditure among older people and what explains these
Exploring patterns of expenditure among older people and what explains theseILC- UK
 
Email deliverability best practices
Email deliverability best practicesEmail deliverability best practices
Email deliverability best practicesEmail Delivered
 
Study tips for graduates
Study tips for graduatesStudy tips for graduates
Study tips for graduatesJane Leonard
 
Top 9 Email Marketing Mistakes
Top 9 Email Marketing MistakesTop 9 Email Marketing Mistakes
Top 9 Email Marketing MistakesEmail Delivered
 
Youtubeři v Čechách
Youtubeři v ČecháchYoutubeři v Čechách
Youtubeři v ČecháchTomas Pflanzer
 
Επιπτώσεις των καταναλωτικών μας συνηθειών στην υγεία και το περιβάλλον
Επιπτώσεις των καταναλωτικών μας συνηθειών στην υγεία και το περιβάλλονΕπιπτώσεις των καταναλωτικών μας συνηθειών στην υγεία και το περιβάλλον
Επιπτώσεις των καταναλωτικών μας συνηθειών στην υγεία και το περιβάλλονepalkatoch
 
Chapter2.3
Chapter2.3Chapter2.3
Chapter2.3nglaze10
 
Lead Generation Content For Advisors: 13 Tax Tips For Doctors For 2013
Lead Generation Content For Advisors: 13 Tax Tips For Doctors For 2013Lead Generation Content For Advisors: 13 Tax Tips For Doctors For 2013
Lead Generation Content For Advisors: 13 Tax Tips For Doctors For 2013Advisors4Advisors
 
Wwsf and gregg nestor
Wwsf and gregg nestorWwsf and gregg nestor
Wwsf and gregg nestordebhig
 
Mhs Overview 021411
Mhs Overview 021411Mhs Overview 021411
Mhs Overview 021411pyanopulos
 

Destacado (20)

Apple a český mobilní život
Apple a český mobilní životApple a český mobilní život
Apple a český mobilní život
 
Tema 6 medi
Tema 6 mediTema 6 medi
Tema 6 medi
 
зайны сургалт
зайны сургалтзайны сургалт
зайны сургалт
 
All 10 finished document and prompt
All 10 finished document and promptAll 10 finished document and prompt
All 10 finished document and prompt
 
Q1 2012 Investment Outlook: Are the Nightmares Behind Us?
Q1 2012 Investment Outlook: Are the Nightmares Behind Us?Q1 2012 Investment Outlook: Are the Nightmares Behind Us?
Q1 2012 Investment Outlook: Are the Nightmares Behind Us?
 
Moved to Care launch presentations
Moved to Care launch presentationsMoved to Care launch presentations
Moved to Care launch presentations
 
7 Ways to Boost Email Campaign Conversion
7 Ways to Boost Email Campaign Conversion7 Ways to Boost Email Campaign Conversion
7 Ways to Boost Email Campaign Conversion
 
Exploring patterns of expenditure among older people and what explains these
Exploring patterns of expenditure among older people and what explains theseExploring patterns of expenditure among older people and what explains these
Exploring patterns of expenditure among older people and what explains these
 
9.3
9.39.3
9.3
 
English 102 projec
English 102 projecEnglish 102 projec
English 102 projec
 
Email deliverability best practices
Email deliverability best practicesEmail deliverability best practices
Email deliverability best practices
 
Study tips for graduates
Study tips for graduatesStudy tips for graduates
Study tips for graduates
 
Plan
PlanPlan
Plan
 
Top 9 Email Marketing Mistakes
Top 9 Email Marketing MistakesTop 9 Email Marketing Mistakes
Top 9 Email Marketing Mistakes
 
Youtubeři v Čechách
Youtubeři v ČecháchYoutubeři v Čechách
Youtubeři v Čechách
 
Επιπτώσεις των καταναλωτικών μας συνηθειών στην υγεία και το περιβάλλον
Επιπτώσεις των καταναλωτικών μας συνηθειών στην υγεία και το περιβάλλονΕπιπτώσεις των καταναλωτικών μας συνηθειών στην υγεία και το περιβάλλον
Επιπτώσεις των καταναλωτικών μας συνηθειών στην υγεία και το περιβάλλον
 
Chapter2.3
Chapter2.3Chapter2.3
Chapter2.3
 
Lead Generation Content For Advisors: 13 Tax Tips For Doctors For 2013
Lead Generation Content For Advisors: 13 Tax Tips For Doctors For 2013Lead Generation Content For Advisors: 13 Tax Tips For Doctors For 2013
Lead Generation Content For Advisors: 13 Tax Tips For Doctors For 2013
 
Wwsf and gregg nestor
Wwsf and gregg nestorWwsf and gregg nestor
Wwsf and gregg nestor
 
Mhs Overview 021411
Mhs Overview 021411Mhs Overview 021411
Mhs Overview 021411
 

Similar a jQuery Anti-Patterns for Performance

Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Peter Higgins
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterpriseDave Artz
 
jQuery - 10 Time-Savers You (Maybe) Don't Know
jQuery - 10 Time-Savers You (Maybe) Don't KnowjQuery - 10 Time-Savers You (Maybe) Don't Know
jQuery - 10 Time-Savers You (Maybe) Don't Knowgirish82
 
Cheap frontend tricks
Cheap frontend tricksCheap frontend tricks
Cheap frontend tricksambiescent
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretssmueller_sandsmedia
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e bigAndy Peterson
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup PerformanceJustin Cataldo
 
Beyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance JavascriptBeyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance Javascriptaglemann
 
Kick start with j query
Kick start with j queryKick start with j query
Kick start with j queryMd. Ziaul Haq
 
Cleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryCleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryRebecca Murphey
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of DjangoJacob Kaplan-Moss
 
Ember background basics
Ember background basicsEmber background basics
Ember background basicsPhilipp Fehre
 
jQuery Performance Tips and Tricks
jQuery Performance Tips and TricksjQuery Performance Tips and Tricks
jQuery Performance Tips and TricksValerii Iatsko
 
DOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryDOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryRemy Sharp
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the FinishYehuda Katz
 

Similar a jQuery Anti-Patterns for Performance (20)

Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.
 
jQuery secrets
jQuery secretsjQuery secrets
jQuery secrets
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
jQuery - 10 Time-Savers You (Maybe) Don't Know
jQuery - 10 Time-Savers You (Maybe) Don't KnowjQuery - 10 Time-Savers You (Maybe) Don't Know
jQuery - 10 Time-Savers You (Maybe) Don't Know
 
Cheap frontend tricks
Cheap frontend tricksCheap frontend tricks
Cheap frontend tricks
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup Performance
 
jQuery Best Practice
jQuery Best Practice jQuery Best Practice
jQuery Best Practice
 
Beyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance JavascriptBeyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance Javascript
 
J query training
J query trainingJ query training
J query training
 
Javascript in Plone
Javascript in PloneJavascript in Plone
Javascript in Plone
 
Kick start with j query
Kick start with j queryKick start with j query
Kick start with j query
 
Cleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryCleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQuery
 
Frontin like-a-backer
Frontin like-a-backerFrontin like-a-backer
Frontin like-a-backer
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of Django
 
Ember background basics
Ember background basicsEmber background basics
Ember background basics
 
jQuery Performance Tips and Tricks
jQuery Performance Tips and TricksjQuery Performance Tips and Tricks
jQuery Performance Tips and Tricks
 
DOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryDOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQuery
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 

Último

Karra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptxKarra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptxAshokKarra1
 
4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptxmary850239
 
Judging the Relevance and worth of ideas part 2.pptx
Judging the Relevance  and worth of ideas part 2.pptxJudging the Relevance  and worth of ideas part 2.pptx
Judging the Relevance and worth of ideas part 2.pptxSherlyMaeNeri
 
Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Jisc
 
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...JhezDiaz1
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomnelietumpap1
 
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONTHEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONHumphrey A Beña
 
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfAMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfphamnguyenenglishnb
 
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfLike-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfMr Bounab Samir
 
ISYU TUNGKOL SA SEKSWLADIDA (ISSUE ABOUT SEXUALITY
ISYU TUNGKOL SA SEKSWLADIDA (ISSUE ABOUT SEXUALITYISYU TUNGKOL SA SEKSWLADIDA (ISSUE ABOUT SEXUALITY
ISYU TUNGKOL SA SEKSWLADIDA (ISSUE ABOUT SEXUALITYKayeClaireEstoconing
 
Global Lehigh Strategic Initiatives (without descriptions)
Global Lehigh Strategic Initiatives (without descriptions)Global Lehigh Strategic Initiatives (without descriptions)
Global Lehigh Strategic Initiatives (without descriptions)cama23
 
Culture Uniformity or Diversity IN SOCIOLOGY.pptx
Culture Uniformity or Diversity IN SOCIOLOGY.pptxCulture Uniformity or Diversity IN SOCIOLOGY.pptx
Culture Uniformity or Diversity IN SOCIOLOGY.pptxPoojaSen20
 
Earth Day Presentation wow hello nice great
Earth Day Presentation wow hello nice greatEarth Day Presentation wow hello nice great
Earth Day Presentation wow hello nice greatYousafMalik24
 
Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...Seán Kennedy
 
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdfGrade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdfJemuel Francisco
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxiammrhaywood
 
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdfInclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdfTechSoup
 
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxMULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxAnupkumar Sharma
 

Último (20)

Karra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptxKarra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptx
 
4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx
 
Judging the Relevance and worth of ideas part 2.pptx
Judging the Relevance  and worth of ideas part 2.pptxJudging the Relevance  and worth of ideas part 2.pptx
Judging the Relevance and worth of ideas part 2.pptx
 
Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...
 
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choom
 
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONTHEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
 
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfAMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
 
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfLike-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
 
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptxLEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
 
ISYU TUNGKOL SA SEKSWLADIDA (ISSUE ABOUT SEXUALITY
ISYU TUNGKOL SA SEKSWLADIDA (ISSUE ABOUT SEXUALITYISYU TUNGKOL SA SEKSWLADIDA (ISSUE ABOUT SEXUALITY
ISYU TUNGKOL SA SEKSWLADIDA (ISSUE ABOUT SEXUALITY
 
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
 
Global Lehigh Strategic Initiatives (without descriptions)
Global Lehigh Strategic Initiatives (without descriptions)Global Lehigh Strategic Initiatives (without descriptions)
Global Lehigh Strategic Initiatives (without descriptions)
 
Culture Uniformity or Diversity IN SOCIOLOGY.pptx
Culture Uniformity or Diversity IN SOCIOLOGY.pptxCulture Uniformity or Diversity IN SOCIOLOGY.pptx
Culture Uniformity or Diversity IN SOCIOLOGY.pptx
 
Earth Day Presentation wow hello nice great
Earth Day Presentation wow hello nice greatEarth Day Presentation wow hello nice great
Earth Day Presentation wow hello nice great
 
Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...
 
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdfGrade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
 
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdfInclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
 
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxMULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
 

jQuery Anti-Patterns for Performance

  • 1. jQuery Anti-Patterns for Performance & Compression Paul Irish NC JavaScript Camp ’10
  • 2. jQuery Anti-Patterns for Performance & Compression Paul Irish NC JavaScript Camp ’10
  • 3. Me. Interaction Designer at Molecular, Inc. jQuery Team Member - Dev. Relations @paul_irish http://paulirish.com Front-end development blog http://aurgasm.us Eclectic music blog
  • 6. wassup shawty? how u doin’ Taskspeed Test Lines of Code 200 150 100 50 0 YUI Dojo 1.3.1 Dojo 1.2.3 Qooxdoo MooTools Prototype.js jQuery PureDOM
  • 7. Oft cited best practices Cache length during loops Cache your selections Leverage documentFragment Append new content outside the loop
  • 8. Oft cited best practices Cache length during loops // appending inside. bad. $.each(reallyLongArray, function(count, item) { Cache your selections var newLI = '<li>' + item + '</li>'; Leverage documentFragment $('#ballers').append(newLI); }); Append new content outside the loop // documentFragment off-DOM var frag = document.createDocumentFragment(); $.each(reallyLongArray, function(count, item) { var newLI = '<li>' + item + '</li>'; frag.appendChild(newLI[0]); }); $('#ballers')[0].appendChild(frag);
  • 9. var newLI = '<li>' + item + '</li>'; $('#ballers').append(newLI); }); Oft cited best practices // documentFragment off-DOM var frag = document.createDocumentFragment(); Cache length during loops $.each(reallyLongArray, function(count, item) { var newLI = '<li>' + item + '</li>'; Cache your selections frag.appendChild(newLI[0]); }); Leverage documentFragment $('#ballers')[0].appendChild(frag); Append new content outside the loop // string concatenate and set innerHTML var myhtml = ''; $.each(reallyLongArray, function(count, item) { myhtml += '<li>' + item + '</li>'; }); $('#ballers').html(myhtml);
  • 10. Keep things DRY If you’re repeating yourself, you’re doing it wrong
  • 11. Moar DRY plz? if ($ventfade.data('currently') != 'showing') { $ventfade.stop(); } if ($venthover.data('currently') != 'showing') { $venthover.stop(); } if ($spans.data('currently') != 'showing') { $spans.stop(); } from http://mt-ventures.com/_js/global.js
  • 12. All clean! Thx var elems = [$ventfade,$venthover,$spans]; $.each(elems,function(k,v){ if (v.data('currently') != 'showing'){ v.stop(); } })
  • 13. Architecture Anti-Patterns Anonymous functions bound everywhere suck $(document).ready(function(){ ... $('#magic').click(function(e){ $('#yayeffects').slideUp(function(){ ... }); }); $('#happiness').load(url+' #unicorns',function(){ ... }) });
  • 14. Architecture - Object Literal var PI = { onReady : function(){ ... $('#magic').click(PI.candyMtn); $('#happiness').load(url+' #unicorns',PI.unicornCb); }, candyMtn : function(e){ $('#yayeffects').slideUp(PI.slideCb); }, slideCb : function(){ ... }, unicornCb : function(){ ... } } $(document).ready(PI.onReady);
  • 15. Architecture - Object Literal Advantages: Easier to navigate and discuss Profilers give you actual names to work with You can execute these from firebug console You can write unit tests against them
  • 16. Anti-Pattern: The requery // create and append your element $(document.body).append("<div class='baaron'/>"); // requery to bind stuff $("div.baaron").click(function(){}); // better: // swap to appendTo to hold your elem $("<div class='baaron'/>") .appendTo(document.body) .click(function(){});
  • 18. This is not the .context property // find all stylesheets in the body var bodySheets = $('style',document.body); bodySheets.context // ==> BODY element Ignore that for the moment, I know no one that’s found a use
  • 19. $(‘#whats .the’,context) Never pass it a selector string. Ever. No performance gain vs $(root).find(selector) var arms = $('div.robotarm', '#container'); // instead do: var arms = $('#container').find('div.robotarm');
  • 20. $(‘#whats .the’,context) You typically pass it this, but it’s purely a convenience to avoid find() $('form.comments',this).submit(captureSubmit); // exact same as $(this).find('form.comments').submit(captureSubmit); Which is more readable? $('.reply_form', $(this).closest('.comment')).hide(); $(this).closest('.comment').find('.reply_form').hide();
  • 21. The Crowd Say Bo Selector
  • 22. Come on, my selector Selector engines have come a long, long way.
  • 23. Come on, my selector Selector engines have come a long, long way.
  • 24. Come on, my selector Engines work in different ways Top-down, bottom-up, function creation, other crazy shit // from NWMatcher: // selecting '.outmost #outer span' T=e.nodeName;if(T=="SPAN"||T=="span") {while((e=e.parentNode)&&e.nodeType==1) {if((n=e.getAttributeNode("id"))&&n.value=="outer") {if((e=e.parentNode)&&e.nodeType==1) {C=e.className;if(C&&(" "+C+" ").indexOf(" outmost ")>-1) {r[X++]=N;continue main;}}}}}
  • 25. Selector engines, parse direction Left to right (Top-down) Right to left (Bottom-up) Mootools Sizzle Sly YUI 3 Peppy NWMatcher Dojo Acme Ext JS Prototype.js details: http://alexsexton.com/selectors/
  • 26. Selector engines, parse direction div.data table.attendees .gonzalez Left to right (Top-down) Right to left (Bottom-up) Mootools Sizzle Sly YUI 3 Peppy NWMatcher Dojo Acme Ext JS Prototype.js details: http://alexsexton.com/selectors/
  • 27. Selector engines, parse direction Left to right (Top-down) Right to left (Bottom-up) Mootools Sizzle Sly YUI 3 Peppy NWMatcher Dojo Acme Ext JS Prototype.js details: http://alexsexton.com/selectors/
  • 28. Selector engines, parse direction Left to right (Top-down) Right to left (Bottom-up) Mootools Sizzle Sly YUI 3 Peppy NWMatcher Dojo Acme querySelectorAll (qSA) Ext JS Prototype.js details: http://alexsexton.com/selectors/
  • 29. Selector Optimization Specific on the right, light on the left // let's find scott div.data .gonzalez // specific on right, light on the left .data td.gonzalez tag.class if possible on your right-most selector. just tag or just .class on left.
  • 30. Selector Optimization Of course, descending from an #id is best // basic #id-based selector var arms = $('#container div.robotarm'); // hyper-optimized #id case first, then find: var arms = $('#container').find('div.robotarm');
  • 31. Selector Optimization Don’t be needlessly specific // let's find scott .data table.attendees td.gonzalez // better: drop the middle .data td.gonzalez A flatter DOM helps, so move to HTML5 Also a wider range of tags speeds up filters
  • 32. Selector Optimization Avoid the universal selector Avoid the implied universal selector $('.buttons > *') // terribly costly $('.buttons').children() // much better $('.gender :radio') // implied universal $('.gender *:radio') // exact same, explicit now $('.gender input:radio') // much better
  • 33. Selector Optimization Google PageSpeed’s efficient selectors analysis MDC: Writing Efficient CSS https://developer.mozilla.org/en/Writing_Efficient_CSS Benchmark.js http://code.paulirish.com/sandbox/benchmark.js
  • 34. Event Delegation function delegate(type, delegate, handler) { return $(document).bind(type, function(event) { var target = $(event.target); if (target.is(delegate)) { return handler.apply(target, arguments); } }); } delegate('click','td.jehl',createRockstar); // and with live(): $('td.jehl').live('click',createRockstar);
  • 35. Event Delegation live() isn’t just for dynamic content Speeds up page load Only one event handler is bound vs many Good for >3 elements all getting the same handler // using live(), skipping selection on load var jqElem = $(document); jqElem.selector = 'li.ui'; jqElem.live('dblclick', dblhandler);
  • 36. Event Delegation live() isn’t just for dynamic content Speeds up page load Only one event handler is bound vs many Good for >3 elements all getting the same handler // using live(), skipping selection on load var jqElem = $(document); jqElem.selector = 'li.ui'; jqElem.live('dblclick', dblhandler);
  • 37. Event Delegation delegate() bakes in huge performance gains explicit context reduces overhead by ~80% Use it instead of live() if possible // awkward but equivalent $('a.trigger',$('#container')[0]).live('click',handlerFn) // so damn fine $('#container').delegate('click','a.trigger',handlerFn)
  • 38. Event Delegation new 1.4 in .2! delegate() bakes in huge performance gains explicit context reduces overhead by ~80% Use it instead of live() if possible // awkward but equivalent $('a.trigger',$('#container')[0]).live('click',handlerFn) // so damn fine $('#container').delegate('click','a.trigger',handlerFn)
  • 39. The DOM is slow Pull elements off the DOM while you toy with them var table = $('#some-table'); var parent = table.parent(); table.detach(); table.addLotsAndLotsOfRows(); parent.append(table);
  • 40. The DOM is slow Pull elements off the DOM while you toy with them var table = $('#some-table'); var parent = table.parent(); new table.detach(); in 1 .4 table.addLotsAndLotsOfRows(); parent.append(table);
  • 41. Minimize DOM touches Use classes, but if a style change user-selected: jQuery('a.swedberg').css('color', '#BADA55'); jQuery('<style type="text/css"> a.swedberg { color: BADA55; } </style>') .appendTo('head'); 3000 Timings for X elements 2250 (1000 iterations) 1500 css() style tag 750 0 1 5 10 20 50
  • 43. Don’t treat jQuery as a Black Box Use the source as your documentation Add this to your bookmark bar, NOW! http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js http://bit.ly/jqsource Determine which are convenience methods: getScript: function( url, callback ) { return jQuery.get(url, null, callback, "script"); }, getJSON: function( url, data, callback ) { return jQuery.get(url, data, callback, "json"); },
  • 44. Don’t treat jQuery as a Black Box Learn the lesser-known methods map(), slice(), stop(), (de)queue(), prevAll(), pushStack(), inArray() , etc // index() in jQuery <= 1.3.2 $('#rdworth').parent().children().index( $('#rdworth')[0] ) // using prevAll() is 10% faster (also sexier) $('#rdworth').prevAll().length // in jQuery 1.4 $('#rdworth').index()
  • 45. Don’t act on absent elements jQuery is very kind and doesn’t throw errors at you Don’t assume it’s just fine to do $('#doesntexist').slideUp() // this will execute genFx(), speed() and animate() // before it hits an each() jQuery UI widgets have a lot of overhead you’ll hit
  • 46. Don’t act on absent elements jQuery.fn.doOnce = function(func){ this.length && func.apply(this); return this; } $('li.cartitems').doOnce(function(){ // make it ajax! o/ });
  • 47. Don’t act on absent elements $.fn.plugin = function(opts){ if(!this.length) return this; var opts = $.extend(...... ... return this.each(...
  • 49. new New Element Creation 1.4 ! in jQuery("<div/>", { id: "foo", rel : "something" css: { height: "50px", width: "50px", color: "blue", backgroundColor: "#ccc" }, click: function() { $(this).css("backgroundColor", "red"); } }).appendTo("body");
  • 50. new eq(), first(), last() 1.4 ! in var lastelem = $elems.eq(-1); // get() too! $('#nav li:first') === $('#nav li').first() $('#nav li:last') === $('#nav li').last()
  • 51. Data() // regular: $(elem).data(key,value); // omg like 10x faster: $.data(elem,key,value);
  • 53. Compression YUI Compressor Sits on Rhino. Comments, whitespace, variable replacement //it already does these micro-optimizations: object['prop'] ==> object.prop {'key':123} ==> {key:123} 'jon's apostophes' ==> "jon's apostrophes" 'bigass ' + 'string' ==> 'bigass string'
  • 54. Variable definition // old 'n busted // new hotness var test1 = 1; var test1 = 1, var test2 = function() { test2 = function() { // function code // function code }; }, var test3 = test2(test1); test3 = test2(test1);
  • 55. Munge the primitives Define shortcuts at the top of your scope Good for both compression and scope chain traversal var TRUE = true, FALSE = false, NULL = null, window = self, undefined = undefined;
  • 56. Munge the primitives Define shortcuts at the top of your scope Good for both compression and scope chain traversal var TRUE = true, FALSE = false, NULL = null, window = self, undefined; undefined = undefined;
  • 57. Munge the primitives (function(){ var window = this, document = document, undefined; /* code */ })(); (function(window, document, undefined){ /* code */ })(this,this.document);
  • 58. var str=‘Let’s put this into action’ // html.no-js html> <!doctype ==> html.js var elem = document.getElementsByTagName('html')[0]; elem.className = elem.className.replace('no-js','js'); <html class="no-js"> // quicker reference, safer replace <head> var elem = document.documentElement; elem.className = elem.className.replace(/bno-jsb/,'js'); <script> // one// change the html class to 'js' line ftw! // in the head, no FOUC document.documentElement.className = document.documentElement.className.replace(/bno-jsb/, </script> 'js'); </body> // shorter with a self-executing anonymous function (function(B){B.className=B.className.replace(/bno-jsb/,
  • 59. var str=‘Let’s put this into action’ // html.no-js ==> html.js var elem = document.getElementsByTagName('html')[0]; elem.className = elem.className.replace('no-js','js'); // quicker reference, safer replace var elem = document.documentElement; elem.className = elem.className.replace(/bno-jsb/,'js'); // one line ftw! document.documentElement.className = document.documentElement.className.replace(/bno-jsb/, 'js'); // shorter with a self-executing anonymous function (function(B){B.className=B.className.replace(/bno-jsb/,
  • 60. // html.no-js ==> html.js var str=‘Let’s put this into var elem = document.getElementsByTagName('html')[0]; elem.className = elem.className.replace('no-js','js'); action’ // quicker reference, safer replace var elem = document.documentElement; elem.className = elem.className.replace(/bno-jsb/,'js'); // one line ftw! document.documentElement.className = document.documentElement.className.replace(/bno-jsb/, 'js'); // shorter with a self-executing anonymous function (function(B){B.className=B.className.replace(/bno-jsb/, 'js')})(document.documentElement); // pass className, object string notation (function(H,C){H[C]=H[C].replace(/bno-jsb/,'js')}) (document.documentElement,'className')
  • 61. Conditionals // old 'n busted if ( type === 'foo' || type === 'bar' ) {} // regex test if ( /^(foo|bar)$/.test(type) ) {} // obj literal lookup (smaller if <5 items) if ( ({foo:1,bar:1})[type] ) {}
  • 62. Logic and Ternary operands // basic function detection document.querySelectorAll && document.querySelectorAll('a:nth-child(2)') // assignment is legal, but it evaluates to the right expression callback && (isCallbackCalled = true) && callback(returnVal); // call or cache the callback function (isCallbackCalled || returnVal) ? fn(returnVal) : (callback = fn); // inline function calls isToday('Saturday') && Math.round(Math.random()) && $('#winnar').show() // if JSON2.js or Native JSON is present, otherwise eval. data = window.JSON && JSON.parse(data) || eval('('+data +')');
  • 63. Write maintainable code As a developer, you should work first and foremost for the user of your products. The second most important person to work for is the developer that takes over from you. - Christian Heilmann
  • 64. Comments /*! * Will not be removed by YUI Compressor */ // for quick toggling on and off: /* */ aaaahYeah(); /* */ /* * / ohHellNo(); /* */
  • 65. Compression Tools CompressorRater http://compressorrater.thruhere.net/ YUI Compressor front-end http://refresh-sf.com/yui/
  • 66. Thanks, ya’ll. Slides at http://paulirish.com/perf @paul_irish thx: Alex Sexton, Ben Alman, Adam Sontag, James Padolsey, temp01, #jquery on Freenode
  • 67. todo shadow effect to code samples more context research and this: http:// groups.google.com/group/jquery-dev/msg/ b4b7935a4013dfe7 and http://ispeakwebstuff.co.uk/ web-design-development-tutorials/clever-jquery- selectors/
  • 68. ` // pngfix for IE6 // e.g. FL.pngfix('img.bigProdShot,a.thumb'); pngfix : function(sel){ // conditional comments for inclusion of that js. if (typeof DD_belatedPNG == 'undefined'){ return; } else { // delay pngfix until window onload $(window).load(function(){ $(sel).each(function() { DD_belatedPNG.fixPng(arguments[1]); }); }); } } // end of FL.pngfix()

Notas del editor

  1. update the taskspeed shit.\ndelegation facts.\n
  2. i hang in #jquery so a lot of examples are from real code discussed there.\n
  3. \n
  4. \n
  5. \n
  6. \n
  7. like copypasting a line or three of code\n
  8. \n
  9. \n
  10. \n
  11. rebecca murphey will be discussing this technique a lot more\n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. the convenience of context will incur the cost of three extra if() statements in jQuery.fn.init()\n
  18. \n
  19. selectors. ugh.\n
  20. did it because i wanted to study.\nthe old ones are probablyw ayyyyy easier to study as the new ones use some crazy techniques\n
  21. did it because i wanted to study.\nthe old ones are probablyw ayyyyy easier to study as the new ones use some crazy techniques\n
  22. \n
  23. before sizzle it was LTR. sizzle changed it.\n
  24. before sizzle it was LTR. sizzle changed it.\n
  25. before sizzle it was LTR. sizzle changed it.\n
  26. be brief on the left\nthe more you can filter down the righthandmost expression, the faster it will run.\n
  27. id is grabbed. optimization\n
  28. in my testing it didnt speed up basic selecting.\n
  29. \n
  30. css engine too.\n
  31. \n
  32. TDs and LI&amp;#x2019;s etccc\n
  33. \n
  34. \n
  35. \n
  36. \n
  37. document.body as an append target is WIN\n
  38. \n
  39. \n
  40. padolsey&amp;#x2019;s research on animate()\n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. strings take up a lot of space, so allowing them to be munged helps a lot\ncompress it and look for repetition\n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. DRY obviously\n
  57. DRY obviously\n
  58. \n
  59. really understand truthy and falsy ness\n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n