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.
How would we do each of the following in JavaScript code? Each involves modifying each one of a group of elements ...
divs of class puzzle to random x/y locations.ul list with id of TAs to have a gray background.
document and other DOM objects (* = HTML5):
| name | description |
|---|---|
getElementsByTagName
|
returns array of descendents with the given tag, such as "div"
|
getElementsByName
|
returns array of descendents with the given name attribute (mostly useful for accessing form controls)
|
querySelector *
|
returns the first element that would be matched by the given CSS selector string |
querySelectorAll *
|
returns an array of all elements that would be matched by the given CSS selector string |
highlight all paragraphs in the document:
var allParas = document.querySelectorAll("p");
for (var i = 0; i < allParas.length; i++) {
allParas[i].style.backgroundColor = "yellow";
}
<body> <p>This is the first paragraph</p> <p>This is the second paragraph</p> <p>You get the idea...</p> </body>
highlight all paragraphs inside of the section with ID "address":
// document.getElementById("address").getElementsByTagName("p")
var addrParas = document.querySelectorAll("#address p");
for (var i = 0; i < addrParas.length; i++) {
addrParas[i].style.backgroundColor = "yellow";
}
<p>This won't be returned!</p> <div id="address"> <p>1234 Street</p> <p>Atlanta, GA</p> </div>
querySelectorAll issues. or # in front of a class or id
// get all buttons with a class of "control" var gameButtons =document.querySelectorAll("control");var gameButtons = document.querySelectorAll(".control");
querySelectorAll returns an array, not a single element; must loop over the results
(document.querySelector returns just the first element that matches, if that's what you want)
// set all buttons with a class of "control" to have red textdocument.querySelectorAll(".gamebutton").style.color = "red";var gameButtons = document.querySelector(".gamebutton"); for (var i = 0; i < gameButtons.length; i++) { gameButtons[i].style.color = "red"; }
querySelectorAll even if my CSS file doesn't have any style rule for that same group? (A: Yes!)
| name | description |
|---|---|
document.createElement("tag")
|
creates and returns a new empty DOM node representing an element of that type |
document.createTextNode("text")
|
creates and returns a text node containing given text |
// create a new <h2> node
var newHeading = document.createElement("h2");
newHeading.innerHTML = "This is a heading";
newHeading.style.color = "green";
Every DOM element object has these methods:
| name | description |
|---|---|
appendChild(node)
|
places given node at end of this node's child list |
insertBefore(new, old)
|
places the given new node in this node's child list just before old child
|
removeChild(node)
|
removes given node from this node's child list |
replaceChild(new, old)
|
replaces given child with new node |
var p = document.createElement("p");
p.innerHTML = "A paragraph!";
document.getElementById("main").appendChild(p);
innerHTML hackingWhy not just code the previous example this way?
function slideClick() {
document.getElementById("main").innerHTML += "<p>A paragraph!</p>";
}
" and '
function slideClick() {
document.getElementById("main").innerHTML += "<p style='color: red; " +
"margin-left: 50px;' " +
"onclick='myOnClick();'>" +
"A paragraph!</p>";
}
function slideClick() {
var bullet = document.getElementById("removeme");
bullet.parentNode.removeChild(bullet);
}
removeChild method to remove its children from the page
obj.parentNode.remove(obj);
this
this.fieldName // access field this.fieldName = value; // modify field this.methodName(parameters); // call method
window object (so this === window)
window
this keyword refers to the current object
window.onload = function() {
document.getElementById("textbox").onmouseout = booyah;
document.getElementById("submit").onclick = booyah; // bound to submit button here
};
function booyah() { // booyah knows what object it was called on
this.value = "booyah";
}
this
<button id="clickme">Click Me</button>
window.onload = function() {
document.getElementById("clickme").onclick = biggerFont;
};
function biggerFont() {
var button = document.getElementById("clickme");
var size = parseInt(button.style.fontSize);
button.style.fontSize = (size + 4) + "pt";
}
style property lets you set any CSS style for an element.style, but not ones that are set in the CSS file)
window.getComputedStyle(element).propertyName
function biggerFont() {
// turn text yellow and make it bigger
var clickMe = document.getElementById("clickme");
var size = parseInt(window.getComputedStyle(clickMe).fontSize);
clickMe.style.fontSize = (size + 4) + "pt";
}
getComputedStyle method of global window object accesses existing styles"200px" + 100 + "px" , "200px100px"
var main = document.getElementById("main");
main.style.top = window.getComputedStyle(main).top + 100 + "px"; // bad!
main.style.top = parseInt(window.getComputedStyle(main).top) + 100 + "px"; // correct
function highlightField() {
// turn text yellow and make it bigger
var text = document.getElementById("text");
if (!text.className) {
text.className = "highlight";
} else if (text.className.indexOf("invalid") < 0) {
text.className += " highlight"; // awkward
}
}
className property corresponds to HTML class attributeclassList
function highlightField() {
// turn text yellow and make it bigger
var text = document.getElementById("text");
if (!text.classList.contains("invalid")) {
text.classList.add("highlight");
}
}
classList collection has methods add, remove, contains, toggle to manipulate CSS classesclassName DOM property, but don't have to manually split by spaces
<p> This is a paragraph of text with a <a href="/path/page.html">link in it</a>. </p>
element nodes (HTML tag)
text nodes (text in a block element)
attribute nodes (attribute/value pair)
every node's DOM object has the following properties:
| name(s) | description |
|---|---|
firstChild, lastChild
|
start/end of this node's list of children |
childNodes
|
array of all this node's children |
nextSibling, previousSibling
|
neighboring nodes with the same parent |
parentNode
|
the element that contains this node |
<p id="foo">This is a paragraph of text with a <a href="/path/to/another/page.html">link</a>.</p>
<div> <p> This is a paragraph of text with a <a href="page.html">link</a>. </p> </div>
div above have?"\n\t" (before/after the paragraph)a tag?