Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
jQuery Bad Practices
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Filipe Costa
November 09, 2013
Programming
2
260
jQuery Bad Practices
Let's learn some bad jQuery practices to avoid them.
Filipe Costa
November 09, 2013
Tweet
Share
More Decks by Filipe Costa
See All by Filipe Costa
Lidando com Efeitos Colaterais com Redux Saga
filipebarcos
0
220
Pitch - Lidando com Efeitos Colaterais com Redux Saga
filipebarcos
0
380
Rust for Rubysts
filipebarcos
2
250
Limpando Seu Código JS Com O Padrão Pub/Sub
filipebarcos
0
190
Tu trabalha em casa?? Que moleza hein!
filipebarcos
0
130
Rediscovering OOP in Rails World
filipebarcos
0
95
Intro to Ruby
filipebarcos
1
130
Other Decks in Programming
See All in Programming
Oxlint JS plugins
kazupon
1
930
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
560
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
190
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
170
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
110
高速開発のためのコード整理術
sutetotanuki
1
400
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.4k
SourceGeneratorのススメ
htkym
0
200
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
130
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
110
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
110
Balancing Empowerment & Direction
lara
5
890
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
64
A designer walks into a library…
pauljervisheath
210
24k
Mobile First: as difficult as doing things right
swwweet
225
10k
The Cult of Friendly URLs
andyhume
79
6.8k
Code Review Best Practice
trishagee
74
20k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
140
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
117
110k
BBQ
matthewcrist
89
10k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Transcript
jQuery Bad Practices Filipe Costa
Filipe Costa 4UBDL#VJMEFST @filipebarcos BCPVUNF pMJQFCBSDPT
DISCLAIMER
Really?? jQuery?!
https://github.com/search?l=Ruby&q=jquery&ref=advsearch&type=Repositories https://github.com/search?l=Python&q=jquery&ref=advsearch&type=Repositories https://github.com/search?l=JavaScript&q=jquery&ref=advsearch&type=Repositories
People say sh** about jQuery
Obtrusive Hard to follow Hard to maintain Disorganized Bloated Slow
Difficult to talk about
;(function(window, document, $) {! var isInputSupported = 'placeholder' in document.createElement('input');!
var isTextareaSupported = 'placeholder' in document.createElement('textarea');! var prototype = $.fn;! var valHooks = $.valHooks;! var propHooks = $.propHooks;! var hooks;! var placeholder;! ! if (isInputSupported && isTextareaSupported) {! placeholder = prototype.placeholder = function() {! return this;! };! placeholder.input = placeholder.textarea = true;! } else {! ! placeholder = prototype.placeholder = function() {! var $this = this;! $this.filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')! .not('.placeholder')! .bind({! 'focus.placeholder': clearPlaceholder,! 'blur.placeholder': setPlaceholder! }).data('placeholder-enabled', true).trigger('blur.placeholder');! return $this;! };! placeholder.input = isInputSupported;! placeholder.textarea = isTextareaSupported;! hooks = {! 'get': function(element) {! var $element = $(element);! var $passwordInput = $element.data('placeholder-password');! if ($passwordInput) {! return $passwordInput[0].value;! }! return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;! },! 'set': function(element, value) {! var $element = $(element);! var $passwordInput = $element.data('placeholder-password');! if ($passwordInput) {! return $passwordInput[0].value = value;! }! if (!$element.data('placeholder-enabled')) {! return element.value = value;! }!
None
None
Caching
function whatever() {! $(".container input#elem").attr("title", $(".container input#elem").text());! $(".container input#elem").css("color", "red");!
$(".container input#elem").fadeOut();! }
This is BAD!
function whateverBetter() {! var elem = $("#elem");! elem.attr("title", elem.text());! elem.css("color",
"red");! elem.fadeOut();! }
We can do better than that
function whateverEvenBetter() {! var elem = $("#elem");! elem.attr("title", elem.text())! .css("color",
"red")! .fadeOut();! }
Querying DOM
Yo
$("div.data .user"); $(".data section.user");
Excessive Specificity
$(".data table.users td.user"); $(".data td.user");
Avoid Sizzle http://learn.jquery.com/performance/optimize-selectors/
$('#content p.title').fadeIn(); $('#content').find('p.title').fadeIn();
Avoid Universal Selectors
$(".countries :selected"); $(".countries input:selected");
Context
$('.selectbox-user').toggle(); $('.selectbox-user', '#user-table').toggle();
$(this) “jQuery way"
$('.input-field').on('focus', function()) {! console.log($(this).val());! } $('.input-field').on('focus', function()) {! console.log(this.value);! }
DRY
function whateverEvenBetter() {! var elem = $("#elem");! elem.attr("title", elem.text())! .css("color",
"red")! .fadeOut();! }
AJAX
function getCities(state) {! $.ajax({! url: '/cities',! type: 'get',! data: state,!
success: function(data) {! $('.user-form-states-select').html(data);! }! });! }
That’s just the beginning
//functions.js! function getCities(state) {! return $.ajax({! url: '/cities',! type: 'get',!
data: state! });! }! ! //user.js! var FillSelectBox = function(data) {! $('.user-form-state-select').html(data);! }! ! getCities('CE').then(FillSelectBox);
Optimisation
jQuery won’t take care of UR dumbness
var names = ["Greg", "Peter", "Kyle", "Danny", "Mark"];! $.each(names, function(index,
value) {! $("ul.people").append("<li id=" + index + ">" + value + "</li>");! });
Caching again?
var names = ["Greg", "Peter", "Kyle", "Danny", "Mark"],! list =
$("ul.people");! $.each(names, function(index, value) {! list.append("<li id=" + index + ">" + value + "</li>");! });
We can do better than that
var names = ["Greg", "Peter", "Kyle", "Danny", "Mark"],! ! list
= $("ul.people"),! ! listItems = "";! ! $.each(names, function(index, value) {! listItems += "<li id=" + index + ">" + value + "</li>";! });! ! list.append(dynamicItems);
Safety
NOPE
var j = jQuery.noConflict();
jQuery(document).ready(function($) { ! //your code here! });
But U R cool
So U ain’t use jQuery
jk
(function($) {! //your code here! })(jQuery);
</code>
I use jQuery and I’m still cool
jQuery is your FRIEND
Learn how to use it
jQuery is just a tool
USUALLY, it’s not tool's fault
Thank you! Filipe Costa @filipebarcos