document.getElementById“myTable”.getElementsByTagName“TD”.length Because the getElementsByTagNamemethod returns an array of objects, you can use one of those returned values as a valid e
Trang 1invoked for the mainelement to capture a snapshot of all TextRectangles for the entire element This array comes in handy when the script needs to get the coordi-nates of a rectangle for a single line, as chosen in the SELECT element
Whenever the user chooses a number from the SELECT list and the value is less than the total number of TextRectangleobjects in clientRects, the function begins calculating the size and location of the underlying yellow highlighter When the Full Width checkbox is checked, the left and right coordinates are obtained from the getBoundingClientRect()method because the entire SPAN element’s rectangle is the space you’re interested in; otherwise, you pull the leftand right properties from the chosen rectangle in the clientRectsarray
Next comes the assignment of location and dimension values to the hiliter object’s styleproperty The top and bottom are always pegged to whatever line is selected, so the clientRectsarray is polled for the chosen entry’s topand bottom properties The previously calculated leftvalue is assigned to the hiliterobject’s pixelLeftproperty, while the width is calculated by subtracting the leftfrom the rightcoordinates Notice that the topand leftcoordinates also take into account any vertical or horizontal scrolling of the entire body of the document If you resize the window to a smaller size, line wrapping throws off the original line count However, an invocation of hilite()from the onResizeevent handler applies the currently chosen line number to whatever content falls in that line after resizing
Listing 15-27: Using getBoundingClientRect()
<HTML>
<HEAD>
<TITLE>getClientRects() and getBoundClientRect() Methods</TITLE>
<SCRIPT LANGUAGE=”JavaScript”>
function hilite() { var hTop, hLeft, hRight, hBottom, hWidth var select = document.forms[0].choice var n = parseInt(select.options[select.selectedIndex].value) - 1 var clientRects = document.all.main.getClientRects()
var mainElem = document.all.main
if (n >= 0 && n < clientRects.length) {
if (document.forms[0].fullWidth.checked) { hLeft = mainElem.getBoundingClientRect().left hRight = mainElem.getBoundingClientRect().right } else {
hLeft = clientRects[n].left hRight = clientRects[n].right }
document.all.hiliter.style.pixelTop = clientRects[n].top + document.body.scrollTop
document.all.hiliter.style.pixelBottom = clientRects[n].bottom document.all.hiliter.style.pixelLeft = hLeft + document.body.scrollLeft
elementObject.getBoundingClientRect()
Trang 2document.all.hiliter.style.pixelWidth = hRight - hLeft
document.all.hiliter.style.visibility = “visible”
} else if (n > 0) {
alert(“The content does not have that many lines.”)
document.all.hiliter.style.visibility = “hidden”
}
}
</SCRIPT>
</HEAD>
<BODY onResize=”hilite()”>
<H1>getClientRects() and getBoundClientRect() Methods</H1>
<HR>
<FORM>
Choose a line to highlight:
<SELECT NAME=”choice” onChange=”hilite()”>
<OPTION VALUE=0>
<OPTION VALUE=1>1
<OPTION VALUE=2>2
<OPTION VALUE=3>3
<OPTION VALUE=4>4
<OPTION VALUE=5>5
<OPTION VALUE=6>6
<OPTION VALUE=7>7
<OPTION VALUE=8>8
<OPTION VALUE=9>9
<OPTION VALUE=10>10
<OPTION VALUE=11>11
<OPTION VALUE=12>12
<OPTION VALUE=13>13
<OPTION VALUE=14>14
<OPTION VALUE=15>15
</SELECT><BR>
<INPUT NAME=”fullWidth” TYPE=”checkbox” onClick=”hilite()”>
Full Width (bounding rectangle)
</FORM>
<SPAN ID=”main”>
<P>Lorem ipsum dolor sit amet, consectetaur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua
Ut enim adminim veniam, quis nostrud exercitation ullamco:</P>
<UL>
<LI>laboris
<LI>nisi
<LI>aliquip ex ea commodo
</UL>
<P>Duis aute irure dolor in reprehenderit involuptate velit esse
cillum dolore eu fugiat nulla pariatur Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deseruntmollit
anim id est laborum Et harumd und lookum like Greek to me, dereud
facilis est er expedit distinct.</P>
Continued
elementObject.getBoundingClientRect()
Trang 3Listing 15-27 (continued)
</SPAN>
<DIV ID=”hiliter”
STYLE=”position:absolute; background-color:yellow; z-index:-1;
visibility:hidden”>
</DIV>
</BODY>
</HTML>
Because the z-indexstyle property of the hiliterelement is set to -1, the ele-ment always appears beneath the primary content on the page If the user selects a line number beyond the current number of lines in the main element, the hiliter element is hidden
getClientRects()
Example
See Listing 15-27, which demonstrates the differences between getClientRects() and getBoundingClientRect()and shows how you can use the two together
getElementsByTagName(“tagName”)
Example
Use The Evaluator (Chapter 13) to experiment with the getElementsByTagName() method Enter the following statements one at a time into the upper text box and study the results:
document.body.getElementsByTagName(“DIV”)
elementObject.getElementsByTagName()
Trang 4document.getElementById(“myTable”).getElementsByTagName(“TD”).length
Because the getElementsByTagName()method returns an array of objects, you
can use one of those returned values as a valid element reference:
document.getElementsByTagName(“FORM”)[0].getElementsByTagName(“INPUT”).length
getExpression(“attributeName”)
Example
See Listing 15-32 for the setExpression()method This listing demonstrates the
kinds of values returned by getExpression()
hasChildNodes()
Example
Use The Evaluator (Chapter 13) to experiment with the hasChildNodes()method
If you enter the following statement into the topmost text box:
document.getElementById(“myP”).hasChildNodes()
the returned value is true You can find out how many nodes there are by getting
the lengthof the childNodesarray:
document.getElementById(“myP”).childNodes.length
This expression reveals a total of three nodes: the two text nodes and the EM
ele-ment between them Check out whether the first text node has any children:
document.getElementById(“myP”).childNodes[0].hasChildNodes()
elementObject.hasChildNodes()
Trang 5The response is falsebecause text fragments do not have any nested nodes But check out the EM element, which is the second child node of the myPelement: document.getElementById(“myP”).childNodes[1].hasChildNodes()
The answer is truebecause the EM element has a text fragment node nested within
it Sure enough, the statement document.getElementById(“myP”).childNodes[1].childNodes.length yields a node count of 1 You can also go directly to the EM element in your references: document.getElementById(“myEM”).hasChildNodes()
document.getElementById(“myEM”).childNodes.length
If you want to see the properties of the text fragment node inside the EM element, enter the following into the lower text box:
document.getElementById(“myEM”).childNodes[0]
You can see that the dataand nodeValueproperties for the text fragment return the text “all”
insertAdjacentElement(“location”,
Example
Use The Evaluator (Chapter 13) to experiment with the insertAdjacentElement()method The goal of the experiment is to insert a new H1 element above the myPelement
All actions require you to enter a sequence of statements in the topmost text box Begin by storing a new element in the global variable a:
a = document.createElement(“H1”) Give the new object some text:
a.innerText = “New Header”
elementObject.insertAdjacentElement()
Trang 6Now, insert this element before the start of the myPobject:
myP.insertAdjacentElement(“beforeBegin”, a)
Notice that you have not assigned an idproperty value to the new element But
because the element was inserted by reference, you can modify the inserted object
by changing the object stored in the avariable:
a.style.color = “red”
The inserted element is also part of the document hierarchy, so you can access it
through hierarchy references such as myP.previousSibling
The parent element of the newly inserted element is the BODY Thus, you can
inspect the current state of the HTML for the rendered page by entering the
follow-ing statement into the topmost text box:
document.body.innerHTML
If you scroll down past the first form, you can find the <H1>element that you added
along with the STYLEattribute
insertAdjacentHTML(“location”, “HTMLtext”)
insertAdjacentText(“location”, “text”)
Example
Use The Evaluator (Chapter 13) to experiment with these two methods The
exam-ple here demonstrates the result of employing both methods in an attempt to add
some HTML to the beginning of the myPelement
Begin by assigning a string of HTML code to the global variable a:
a = “<B ID=’myB’>Important News!</B>”
Because this HTML is to go on the same line as the start of the myPparagraph, use
the afterBeginparameter for the insert method:
myP.insertAdjacentHTML(“afterBegin”, a)
elementObject.insertAdjacentHTML()
Trang 7Notice that there is no space after the exclamation mark of the inserted HTML But
to prove that the inserted HTML is genuinely part of the document’s object model, you can now insert the text of a space after the B element whose ID is myB:
myB.insertAdjacentText(“afterEnd”, “ “) Each time you evaluate the preceding statement (by repeatedly clicking the Evaluate button or pressing Enter with the cursor in the topmost field), an addi-tional space is added
You should also see what happens when the string to be inserted with insertAdjacentText()contains HTML tags Reload The Evaluator and enter the following two statements into the topmost field, evaluating each one in turn:
a = “<B ID=’myB’>Important News!</B>”
myP.insertAdjacentText(“afterBegin”, a) The HTML is not interpreted but is displayed as plain text There is no object named myBafter executing this latest insert method
insertBefore(newChildNodeObject[,
Example
Listing 15-28 demonstrates how the insertBefore()method can insert child ele-ments (LI) inside a parent (OL) at different locations, depending on the second parameter A text box enables you to enter your choice of text and/or HTML for insertion at various locations within the OL element If you don’t specify a position, the second parameter of insertBefore()is passed as null— meaning that the new child node is added to the end of the existing children But choose a spot from the select list where you want to insert the new item The value of each SELECT list option is an index of one of the first three child nodes of the OL element
Listing 15-28: Using the insertBefore() Method
<HTML>
<HEAD>
elementObject.insertBefore()
Trang 8<TITLE>insertBefore() Method</TITLE>
<SCRIPT LANGUAGE=”JavaScript”>
function doInsert(form) {
if (form.newText) {
var newChild = document.createElement(“LI”)
newChild.innerHTML = form.newText.value
var choice = form.itemIndex.options[form.itemIndex.selectedIndex].value
var insertPoint = (isNaN(choice)) ?
null : document.getElementById(“myUL”).childNodes[choice]
document.getElementById(“myUL”).insertBefore(newChild, insertPoint)
}
}
</SCRIPT>
</HEAD>
<BODY>
<H1>insertBefore() Method</H1>
<HR>
<FORM onSubmit=”return false”>
<P>Enter text or HTML for a new list item:
<INPUT TYPE=”text” NAME=”newText” SIZE=40 VALUE=””></P>
<P>Before which existing item?
<SELECT NAME=”itemIndex”>
<OPTION VALUE=null>None specified
<OPTION VALUE=0>1
<OPTION VALUE=1>2
<OPTION VALUE=2>3
</SELECT></P>
<INPUT TYPE=”button” VALUE=”Insert Item” onClick=”doInsert(this.form)”>
</FORM>
<OL ID=”myUL”>
<LI>Originally the First Item
<LI>Originally the Second Item
<LI>Originally the Third Item
</OL>
</BODY>
</HTML>
item(index | “index” [, subIndex])
elementObjectCollection.item()
Trang 9Use The Evaluator (Chapter 13) to experiment with the item()method Type the following statements into the topmost text box and view the results for each: NN6 and IE5
document.getElementById(“myP”).childNodes.length document.getElementById(“myP”).childNodes.item(0).data document.getElementById(“myP”).childNodes.item(1).nodeName NN6, IE4, and IE5
document.forms[1].elements.item(0).type IE4 and IE5
document.all.item(“myP”).outerHTML myP.outerHTML
In the last two examples, both statements return the same string The first example
is helpful when your script is working with a string version of an object’s name If your script already knows the object reference, then the second approach is more efficient and compact
mergeAttributes(“sourceObject”)
Example
Listing 15-29 demonstrates the usage of mergeAttributes()in the process of repli-cating the same form input field while assigning a unique ID to each new field So you can see the results as you go, I display the HTML for each input field in the field The doMerge()function begins by generating two new elements: a P and an INPUT element Because these newly created elements have no properties associated with them, a unique ID is assigned to the INPUT element via the uniqueIDproperty Attributes from the field in the source code (field1) are merged into the new INPUT element Thus, all attributes except nameand idare copied to the new ele-ment The INPUT element is inserted into the P element, and the P element is appended to the document’s form element Finally, the outerHTMLof the new ele-ment is displayed in its field Notice that except for the NAMEand IDattributes, all
elementObject.mergeAttributes()
Trang 10others are copied This includes style sheet attributes and event handlers To prove
that the event handler works in the new elements, you can add a space to any one
of them and press Tab to trigger the onChangeevent handler that changes the
con-tent to all uppercase characters
Listing 15-29: Using the mergeAttributes() Method
<HTML>
<HEAD>
<TITLE>mergeAttributes() Method</TITLE>
<SCRIPT LANGUAGE=”JavaScript”>
function doMerge(form) {
var newPElem = document.createElement(“P”)
var newInputElem = document.createElement(“INPUT”)
newInputElem.id = newInputElem.uniqueID
newInputElem.mergeAttributes(form.field1)
newPElem.appendChild(newInputElem)
form.appendChild(newPElem)
newInputElem.value = newInputElem.outerHTML
}
// called by onChange event handler of fields
function upperMe(field) {
field.value = field.value.toUpperCase()
}
</SCRIPT>
</HEAD>
<BODY onLoad=”document.expandable.field1.value =
document.expandable.field1.outerHTML”>
<H1>mergeAttributes() Method</H1>
<HR>
<FORM NAME=”expandable” onSubmit=”return false”>
<P><INPUT TYPE=”button” VALUE=”Append Field ‘Clone’”
onClick=”doMerge(this.form)”></P>
<P><INPUT TYPE=”text” NAME=”field1” ID=”FIELD1” SIZE=120 VALUE=””
STYLE=”font-size:9pt” onChange=”upperMe(this)”></P>
</FORM>
</BODY>
</HTML>
normalize()
elementObject.normalize()