SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
Ditching JQuery
Hao Luo
Northwestern University
https://joind.in/16012
Ditching JQuery - Hao Luo - Madison PHP
Intro
2
4 years as a full-time web developer
@howlowck
haowebdev@gmail.com
Ditching JQuery - Hao Luo - Madison PHP
I ❤ JQuery
•One codebase, all the browser!
•Introduced me to JavaScript
•“It just works”
3
Ditching JQuery - Hao Luo - Madison PHP
Goal of This Talk
•Not to convince anyone
•Important to understand the basics
•Lessen the hurdle to start using pure JavaScript
4
Ditching JQuery - Hao Luo - Madison PHP5
Scenario Problem
Ditching JQuery - Hao Luo - Madison PHP
Our Late Stay Requirements
Admin can…
•See a list of applications with some information
•Can decide to approve or deny an application
•Can delete an application
•Can add a random application
6
Ditching JQuery - Hao Luo - Madison PHP
IE9 Demo
7
github.com/howlowck/latestay-purejs
github.com/howlowck/latestay-jquery
Ditching JQuery - Hao Luo - Madison PHP
Late Stay Workflow
8
HTTP GET latestayapp.com/purejs
HTML (empty ul#applications container)
AJAX GET latestayapp.com/applications
JSON (parses then inserts in #applications container)
(admin clicks on the approve button)
AJAX PUT latestayapp.com/applications/20/approve
JSON (update HTML)
AJAX
DOM
Events
Ditching JQuery - Hao Luo - Madison PHP
DOM
Querying, Traversal, and Manipulation
9
Ditching JQuery - Hao Luo - Madison PHP
Some DOM Operations
10
JQuery Vanilla JS
$(‘#application-20’); document.querySelector(‘#application-20’);
$el.attr(‘data-id’,	‘20’);	
$el.attr(‘data-id’);
el.setAttribute(‘data-id’,	‘20’);	
el.getAttribute(‘data-id’);
yes yes yes 9+
yes yes yes yes
yes yes yes 10+$el.addClass(‘approved’);	
$el.removeClass(‘approved’);	
$el.toggleClass(‘approved’);
el.classList.add(‘approved’);	
el.classList.remove(‘approved’);	
el.classList.toggle(‘approved’);
$el.data(‘id’,	‘20’);	
var	id	=	$el.data(‘id’);
el.dataset.id	=	‘20’;	
var	id	=	el.dataset.id; yes yes yes 11+
$button.closest(‘.application’); button.closest(‘.application’); 41 35 no no
https://dom.spec.whatwg.org/#dom-element-closestselectors
https://github.com/eligrey/classList.js/
Ditching JQuery - Hao Luo - Madison PHP
Polyfills
11
A polyfill is a piece of code that provides the technology that the developer expects the
browser to provide natively. Flattening the API landscape if you will. - Remy Sharp
var	ELEMENT	=	Element.prototype;	
ELEMENT.matches	=	ELEMENT.matches	
				||	ELEMENT.msMatchesSelector	
				||	ELEMENT.mozMatchesSelector	
				||	ELEMENT.webkitMatchesSelector;	
ELEMENT.closest	=	ELEMENT.closest		
				||	function	(selector)	{	
								var	node	=	this;	
								while	(node)	{	
												if	(node.matches(selector))	{	
																break;	
												}	
												node	=	node.parentElement;	
								}	
								return	node;	
};	
41 35 no no
yes yes yes 9+
<li	class="application"	id=“#application-20">	
…	
				<div	class="action-bar">	
								<div	class=“action">	
…	
												<button	class="delete">	
								</div>	
				</div>	
</li>	
deleteButton.closest('.application');	
HTML
Javascript
Javascript
Ditching JQuery - Hao Luo - Madison PHP
DOM Events
12
Ditching JQuery - Hao Luo - Madison PHP13
Register Event Callbacks
Yes Yes Yes 9+
JQuery $('.delete').on('click',	deleteApplication);
Vanilla JS
getAllElToArr('.delete').forEach(function	(el)	{	
			el.addEventListener('click',	deleteApplication);	
});
Ditching JQuery - Hao Luo - Madison PHP
li.application ☺☹ ✖li.application ☺☹ ✖
Direct Events (vs Delegated
Events)
14
li.application
li.application
li.application
div#application-container
ul#applications
li.application
JQuery
$('.delete').on('click',	deleteApplication);	
Vanilla JS
getAllElToArr('.delete').forEach(function	(el)	{	
			el.addEventListener('click',	deleteApplication);	
});	
EventListener #1
EventListener #4
EventListener #3
EventListener #2
EventListener #5
EventListener #6
✖
✖
✖
✖
Ditching JQuery - Hao Luo - Madison PHP
li.application ☺☹ ✖
Delegated Events
15
li.application
li.application
li.application
div#application-container
ul#applications
li.application
li.application ☺☹ ✖
JQuery
$(‘ul.applications’).on(‘click’,	‘.deleteBtn’,	
deleteApplication);
Vanilla JS No	Standard	for	Event	Delegation	:(✖
✖
✖
✖
EventListener #1
is the ‘click’ target element the ‘.delete’ button? 

if so, run deleteApplication
is the ‘click’ target element the ‘.approve’ button? 

if so, run approveApplication
https://github.com/ftlabs/ftdomdelegate
Ditching JQuery - Hao Luo - Madison PHP
AJAX
16
Ditching JQuery - Hao Luo - Madison PHP
AJAX
17
JQuery $.ajax();
Vanilla JS XMLHttpRequest
HTML5 Fetch	API
yes yes yes yes
41 no no no
Fetch API Polyfill: https://github.com/github/fetch
yes yes yes 9+
Ditching JQuery - Hao Luo - Madison PHP
POST - A Closer Look
18
JQuery XMLHttpRequest
$.ajax('/applications',	{	
		method:	'POST',	
		contentType:	'application/json',	
		processData:	false,	
		data:	JSON.stringify({	
						name:	'Joe	Bob',	
						reason:	'Too	cold	outside'	
		})	
})	
.then(function	success(application)	{	
		appendApplicationHTML(application);	
})	
.fail(function	failed()	{	
		console.log('request	failed!');	
});	
xhr	=	new	XMLHttpRequest();	
xhr.open('POST',	'/applications'));	
xhr.setRequestHeader('Content-Type',	'application/json');	
xhr.onload	=	function()	{	
				if	(xhr.status	===	200)	{	
									var	applicationInfo	=	JSON.parse(xhr.responseText);	
						appendApplicationHTML(application);	
				}	
				else	if	(xhr.status	!==	200)	{	
								alert('Request	failed.	');	
				}	
};	
xhr.send(JSON.stringify({	
				name:	'Joe	Bob',	
				reason:	'Too	cold	outside'	
});
Ditching JQuery - Hao Luo - Madison PHP
POST - A Closer Look
19
JQuery Fetch API
$.ajax('/applications',	{	
		method:	'POST',	
		contentType:	'application/json',	
		processData:	false,	
		data:	JSON.stringify({	
						name:	'Joe	Bob',	
						reason:	'Too	cold	outside'	
		})	
})	
.then(function	success(application)	{	
		appendApplicationHTML(application);	
})	
.fail(function	failed()	{	
		console.log('request	failed!');	
});	
fetch('/users',	{	
		method:	'post',	
		headers:	{	
				'Content-Type':	'application/json'	
		},	
		body:	JSON.stringify({	
				name:	'Joe	Bob',	
				reason:	'Too	Cold	Outside'	
		})	
})	
.then(function	(response)	{	
		return	response.json();	
})	
.then(function	(application)	{	
		appendApplicationHTML(application);	
})	
.catch(function(error)	{	
		console.log('request	failed',	error);	
});
Ditching JQuery - Hao Luo - Madison PHP
DeferredValue
Eliminates Callback hell
Offers More Flexibility and Freedom
Promises are awesome
20
Ditching JQuery - Hao Luo - Madison PHP
Utilities
21
Ditching JQuery - Hao Luo - Madison PHP
DOM Loaded
22
JQuery Vanilla JS
$(function(event)	{	
		console.log("DOM	fully	loaded	and	parsed");	
});	
document.addEventListener("DOMContentLoaded",	
function(event)	{	
				console.log("DOM	fully	loaded	and	parsed");	
		});	
yes yes yes 9+
Don’t use "load"
Ditching JQuery - Hao Luo - Madison PHP
HTML Parse
23
JQuery Vanilla JS
var	el	=	$.parseHTML(HTMLString);
var	parser	=	new	DOMParser();		
var	doc	=	parser.parseFromString(HTMLString,	'text/html');		
var	el	=	doc.body.firstChild;	
30 12 7.1 10+
function	parseHTML	(str)	{	
		var	tmp	=	document.implementation.createHTMLDocument('');	
		tmp.body.innerHTML	=	str;	
		return	tmp.body.firstChild;	
};	
IE9 won’t accept empty param
yes yes yes 9+
Ditching JQuery - Hao Luo - Madison PHP
Date Parse
IE9 needs W3C output (which is also ISO 8601
compliant) (http://www.w3.org/TR/NOTE-
datetime-970915.html)
24
<?php	
$objDateTime	=	new	DateTime('NOW');	
echo	$objDateTime->format('c');															//	1975-12-25T14:15:16-05:00	Yes	IE9	
echo	$objDateTime->format(DateTime::ISO8601);	//	1975-12-25T14:15:16-0500		No	IE9
Ditching JQuery - Hao Luo - Madison PHP
A word about JQuery Animate
•Use Semantic HTML
•Use CSS Transition
25
.application	{	
				opacity:	1;	
				max-height:	300px;	
				transition:	max-height	0.5s,	opacity	0.7s;	
}	
.application.removed	{	
				max-height:	0;	
				opacity:	0;	
}	
CSS
Ditching JQuery - Hao Luo - Madison PHP
Closing Thoughts
26
Ditching JQuery - Hao Luo - Madison PHP27
Non-Technical Reasons
• a lot of magic is confusing sometimes
• Understanding the basics makes you a better
developer
$('div');	//creates	a	jquery	instance	with	the	selection	inside	
$('<div>');	//creates	a	jquery	instance	with	a	new	element	not	in	document	
$($aJQueryInstance);	//makes	a	clone	of	$aJQueryInstance	
$(function()	{})	//registers	function	to	run	after	DOM	is	loaded	
$({foo:	'bar'});	//???	creates	a	jquery	set	that	has	a	subset	of	methods	???	
var	$appsEl1	=	$('#applications');	
var	$appsEl2	=	$('#applications');	
$appsEl1	===	$appsEl2;	//false	
var	appsEl1	=	document.querySelector('#applications');	
var	appsEl2	=	document.querySelector('#applications');	
appsEl1	===	appsEl2;	//true
Ditching JQuery - Hao Luo - Madison PHP
Some Takeaways
•Avoid monolithic libraries & frameworks and Use
Packages and Polyfills
•Out of the JQuery Plugin Ecosystem and into NPM or
Bower
•Browser and Server
28
Ditching JQuery - Hao Luo - Madison PHP
When to use JQuery
•When you have to support IE8
•When you don’t have CORS
•Abstractions sometimes are good!
29
uses requestAnimationFrames	for	its	animationsuses setInterval	for	its	animations
Ditching JQuery - Hao Luo - Madison PHP
Resources for DOM references
http://blog.garstasio.com/you-dont-need-jquery/
http://youmightnotneedjquery.com/
http://html5please.com/
30
Ditching JQuery - Hao Luo - Madison PHP
Thank you!
@howlowck
https://joind.in/16012
31

Mais conteúdo relacionado

Mais procurados

Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010singingfish
 
Create responsive websites with Django, REST and AngularJS
Create responsive websites with Django, REST and AngularJSCreate responsive websites with Django, REST and AngularJS
Create responsive websites with Django, REST and AngularJSHannes Hapke
 
jQuery from the very beginning
jQuery from the very beginningjQuery from the very beginning
jQuery from the very beginningAnis Ahmad
 
React mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche EheReact mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche Eheinovex GmbH
 
jQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & TricksjQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & TricksAddy Osmani
 
plumbing for the next web
plumbing for the next webplumbing for the next web
plumbing for the next webIan Forrester
 
Automated Frontend Testing
Automated Frontend TestingAutomated Frontend Testing
Automated Frontend TestingNeil Crosby
 
Node.js and Selenium Webdriver, a journey from the Java side
Node.js and Selenium Webdriver, a journey from the Java sideNode.js and Selenium Webdriver, a journey from the Java side
Node.js and Selenium Webdriver, a journey from the Java sideMek Srunyu Stittri
 
Turbogears Presentation
Turbogears PresentationTurbogears Presentation
Turbogears Presentationdidip
 
Django Architecture Introduction
Django Architecture IntroductionDjango Architecture Introduction
Django Architecture IntroductionHaiqi Chen
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
Automation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and BeyondAutomation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and BeyondTechWell
 
BDD - Writing better scenario
BDD - Writing better scenarioBDD - Writing better scenario
BDD - Writing better scenarioArnauld Loyer
 
Lt web quiz_answer
Lt web quiz_answerLt web quiz_answer
Lt web quiz_answer0983676660
 
Rapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 PlatformRapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 PlatformWSO2
 
Node.JS error handling best practices
Node.JS error handling best practicesNode.JS error handling best practices
Node.JS error handling best practicesYoni Goldberg
 

Mais procurados (20)

Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
 
Create responsive websites with Django, REST and AngularJS
Create responsive websites with Django, REST and AngularJSCreate responsive websites with Django, REST and AngularJS
Create responsive websites with Django, REST and AngularJS
 
jQuery from the very beginning
jQuery from the very beginningjQuery from the very beginning
jQuery from the very beginning
 
Seven Reasons for Code Bloat
Seven Reasons for Code BloatSeven Reasons for Code Bloat
Seven Reasons for Code Bloat
 
React mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche EheReact mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche Ehe
 
jQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & TricksjQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & Tricks
 
plumbing for the next web
plumbing for the next webplumbing for the next web
plumbing for the next web
 
Automated Frontend Testing
Automated Frontend TestingAutomated Frontend Testing
Automated Frontend Testing
 
Node.js and Selenium Webdriver, a journey from the Java side
Node.js and Selenium Webdriver, a journey from the Java sideNode.js and Selenium Webdriver, a journey from the Java side
Node.js and Selenium Webdriver, a journey from the Java side
 
Turbogears Presentation
Turbogears PresentationTurbogears Presentation
Turbogears Presentation
 
Django Architecture Introduction
Django Architecture IntroductionDjango Architecture Introduction
Django Architecture Introduction
 
Your code are my tests
Your code are my testsYour code are my tests
Your code are my tests
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
Automation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and BeyondAutomation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and Beyond
 
BDD - Writing better scenario
BDD - Writing better scenarioBDD - Writing better scenario
BDD - Writing better scenario
 
สปริงเฟรมเวิร์ค4.1
สปริงเฟรมเวิร์ค4.1สปริงเฟรมเวิร์ค4.1
สปริงเฟรมเวิร์ค4.1
 
What is HTML 5?
What is HTML 5?What is HTML 5?
What is HTML 5?
 
Lt web quiz_answer
Lt web quiz_answerLt web quiz_answer
Lt web quiz_answer
 
Rapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 PlatformRapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 Platform
 
Node.JS error handling best practices
Node.JS error handling best practicesNode.JS error handling best practices
Node.JS error handling best practices
 

Destaque

Lesson 40 philippians, colossians, philemon
Lesson 40   philippians, colossians, philemonLesson 40   philippians, colossians, philemon
Lesson 40 philippians, colossians, philemonDavid Mortensen
 
今時のバンド
今時のバンド今時のバンド
今時のバンドRyu Seino
 
What is Windows 10?
What is Windows 10?What is Windows 10?
What is Windows 10?hewie
 
Gotween special press release
Gotween special press releaseGotween special press release
Gotween special press releaseDavid Silverman
 
Tested by Fire (presentation)
Tested by Fire (presentation)Tested by Fire (presentation)
Tested by Fire (presentation)Ben Santiago
 
Beseda življenja 2015-11
Beseda življenja 2015-11Beseda življenja 2015-11
Beseda življenja 2015-11Borut Spanovic
 
poverty in pakistan
poverty in pakistanpoverty in pakistan
poverty in pakistankamran khan
 
Line graph
Line graphLine graph
Line graphEmilijim
 
Ewolucja architektury Getresponse Api
Ewolucja architektury Getresponse ApiEwolucja architektury Getresponse Api
Ewolucja architektury Getresponse ApiMichal Giergielewicz
 
Tuskegee University triple major grad thankful for his journey
Tuskegee University triple major grad thankful for his journeyTuskegee University triple major grad thankful for his journey
Tuskegee University triple major grad thankful for his journeyDavid Billingslea
 
Mawdsley & Carter 2015 - DC Bombus pensylvanicus - The Maryland Entomologist ...
Mawdsley & Carter 2015 - DC Bombus pensylvanicus - The Maryland Entomologist ...Mawdsley & Carter 2015 - DC Bombus pensylvanicus - The Maryland Entomologist ...
Mawdsley & Carter 2015 - DC Bombus pensylvanicus - The Maryland Entomologist ...Jonathan Mawdsley
 
Bai giang hinh hoa 2
Bai giang hinh hoa 2Bai giang hinh hoa 2
Bai giang hinh hoa 2kekktt
 
Dosearches virus removal
Dosearches virus removalDosearches virus removal
Dosearches virus removalsakthiprime2
 

Destaque (20)

Lesson 40 philippians, colossians, philemon
Lesson 40   philippians, colossians, philemonLesson 40   philippians, colossians, philemon
Lesson 40 philippians, colossians, philemon
 
今時のバンド
今時のバンド今時のバンド
今時のバンド
 
International MBA
International MBAInternational MBA
International MBA
 
What is Windows 10?
What is Windows 10?What is Windows 10?
What is Windows 10?
 
Gotween special press release
Gotween special press releaseGotween special press release
Gotween special press release
 
event booklet 3
event booklet 3event booklet 3
event booklet 3
 
Espacio
EspacioEspacio
Espacio
 
Chavinde huatar
Chavinde huatarChavinde huatar
Chavinde huatar
 
Tested by Fire (presentation)
Tested by Fire (presentation)Tested by Fire (presentation)
Tested by Fire (presentation)
 
Beseda življenja 2015-11
Beseda življenja 2015-11Beseda življenja 2015-11
Beseda življenja 2015-11
 
Present simple explanation
Present simple explanationPresent simple explanation
Present simple explanation
 
Tobiii gym
Tobiii gymTobiii gym
Tobiii gym
 
poverty in pakistan
poverty in pakistanpoverty in pakistan
poverty in pakistan
 
Line graph
Line graphLine graph
Line graph
 
Ewolucja architektury Getresponse Api
Ewolucja architektury Getresponse ApiEwolucja architektury Getresponse Api
Ewolucja architektury Getresponse Api
 
Tuskegee University triple major grad thankful for his journey
Tuskegee University triple major grad thankful for his journeyTuskegee University triple major grad thankful for his journey
Tuskegee University triple major grad thankful for his journey
 
Microeconomia
MicroeconomiaMicroeconomia
Microeconomia
 
Mawdsley & Carter 2015 - DC Bombus pensylvanicus - The Maryland Entomologist ...
Mawdsley & Carter 2015 - DC Bombus pensylvanicus - The Maryland Entomologist ...Mawdsley & Carter 2015 - DC Bombus pensylvanicus - The Maryland Entomologist ...
Mawdsley & Carter 2015 - DC Bombus pensylvanicus - The Maryland Entomologist ...
 
Bai giang hinh hoa 2
Bai giang hinh hoa 2Bai giang hinh hoa 2
Bai giang hinh hoa 2
 
Dosearches virus removal
Dosearches virus removalDosearches virus removal
Dosearches virus removal
 

Semelhante a Ditching jQuery Madison

Ditching JQuery
Ditching JQueryDitching JQuery
Ditching JQueryhowlowck
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyDavid Padbury
 
Jquery tutorial
Jquery tutorialJquery tutorial
Jquery tutorialBui Kiet
 
jQuery Features to Avoid
jQuery Features to AvoidjQuery Features to Avoid
jQuery Features to Avoiddmethvin
 
Modern Web Technologies
Modern Web TechnologiesModern Web Technologies
Modern Web TechnologiesPerttu Myry
 
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterHaehnchen
 
Building Large Scale PHP Web Applications with Laravel 4
Building Large Scale PHP Web Applications with Laravel 4Building Large Scale PHP Web Applications with Laravel 4
Building Large Scale PHP Web Applications with Laravel 4Darwin Biler
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applicationschartjes
 
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...Peter Martin
 
Basic Tutorial of React for Programmers
Basic Tutorial of React for ProgrammersBasic Tutorial of React for Programmers
Basic Tutorial of React for ProgrammersDavid Rodenas
 
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3Jamie Matthews
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)Jose Manuel Pereira Garcia
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsJeff Durta
 
Google I/O 2012 - Protecting your user experience while integrating 3rd party...
Google I/O 2012 - Protecting your user experience while integrating 3rd party...Google I/O 2012 - Protecting your user experience while integrating 3rd party...
Google I/O 2012 - Protecting your user experience while integrating 3rd party...Patrick Meenan
 

Semelhante a Ditching jQuery Madison (20)

Ditching JQuery
Ditching JQueryDitching JQuery
Ditching JQuery
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQuery
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
Jquery tutorial
Jquery tutorialJquery tutorial
Jquery tutorial
 
Current state-of-php
Current state-of-phpCurrent state-of-php
Current state-of-php
 
Think jQuery
Think jQueryThink jQuery
Think jQuery
 
jQuery Features to Avoid
jQuery Features to AvoidjQuery Features to Avoid
jQuery Features to Avoid
 
Jquery
JqueryJquery
Jquery
 
Modern Web Technologies
Modern Web TechnologiesModern Web Technologies
Modern Web Technologies
 
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
 
Building Large Scale PHP Web Applications with Laravel 4
Building Large Scale PHP Web Applications with Laravel 4Building Large Scale PHP Web Applications with Laravel 4
Building Large Scale PHP Web Applications with Laravel 4
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
 
HTTP Potpourri
HTTP PotpourriHTTP Potpourri
HTTP Potpourri
 
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
 
Basic Tutorial of React for Programmers
Basic Tutorial of React for ProgrammersBasic Tutorial of React for Programmers
Basic Tutorial of React for Programmers
 
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applications
 
Google I/O 2012 - Protecting your user experience while integrating 3rd party...
Google I/O 2012 - Protecting your user experience while integrating 3rd party...Google I/O 2012 - Protecting your user experience while integrating 3rd party...
Google I/O 2012 - Protecting your user experience while integrating 3rd party...
 
J Query
J QueryJ Query
J Query
 

Último

%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park masabamasaba
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationJuha-Pekka Tolvanen
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benonimasabamasaba
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...masabamasaba
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyviewmasabamasaba
 
tonesoftg
tonesoftgtonesoftg
tonesoftglanshi9
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfonteinmasabamasaba
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...chiefasafspells
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrainmasabamasaba
 

Último (20)

%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 

Ditching jQuery Madison

  • 1. Ditching JQuery Hao Luo Northwestern University https://joind.in/16012
  • 2. Ditching JQuery - Hao Luo - Madison PHP Intro 2 4 years as a full-time web developer @howlowck haowebdev@gmail.com
  • 3. Ditching JQuery - Hao Luo - Madison PHP I ❤ JQuery •One codebase, all the browser! •Introduced me to JavaScript •“It just works” 3
  • 4. Ditching JQuery - Hao Luo - Madison PHP Goal of This Talk •Not to convince anyone •Important to understand the basics •Lessen the hurdle to start using pure JavaScript 4
  • 5. Ditching JQuery - Hao Luo - Madison PHP5 Scenario Problem
  • 6. Ditching JQuery - Hao Luo - Madison PHP Our Late Stay Requirements Admin can… •See a list of applications with some information •Can decide to approve or deny an application •Can delete an application •Can add a random application 6
  • 7. Ditching JQuery - Hao Luo - Madison PHP IE9 Demo 7 github.com/howlowck/latestay-purejs github.com/howlowck/latestay-jquery
  • 8. Ditching JQuery - Hao Luo - Madison PHP Late Stay Workflow 8 HTTP GET latestayapp.com/purejs HTML (empty ul#applications container) AJAX GET latestayapp.com/applications JSON (parses then inserts in #applications container) (admin clicks on the approve button) AJAX PUT latestayapp.com/applications/20/approve JSON (update HTML) AJAX DOM Events
  • 9. Ditching JQuery - Hao Luo - Madison PHP DOM Querying, Traversal, and Manipulation 9
  • 10. Ditching JQuery - Hao Luo - Madison PHP Some DOM Operations 10 JQuery Vanilla JS $(‘#application-20’); document.querySelector(‘#application-20’); $el.attr(‘data-id’, ‘20’); $el.attr(‘data-id’); el.setAttribute(‘data-id’, ‘20’); el.getAttribute(‘data-id’); yes yes yes 9+ yes yes yes yes yes yes yes 10+$el.addClass(‘approved’); $el.removeClass(‘approved’); $el.toggleClass(‘approved’); el.classList.add(‘approved’); el.classList.remove(‘approved’); el.classList.toggle(‘approved’); $el.data(‘id’, ‘20’); var id = $el.data(‘id’); el.dataset.id = ‘20’; var id = el.dataset.id; yes yes yes 11+ $button.closest(‘.application’); button.closest(‘.application’); 41 35 no no https://dom.spec.whatwg.org/#dom-element-closestselectors https://github.com/eligrey/classList.js/
  • 11. Ditching JQuery - Hao Luo - Madison PHP Polyfills 11 A polyfill is a piece of code that provides the technology that the developer expects the browser to provide natively. Flattening the API landscape if you will. - Remy Sharp var ELEMENT = Element.prototype; ELEMENT.matches = ELEMENT.matches || ELEMENT.msMatchesSelector || ELEMENT.mozMatchesSelector || ELEMENT.webkitMatchesSelector; ELEMENT.closest = ELEMENT.closest || function (selector) { var node = this; while (node) { if (node.matches(selector)) { break; } node = node.parentElement; } return node; }; 41 35 no no yes yes yes 9+ <li class="application" id=“#application-20"> … <div class="action-bar"> <div class=“action"> … <button class="delete"> </div> </div> </li> deleteButton.closest('.application'); HTML Javascript Javascript
  • 12. Ditching JQuery - Hao Luo - Madison PHP DOM Events 12
  • 13. Ditching JQuery - Hao Luo - Madison PHP13 Register Event Callbacks Yes Yes Yes 9+ JQuery $('.delete').on('click', deleteApplication); Vanilla JS getAllElToArr('.delete').forEach(function (el) { el.addEventListener('click', deleteApplication); });
  • 14. Ditching JQuery - Hao Luo - Madison PHP li.application ☺☹ ✖li.application ☺☹ ✖ Direct Events (vs Delegated Events) 14 li.application li.application li.application div#application-container ul#applications li.application JQuery $('.delete').on('click', deleteApplication); Vanilla JS getAllElToArr('.delete').forEach(function (el) { el.addEventListener('click', deleteApplication); }); EventListener #1 EventListener #4 EventListener #3 EventListener #2 EventListener #5 EventListener #6 ✖ ✖ ✖ ✖
  • 15. Ditching JQuery - Hao Luo - Madison PHP li.application ☺☹ ✖ Delegated Events 15 li.application li.application li.application div#application-container ul#applications li.application li.application ☺☹ ✖ JQuery $(‘ul.applications’).on(‘click’, ‘.deleteBtn’, deleteApplication); Vanilla JS No Standard for Event Delegation :(✖ ✖ ✖ ✖ EventListener #1 is the ‘click’ target element the ‘.delete’ button? if so, run deleteApplication is the ‘click’ target element the ‘.approve’ button? if so, run approveApplication https://github.com/ftlabs/ftdomdelegate
  • 16. Ditching JQuery - Hao Luo - Madison PHP AJAX 16
  • 17. Ditching JQuery - Hao Luo - Madison PHP AJAX 17 JQuery $.ajax(); Vanilla JS XMLHttpRequest HTML5 Fetch API yes yes yes yes 41 no no no Fetch API Polyfill: https://github.com/github/fetch yes yes yes 9+
  • 18. Ditching JQuery - Hao Luo - Madison PHP POST - A Closer Look 18 JQuery XMLHttpRequest $.ajax('/applications', { method: 'POST', contentType: 'application/json', processData: false, data: JSON.stringify({ name: 'Joe Bob', reason: 'Too cold outside' }) }) .then(function success(application) { appendApplicationHTML(application); }) .fail(function failed() { console.log('request failed!'); }); xhr = new XMLHttpRequest(); xhr.open('POST', '/applications')); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onload = function() { if (xhr.status === 200) { var applicationInfo = JSON.parse(xhr.responseText); appendApplicationHTML(application); } else if (xhr.status !== 200) { alert('Request failed. '); } }; xhr.send(JSON.stringify({ name: 'Joe Bob', reason: 'Too cold outside' });
  • 19. Ditching JQuery - Hao Luo - Madison PHP POST - A Closer Look 19 JQuery Fetch API $.ajax('/applications', { method: 'POST', contentType: 'application/json', processData: false, data: JSON.stringify({ name: 'Joe Bob', reason: 'Too cold outside' }) }) .then(function success(application) { appendApplicationHTML(application); }) .fail(function failed() { console.log('request failed!'); }); fetch('/users', { method: 'post', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'Joe Bob', reason: 'Too Cold Outside' }) }) .then(function (response) { return response.json(); }) .then(function (application) { appendApplicationHTML(application); }) .catch(function(error) { console.log('request failed', error); });
  • 20. Ditching JQuery - Hao Luo - Madison PHP DeferredValue Eliminates Callback hell Offers More Flexibility and Freedom Promises are awesome 20
  • 21. Ditching JQuery - Hao Luo - Madison PHP Utilities 21
  • 22. Ditching JQuery - Hao Luo - Madison PHP DOM Loaded 22 JQuery Vanilla JS $(function(event) { console.log("DOM fully loaded and parsed"); }); document.addEventListener("DOMContentLoaded", function(event) { console.log("DOM fully loaded and parsed"); }); yes yes yes 9+ Don’t use "load"
  • 23. Ditching JQuery - Hao Luo - Madison PHP HTML Parse 23 JQuery Vanilla JS var el = $.parseHTML(HTMLString); var parser = new DOMParser(); var doc = parser.parseFromString(HTMLString, 'text/html'); var el = doc.body.firstChild; 30 12 7.1 10+ function parseHTML (str) { var tmp = document.implementation.createHTMLDocument(''); tmp.body.innerHTML = str; return tmp.body.firstChild; }; IE9 won’t accept empty param yes yes yes 9+
  • 24. Ditching JQuery - Hao Luo - Madison PHP Date Parse IE9 needs W3C output (which is also ISO 8601 compliant) (http://www.w3.org/TR/NOTE- datetime-970915.html) 24 <?php $objDateTime = new DateTime('NOW'); echo $objDateTime->format('c'); // 1975-12-25T14:15:16-05:00 Yes IE9 echo $objDateTime->format(DateTime::ISO8601); // 1975-12-25T14:15:16-0500 No IE9
  • 25. Ditching JQuery - Hao Luo - Madison PHP A word about JQuery Animate •Use Semantic HTML •Use CSS Transition 25 .application { opacity: 1; max-height: 300px; transition: max-height 0.5s, opacity 0.7s; } .application.removed { max-height: 0; opacity: 0; } CSS
  • 26. Ditching JQuery - Hao Luo - Madison PHP Closing Thoughts 26
  • 27. Ditching JQuery - Hao Luo - Madison PHP27 Non-Technical Reasons • a lot of magic is confusing sometimes • Understanding the basics makes you a better developer $('div'); //creates a jquery instance with the selection inside $('<div>'); //creates a jquery instance with a new element not in document $($aJQueryInstance); //makes a clone of $aJQueryInstance $(function() {}) //registers function to run after DOM is loaded $({foo: 'bar'}); //??? creates a jquery set that has a subset of methods ??? var $appsEl1 = $('#applications'); var $appsEl2 = $('#applications'); $appsEl1 === $appsEl2; //false var appsEl1 = document.querySelector('#applications'); var appsEl2 = document.querySelector('#applications'); appsEl1 === appsEl2; //true
  • 28. Ditching JQuery - Hao Luo - Madison PHP Some Takeaways •Avoid monolithic libraries & frameworks and Use Packages and Polyfills •Out of the JQuery Plugin Ecosystem and into NPM or Bower •Browser and Server 28
  • 29. Ditching JQuery - Hao Luo - Madison PHP When to use JQuery •When you have to support IE8 •When you don’t have CORS •Abstractions sometimes are good! 29 uses requestAnimationFrames for its animationsuses setInterval for its animations
  • 30. Ditching JQuery - Hao Luo - Madison PHP Resources for DOM references http://blog.garstasio.com/you-dont-need-jquery/ http://youmightnotneedjquery.com/ http://html5please.com/ 30
  • 31. Ditching JQuery - Hao Luo - Madison PHP Thank you! @howlowck https://joind.in/16012 31