Except where otherwise noted, the contents of this document are Copyright 2012 Marty Stepp, Jessica Miller, and Victoria Kirst. All rights reserved. Any redistribution, reproduction, transmission, or storage of part or all of the contents in any form is prohibited without the author's expressed written permission.
There is no chapter about jQuery in our course book. Learning jQuery will be an exercise in your ability to navigate online APIs and documentation:
JavaScript is a powerful language, but it has many flaws:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
jQuery is so powerful in part because of these design principles
window.onload
We cannot use the DOM before the page has been constructed. jQuery gives us a more compatibile way to do this.
window.onload = function() {
// do stuff with the DOM
}
$(document).ready(function() {
// do stuff with the DOM
});
$(function() {
// do stuff with the DOM
});
DOM method | jQuery equivalent |
---|---|
getElementById("id")
|
$("#id")
|
getElementsByTagName("tag")
|
$("tag")
|
getElementsByName("somename")
|
$("[name='somename']")
|
querySelector("selector")
|
$("selector")
|
querySelectorAll("selector")
|
$("selector")
|
jQuery
object or the $
function depending on the context$
function always (even for ID selectors) returns an array-like object called a jQuery object.// false document.getElementById("id") == $("#myid"); document.querySelectorAll("p") == $("p"); // true document.getElementById("id") == $("#myid")[0]; document.getElementById("id") == $("#myid").get(0); document.querySelectorAll("p")[0] == $("p")[0];
$
as a wrapper$
adds extra functionality to DOM elements$
will give it the jQuery upgrade
// convert regular DOM objects to a jQuery object
var elem = document.getElementById("myelem");
elem = $(elem);
var elems = document.querySelectorAll(".special");
elems = $(elems);
querySelectorAll()
and querySelector()
on any DOM
object.var list = document.getElementsByTagName("ul")[0]; var specials = list.querySelectorAll('li.special');
find
/ context parameterjQuery gives two identical ways to do contextual element identification
var elem = $("#myid");
// These are identical
var specials = $("li.special", elem);
var specials = elem.find("li.special");
var elems = document.querySelectorAll("li");
for (var i = 0; i < elems.length; i++) {
var e = elems[i];
// do stuff with e
}
$("li").each(function(idx, e) {
// do stuff with e
});
for each
loop on either because they are not technically arrays, just array-like objects.
$("li").each(function(idx, e) {
// do stuff with e
});
false
to exit the loop early$
if we want
$("li").each(function(idx, e) {
e = $(e);
// do stuff with e
});
this
keyword refers to the same selected element as e, so this is better jQuery
$("li").each(function() {
// do stuff with this
});
function highlightField() {
// turn text yellow and make it bigger
if (!$("#myid").hasClass("invalid")) {
$("#myid").addClass("highlight");
}
}
addClass
, removeClass
, hasClass
, toggleClass
manipulate CSS classesclassName
DOM property, but don't have to manually split by spaces
function biggerFont() {
// turn text yellow and make it bigger
var size = parseInt($("#clickme").css("font-size"));
$("#clickme").css("font-size", size + 4 + "pt");
}
css
function of the jQuery object allows reading pre-existing stylesfont-size
syntax instead of fontSize
css(property)
gets the property value, css(property, value)
sets the property value// bad!$("#main").css("top", $("#main").css("top") + 100 + "px");
"200px" + 100 + "px"
, "200px100px"
// correct
$("#main").css("top", parseInt($("#main").css("top")) + 100 + "px");
<ul> <li style="font-size: 10px">10px font size</li> <li style="font-size: 20px">20px font size</li> <li style="font-size: 30px">30px font size</li> </ul>
$("li").css("font-size"); // returns '10px'
$("li").css("font-size", "15px"); // sets all selected elements to '8px'
<ul> <li style="font-size: 15px">10px font size</li> <li style="font-size: 15px">20px font size</li> <li style="font-size: 15px">30px font size</li> </ul>
Many jQuery object methods are overloaded
$("#myid").css(propertyName);
$("#myid").css(propertyName, value);
$("#myid").css({ 'propertyName1': value1, 'propertyName2': value2, ... });
$("#myid").css(propertyName, function(idx, oldValue) { return newValue; });
What do you think the multi-modifier syntax is?
// bad jQuery$("#main").css("top", parseInt($("#main").css("top")) + 100 + "px");
$("#main").css("top", function(idx, old) {
return parseInt(old) + 100 + "px";
}); // good jQuery
When there is no other return to make, jQuery methods return the same jQuery object back to you
method | return type |
---|---|
$("#myid"); |
jQuery object |
$("#myid").children(); |
jQuery object |
$("#myid").css("margin-left"); |
String |
$("#myid").css("margin-left", "10px"); |
jQuery object |
$("#myid").addClass("special"); |
jQuery object |
$("#main").css("color", "red"); $("#main").attr("id", "themainarea"); $("#main").addClass("special");
The implictly returned jQuery object allows for chaining of method calls.
$("img") .css("color", "red") .addClass("special") .src = "foo.png";
Expression return value at each line:
// [<img />, ...] // [<img style="color: red" />, ...] // [<img class="special" style="color: red" />, ...] // cannot chain further because this is an assignment :(
attr()
function$("img") // poor jQuery style .css("color", "red") .addClass("special").src = "foo.png";
$("img") // good jQuery style .css("color", "red") .addClass("special") .attr("src", "foo.png"); // we could chain further right here
Suppose you already have a jQuery object, e.g. $("#myid")
jQuery method | functionality |
---|---|
.hide() |
toggle CSS display: none on |
.show() |
toggle CSS display: none off |
.empty() |
remove everything inside the element, innerHTML = "" |
.html() |
get/set the innerHTML without escaping html tags |
.text() |
get/set the innerHTML, HTML escapes the text first |
.val() |
get/set the value of a form input, select, textarea, ... |
.height() |
get/set the height in pixels, returns a Number |
.width() |
get/set the width in pixels, return a Number |
The $
function to the rescue again
var newElement = $("<div>"); $("#myid").append(newElement);
jQuery programmers typically 1 line it
$("#myid").append($("<div>"));
The previous example becomes this with jQuery
var bullets = document.getElementsByTagName("li"); for (var i = 0; i < bullets.length; i++) { if (bullets[i].innerHTML.indexOf("children") >= 0) { bullets[i].parentNode.removeChild(bullets[i]); } }
$("li:contains('child')").remove();
$("<p id='myid' class='special'>My paragraph is awesome!</p>")
$("<p>") .attr("id", "myid") .addClass("special") .text("My paragraph is awesome!");
$("<p>", { "id": "myid", "class": "special", "text": "My paragraph is awesome!" });
$
function signatures$(function);
$("selector", [context]);
$(elements);
$("<html>", [properties]);
Here is what it might look like if you tried to insert an image before each special
span
tag in a div
using the DOM's API.
var spans = document.querySelectorAll("#ex1 span.special"); for (var i = 0; i < spans.length; i++) { var img = document.createElement("img"); img.src = "images/laughing_man.jpg"; img.alt = "laughing man"; img.style.verticalAlign = "middle"; img.style.border = "2px solid black"; img.onclick = function() { alert("clicked"); } spans[i].insertBefore(img, spans[i].firstChild); }
$("#ex2 span.special").each(function(i, elem) { var img = $("<img>") .attr("src", "images/laughing_man.jpg") .attr("alt", "laughing man") .css("vertical-align", "middle") .css("border", "2px solid black") .click(function() { alert("clicked"); }); $(elem).prepend(img); });
$("#ex3 span.special").prepend($("<img>", { "src": "images/laughing_man.jpg", "alt": "laughing man", "css": { "vertical-align": "middle", "border": "2px solid black" }, "click": function() { alert("clicked"); } }));