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
Filipe Costa
November 09, 2013
Programming
2
250
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
210
Pitch - Lidando com Efeitos Colaterais com Redux Saga
filipebarcos
0
370
Rust for Rubysts
filipebarcos
2
240
Limpando Seu Código JS Com O Padrão Pub/Sub
filipebarcos
0
190
Tu trabalha em casa?? Que moleza hein!
filipebarcos
0
120
Rediscovering OOP in Rails World
filipebarcos
0
89
Intro to Ruby
filipebarcos
1
120
Other Decks in Programming
See All in Programming
Design Foundational Data Engineering Observability
sucitw
2
140
AWS発のAIエディタKiroを使ってみた
iriikeita
1
150
AIを活用し、今後に備えるための技術知識 / Basic Knowledge to Utilize AI
kishida
19
4.5k
兎に角、コードレビュー
mitohato14
0
170
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
160
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
3
1.1k
Protocol Buffersの型を超えて拡張性を得る / Beyond Protocol Buffers Types Achieving Extensibility
linyows
0
100
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
100
ProxyによるWindow間RPC機構の構築
syumai
3
820
Langfuseと歩む生成AI活用推進
licux
3
320
The state patternの実践 個人開発で培ったpractice集
miyanokomiya
0
160
オープンセミナー2025@広島「君はどこで動かすか?」アンケート結果
satoshi256kbyte
0
240
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
840
Building Adaptive Systems
keathley
43
2.7k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Designing for humans not robots
tammielis
253
25k
Become a Pro
speakerdeck
PRO
29
5.5k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Six Lessons from altMBA
skipperchong
28
4k
Rails Girls Zürich Keynote
gr2m
95
14k
Scaling GitHub
holman
463
140k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
KATA
mclloyd
32
14k
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