jquery best practice
odyss009
who am i
just frontend developer
What is jquery?
- Selector Engine
- Dom Manipulation
- Event handling
- Ajax
- Etc
Selector engine
- DOM is a mess
- How to find specific node
- css syntax
- It is based on Sizzle
- native implementation
tip
- Don't use attr() to read a property(checked)
- Use prop() or access the raw DOM elements
- use closest("selector") instead of .parent()
- keep simple
attr() vs prop()
<html>
<input type="checkbox" checked="checked" name="isAllow"/>isAllow
<a href="#bbb">go to hell</a>
</html>
console.log($("input").attr("checked"));
console.log($("input").prop("checked"));
console.log($("a".attr("href"));
console.log($("a".prop("href"));
mobile
- consider querySelector(), querySelectorAll()
- document.getElementById
- document.getElementsByClassName
Dom manipulation
- DOM API
- createElement, appendChild, removeChild, createTextNode..
- WTF
- IE saved us
- innerHTML, outerHTML, innerText, outerText
Dom manipulation
- JQuery provides easy way
- html(), empty()
- after(), before()
- wrap(), unwrap()
- $("<div>Hello</div>")
sample
<html>
<div id="target">
</div>
</html>
$("#target").html("<div>Oh~ my~</div>");
$("#target").empty();
$("#target").after("<div>after</div>");
$("#target").before("div>before</div>");
$("<div>ha ha ha</div>").appendTo($("#target"));
Event
- difficult to handle cross browser event
- bind, live, delegate, click....
- forget everything
- remember only- on(), off()
event
- e.event may not be what you want.
- e.currentTarget
- bind vs live vs delegate vs on
- To change context in a event handler, use $.proxy
- Function.prototype.bind()
- multiple event bind
- elem.on({ click: func1, blur: func2, “focus.my”: func3 })
- namespace events
- use event.which for character info
practice
- Don't focus on JQuery
- focus on contents
- remove unnecessary factors
- keep it simple
ajax
- communication with server
- based on HTTP
- stateless
- Asynchronous
- use $.ajaxSetup
extend ajax
- ajaxPrefilter
- ajaxTransport
-
ajaxHooks
use ajax library
html
- Core of web
- contents/document
- unobtrusive javascript
- make it simple
- well defined structure
- web application
css
SMACSS
- BASE CSS
- Widget CSS
- Grid CSS
- State css
- Prefix
javascript
- The world's most misunderstood program language
- prototype based
- functional
- dynamic
- object literal
- ECMA5, ECMA.next
- Javascript Pattern
tip
- false, null, 0, -0, undefined, NAN, ""
- Curry
- Memoization
- call, apply
- this
- ||, &
false value
if(val == undefined || val = null) {
//bla
}
if(!val) {
//bla
}
|| &&
var obj = src || { name : "joe" };
var obj = src && { name : "original" };
async
- Ajax, Animation, setTimeout
- difficult to manage it
- callback hell
- Deferred and Promise
- done, fail, then
sample
var timeoutId = setTimeout(function() {
console.log("1st job is done");
}, 1000);
var asyncJob;
asyncJob = function() {
var dfd = new $.Deferred();
setTimeout(function() {
dfd.resolve();
}, 1000);
return dfd.promise();
};
asyncJob()
.done(function() {
console.log("job is done");
})
.then(function() {
return "arg1";
})
.then(function(arg) {
console.log(arg);
});
jquery plugin
jquery friend
- underscore.js
- lodash
- template engine
-
AMD, CommonJS
UTIlity
- use Lodash - alternative for underscore
- find, findWhere, groupBy, map, reduce, filter, some..
- throttle, debounce
template engine
- WTF
var arr = [ {
"name" : "joe"
}, {
"name" : "james"
} ];
for(var i = 0, len = arr.length; i < len; i++) {
var str = "<div>" + obj.name + "</div>";
}
template engine
- a lot of template engine
- Handlebars, Hogan, mustache, jsviews, underscore templte.....
{{#each comments}}
<h2><a href="/post/ {{ name }}#{{id}}">{{title}}</a></h2>
<div>{{body}}</div>
{{/each}}
application Structure
- What is best practice for application
- use boilerplate
- Todo App
- MVC
- MVVM
- pub/sub
- router
- library or framework
library
framework
app scaffold library
enjoy with source
- JQuery source is a great resource for learning javascript
-
jQuery Annotated Source
conclusion
jquery best practice
By odyss
jquery best practice
- 9,285