jQuery chaining versus readability

· Ben’s Blog


As I was cleaning up my jQuery code, I came across some jQuery syntax that I wasn't sure how to format. In my app, I have a lot of jQuery Mobile pages that have event handlers attached to them. At the moment, I have two formats, but I wanted to unify these formats for consistency. The first looks like this: [sourcecode lang="javascript"] manOpsPage.data('sideButtonsClass', '.ui-btn-text');

manOpsPage.bind('pagebeforeshow', function () { $(document).bind('keydown.side-buttons', 'e', function () { $('#label-6').click(); }); });

manOpsPage.bind('pagehide', function () { var radioButtons = $('#manual-operations input[type="radio"]'); radioButtons.prop('checked', false); $('#radio-lap').prop('checked', true); radioButtons.checkboxradio('refresh'); });[/sourcecode] The second uses jQuery chaining syntax, which takes advantage of the fact that jQuery selections return the object, so I have chained my calls to bind together: [sourcecode lang="javascript"] $('div[data-role="page"]').bind('pagebeforeshow', function (e, ui) { ASCTD.setupSideButtons($(this)); }).bind('pagehide', function (e, ui) { ASCTD.removeSideButtons($(this)); }).bind('waitingForSequence', function () { if (ASCTD.uar.blocks[0].id === 21) { // We got a subtest complete sequence, so we are done. return; } $.mobile.showPageLoadingMsg(); }).bind('sequenceStarted', function () { $.mobile.hidePageLoadingMsg(); });[/sourcecode] Initially, I was planning on converting all the syntax to the latter formatting, since it is more compact. But as I continued on this path, I became less and less enamored with how the syntax looked and "felt." The compact nature actually made it less readable. And I noticed that refactoring this code was a little harder (e.g., removing a link in the chain), since selecting the link required a bit of precision--I had to get go from one close paren to the next period, both of which were in the middle of a line.

An oft-cited advantage of using chaining is that it significantly improves performance. But since I am already caching the jQuery selection, this point wasn't relevant.

In the end, I decided to go for readability over condensed code. Using jQuery chaining seemed clever at first, but there turned out to be little benefit. At this point, I'm not concerned with saving bytes, and I figure that's what compressors and minifiers are for...

Bonus: Even though I won't be using chaining in this case, along the way I did learn about the end() method, which allows you to continue chaining by reverting to the previous selection once you've drilled down in the chain.