$30 off During Our Annual Pro Sale. View Details »
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
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
210
Pitch - Lidando com Efeitos Colaterais com Redux Saga
filipebarcos
0
380
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
90
Intro to Ruby
filipebarcos
1
130
Other Decks in Programming
See All in Programming
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
140
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
130
【CA.ai #3】Google ADKを活用したAI Agent開発と運用知見
harappa80
0
260
S3 VectorsとStrands Agentsを利用したAgentic RAGシステムの構築
tosuri13
5
260
DSPy Meetup Tokyo #1 - はじめてのDSPy
masahiro_nishimi
1
150
なあ兄弟、 余白の意味を考えてから UI実装してくれ!
ktcryomm
10
11k
無秩序からの脱却 / Emergence from chaos
nrslib
2
12k
関数の挙動書き換える
takatofukui
4
770
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
4
1k
Herb to ReActionView: A New Foundation for the View Layer @ San Francisco Ruby Conference 2025
marcoroth
0
240
配送計画の均等化機能を提供する取り組みについて(⽩⾦鉱業 Meetup Vol.21@六本⽊(数理最適化編))
izu_nori
0
120
【レイトレ合宿11】kagayaki_v4
runningoutrate
0
220
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.2k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
GraphQLとの向き合い方2022年版
quramy
49
14k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Mobile First: as difficult as doing things right
swwweet
225
10k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Become a Pro
speakerdeck
PRO
30
5.7k
Side Projects
sachag
455
43k
A Tale of Four Properties
chriscoyier
162
23k
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