| Preface | p. xi |
| Strings | p. 1 |
| Concatenating (Joining) Strings | p. 4 |
| Accessing Substrings | p. 6 |
| Changing String Case | p. 7 |
| Testing Equality of Two Strings | p. 8 |
| Testing String Containment Without Regular Expressions | p. 10 |
| Testing String Containment with Regular Expressions | p. 11 |
| Searching and Replacing Substrings | p. 13 |
| Using Special and Escaped Characters | p. 14 |
| Reading and Writing Strings for Cookies | p. 16 |
| Converting Between Unicode Values and String Characters | p. 19 |
| Encoding and Decoding URL Strings | p. 20 |
| Encoding and Decoding Base64 Strings | p. 22 |
| Numbers and Dates | p. 26 |
| Converting Between Numbers and Strings | p. 30 |
| Testing a Number's Validity | p. 32 |
| Testing Numeric Equality | p. 33 |
| Rounding Floating-Point Numbers | p. 34 |
| Formatting Numbers for Text Display | p. 35 |
| Converting Between Decimal and Hexadecimal Numbers | p. 38 |
| Generating Pseudorandom Numbers | p. 40 |
| Calculating Trigonometric Functions | p. 41 |
| Creating a Date Object | p. 41 |
| Calculating a Previous or Future Date | p. 43 |
| Calculating the Number of Days Between Two Dates | p. 44 |
| Validating a Date | p. 46 |
| Arrays and Objects | p. 50 |
| Creating a Simple Array | p. 53 |
| Creating a Multidimensional Array | p. 54 |
| Converting Between Arrays and Strings | p. 56 |
| Doing Something with the Items in an Array | p. 58 |
| Sorting a Simple Array | p. 60 |
| Combining Arrays | p. 61 |
| Dividing Arrays | p. 62 |
| Creating a Custom Object | p. 64 |
| Simulating a Hash Table for Fast Array Lookup | p. 68 |
| Doing Something with a Property of an Object | p. 70 |
| Sorting an Array of Objects | p. 71 |
| Customizing an Object's Prototype | p. 72 |
| Converting Arrays and Custom Objects to Strings | p. 77 |
| Variables, Functions, and Flow Control | p. 80 |
| Creating a JavaScript Variable | p. 80 |
| Creating a Named Function | p. 84 |
| Nesting Named Functions | p. 87 |
| Creating an Anonymous Function | p. 89 |
| Delaying a Function Call | p. 90 |
| Branching Execution Based on Conditions | p. 92 |
| Handling Script Errors Gracefully | p. 96 |
| Improving Script Performance | p. 98 |
| Browser Feature Detection | p. 102 |
| Detecting the Browser Brand | p. 108 |
| Detecting an Early Browser Version | p. 109 |
| Detecting the Internet Explorer Version | p. 110 |
| Detecting the Netscape Navigator Version | p. 111 |
| Detecting the Client Operating System | p. 113 |
| Detecting Object Support | p. 114 |
| Detecting Object Property and Method Support | p. 117 |
| Detecting the Browser Written Language | p. 119 |
| Detecting Cookie Availability | p. 120 |
| Defining Browser- or Feature-Specific Links | p. 121 |
| Testing on Multiple Browser Versions | p. 123 |
| Managing Browser Windows | p. 125 |
| Setting the Main Window's Size | p. 127 |
| Positioning the Main Window | p. 129 |
| Maximizing the Main Window | p. 130 |
| Creating a New Window | p. 132 |
| Bringing a Window to the Front | p. 135 |
| Communicating with a New Window | p. 136 |
| Communicating Back to the Main Window | p. 139 |
| Using Internet Explorer Modal/Modeless Windows | p. 140 |
| Simulating a Cross-Browser Modal Dialog Window | p. 143 |
| Simulating a Window with Layers | p. 150 |
| Managing Multiple Frames | p. 166 |
| Creating a Blank Frame in a New Frameset | p. 171 |
| Changing the Content of One Frame from Another | p. 173 |
| Changing the Content of Multiple Frames at Once | p. 174 |
| Replacing a Frameset with a Single Page | p. 176 |
| Avoiding Being "Framed" by Another Site | p. 176 |
| Assuring a Page Loads in its Frameset | p. 178 |
| Reading a Frame's Dimensions | p. 180 |
| Resizing Frames | p. 182 |
| Setting Frameset Specifications Dynamically | p. 185 |
| Dynamic Forms | p. 188 |
| Auto-Focusing the First Text Field | p. 191 |
| Performing Common Text Field Validations | p. 192 |
| Preventing Form Submission upon Validation Failure | p. 197 |
| Auto-Focusing an Invalid Text Field Entry | p. 200 |
| Changing a Form's Action | p. 202 |
| Blocking Submissions from the Enter Key | p. 203 |
| Advancing Text Field Focus with the Enter Key | p. 204 |
| Submitting a Form by an Enter Key Press in Any Text Box | p. 205 |
| Disabling Form Controls | p. 207 |
| Hiding and Showing Form Controls | p. 208 |
| Allowing Only Numbers (or Letters) in a Text Box | p. 211 |
| Auto-Tabbing for Fixed-Length Text Boxes | p. 213 |
| Changing select Element Content | p. 214 |
| Copying Form Data Between Pages | p. 218 |
| Managing Events | p. 222 |
| Equalizing the IE and W3C Event Models | p. 227 |
| Initiating a Process After the Page Loads | p. 229 |
| Determining the Coordinates of a Click Event | p. 231 |
| Preventing an Event from Performing Its Default Behavior | p. 235 |
| Blocking Double Clicks | p. 238 |
| Determining Which Element Received an Event | p. 239 |
| Determining Which Mouse Button Was Pressed | p. 241 |
| Reading Which Character Key Was Typed | p. 243 |
| Reading Which Noncharacter Key Was Pressed | p. 245 |
| Determining Which Modifier Keys Were Pressed During an Event | p. 248 |
| Determining the Element the Cursor Rolled From/To | p. 250 |
| Synchronizing Sounds to Events | p. 254 |
| Page Navigation Techniques | p. 256 |
| Loading a New Page or Anchor | p. 259 |
| Keeping a Page Out of the Browser History | p. 261 |
| Using a select Element for Navigation | p. 262 |
| Passing Data Between Pages Via Cookies | p. 264 |
| Passing Data Between Pages Via Frames | p. 266 |
| Passing Data Between Pages Via URLs | p. 268 |
| Creating a Contextual (Right-Click) Menu | p. 271 |
| Creating Drop-Down Navigation Menus | p. 279 |
| Providing Navigation Trail Menus | p. 292 |
| Creating Expandable Menus | p. 296 |
| Creating Collapsible XML Menus | p. 307 |
| Managing Style Sheets | p. 318 |
| Assigning Style Sheet Rules to an Element Globally | p. 320 |
| Assigning Style Sheet Rules to a Subgroup of Elements | p. 322 |
| Assigning Style Sheet Rules to an Individual Element | p. 323 |
| Importing External Style Sheets | p. 324 |
| Importing Browser- or Operating System-Specific Style Sheets | p. 325 |
| Changing Imported Style Sheets After Loading | p. 326 |
| Enabling/Disabling Style Sheets | p. 328 |
| Toggling Between Style Sheets for an Element | p. 329 |
| Overriding a Style Sheet Rule | p. 330 |
| Turning Arbitrary Content into a Styled Element | p. 331 |
| Creating Center-Aligned Body Elements | p. 332 |
| Reading Effective Style Sheet Property Values | p. 333 |
Forcing Version 6. Browsers into Standards-Compatibility Mode | p. 335 |
| Visual Effects for Stationary Content | p. 337 |
| Precaching Images | p. 340 |
| Swapping Images (Rollovers) | p. 342 |
| Changing Text Style Properties | p. 345 |
| Offering Body Text Size Choices to Users | p. 347 |
| Creating Custom Link Styles | p. 351 |
| Changing Page Background Colors and Images | p. 353 |
| Hiding and Showing Elements | p. 355 |
| Adjusting Element Transparency | p. 357 |
| Creating Transition Visual Effects | p. 358 |
| Positioning HTML Elements | p. 363 |
| Making an Element Positionable in the Document Space | p. 368 |
| Connecting a Positioned Element to a Body Element | p. 369 |
| Controlling Positioning Via a DHTML JavaScript Library | p. 371 |
| Deciding Between div and span Containers | p. 377 |
| Adjusting Positioned Element Stacking Order (z-order) | p. 379 |
| Centering an Element on Top of Another Element | p. 381 |
| Centering an Element in a Window or Frame | p. 383 |
| Determining the Location of a Nonpositioned Element | p. 386 |
| Animating Straight-Line Element Paths | p. 387 |
| Animating Circular Element Paths | p. 391 |
| Creating a Draggable Element | p. 393 |
| Scrolling div Content | p. 398 |
| Creating a Custom Scrollbar | p. 404 |
| Creating Dynamic Content | p. 417 |
| Writing Dynamic Content During Page Loading | p. 418 |
| Creating New Page Content Dynamically | p. 419 |
| Including External HTML Content | p. 421 |
| Embedding XML Data | p. 424 |
| Embedding Data as JavaScript Objects | p. 427 |
| Transforming XML Data into HTML Tables | p. 429 |
| Transforming JavaScript Objects into HTML Tables | p. 432 |
| Converting an XML Node Tree to JavaScript Objects | p. 434 |
| Creating a New Element | p. 436 |
| Creating Text Content for a New Element | p. 438 |
| Creating Mixed Element and Text Nodes | p. 440 |
| Inserting and Populating an iframe Element | p. 442 |
| Getting a Reference to an HTML Element Object | p. 444 |
| Replacing Portions of Body Content | p. 446 |
| Removing Body Content | p. 447 |
| Sorting Dynamic Tables | p. 449 |
| Walking the Document Node Tree | p. 452 |
| Capturing Document Content | p. 457 |
| Dynamic Content Applications | p. 459 |
| Displaying a Random Aphorism | p. 460 |
| Converting a User Selection into an Arbitrary Element | p. 462 |
| Automating the Search-and-Replace of Body Content | p. 464 |
| Creating a Slide Show | p. 467 |
| Auto-Scrolling the Page | p. 475 |
| Greeting Users with Their Time of Day | p. 476 |
| Displaying the Number of Days Before Christmas | p. 477 |
| Displaying a Countdown Timer | p. 479 |
| Creating a Calendar Date Picker | p. 486 |
| Displaying an Animated Progress Bar | p. 494 |
| Keyboard Event Character Values | p. 499 |
| Keyboard Key Code Values | p. 501 |
| ECMAScript Reserved Keywords | p. 503 |
| Index | p. 505 |
| Table of Contents provided by Rittenhouse. All Rights Reserved. |