Maintained by: David J. Birnbaum (djbpitt@gmail.com) 
            ![Creative Commons BY-NC-SA 3.0 Unported License [Creative Commons BY-NC-SA 3.0 Unported License]](http://www.obdurodon.org/images/cc/88x31.png) Last modified:
        
        2021-12-27T22:03:49+0000
        
    
    Last modified:
        
        2021-12-27T22:03:49+0000
JavaScript has become a general-purpose programming language used in a number of contexts, supporting a range of initiatives in software development. In this course, we use JavaScript code on the web, known as client-side JavaScript, to create Dynamic HTML, or DHTML. The difference between plain ol’ HTML and HTML embedded with JavaScript (DHTML) is that the latter is interactive, which is to say that it enables the user to interact with and change the page in the browser.
When a web user types a URL into the browser address bar and a website loads, the user’s
            computer is operating as a client, and the website the user sees is a
                server (because it is serving
 web pages to the client). Right now,
            as you read this page, your computer is a client that downloaded this webpage from the
            Obdurodon server. How servers know what information to send and where to send it is not
            our concern in this course. What you should know, however, is that the client downloads
            information from the server, usually via some sort of web browser. The browser knows how
            to present the information it downloads because it comes in a standard format, such as
            HTML or XML.
When the client (your personal computer, for example) downloads a web page, it may also
            download a separate CSS document automatically, without asking for it explicitly, and
            that CSS stylesheet will be used to style the HTML or XML in the browser. Whether a
            separate CSS stylesheet is delivered alongside a web page depends, as you know, on
            whether the author of the web page has incorporated a link in the HTML
                <head> that points to a separate stylesheet. JavaScript operates
            similarly; the developer of a web page can include a link to a separate JavaScript file,
            which will then be delivered automatically along with the web page when the user
            requests the latter. This is called client-side
 JavaScript because the JavaScript
            code is run locally, that is, it is executed and processed entirely by the
            client computer, and does not have to return to the server for more information. This is
            the preferred way to let the user modify the browser display; the slowest part of
            loading and styling a web page is typically sending a request to the server and waiting
            for the information one needs to be returned, so that process is avoided when possible
            by using JavaScript. If all of the desired information can already be accessed by the
            client, modifying the rendering client-side is much faster than sending a new request to
            the server.
JavaScript, like all of the languages we have been working with in this class, understands how to deal with hierarchies. All of our XML and HTML documents have been in hierarchical formats, and JavaScript is just as capable as XPath in being able to traverse and manipulate document hierarchies, and to interact with elements according to their properties. There are some differences, of course, but conceptually, we can use the same types of operations we have been using in all of our X-languages in JavaScript.
The main difference between client-side JavaScript’s understanding of document
            hierarchies and our XML-based understanding is that the main entry point to a hierarchy
            in JavaScript is no longer the document node (which we address by beginning a path
            expression with a slash [/] in XPath), but what is called a window
                object. The reason for this is that JavaScript is capable of working with the
            entire browser window, and not just the XML or HTML document it is rendering. The window
            object represents a frame or window within your web browser, and can be referred to with
            the keyword window.
Think of window as a reference to the very top of your document, much like
                / resets the context of our XPath expressions (that is, starts a new
            path at the very top of the document hierarchy). Note that object is a common
            term within computer science, and generally refers to a named variable with any number
            of values or properties. We can think of XML elements as objects, because not only can
            they have a text value, but they can also have a number of properties; for any XML
            element, its properties can be said to include both its attributes and its relation to
            the document: any ancestor, sibling, or child elements, that is, all of the axes we have
            become familiar with. To learn JavaScript, we must adopt this new nomenclature of
            objects and properties.
The window object has a property called document,
            which is a Document object that can be referred to with the keyword
                document (yes, objects can have properties that are also objects). A
            Document object represents a Node that is the start of an HTML or XML document tree. In
            the case of the window, its document property contains all of
            the Element objects that compose our website, in either HTML or XML form. We
            will use the document keyword frequently to access various elements in our
            web document. To put this in plain language: a window in your browser has a document (a
            Document object that is its document property), and the document has elements (the
            Element objects it contains).
Most of the projects in this class will use JavaScript to change the appearance of a web
            page in a user’s browser in response to user interactions, so we will focus on how to
            accomplish that type of task. User interactions with a document like click, mouseover,
            or button press are called events, and we can tell the browser to respond to
            specific events by creating a JavaScript event handler. An event handler has
            a target, which is the object in the document where the event occurs. A
            target might be a button the user can click or a menu tab that will open up into a list
            when moused over. Elements in the document can have event handler
                properties; for example, a menu tab in the document might have the
            property of being associated with an event handler that knows what to do when a user
            mouses over the tab. The components of an event handler, then, are the target
            (the element in the document where the event occurs), the event (what has to
            happen to the target to cause the event handler to fire), and the event
                handler code, which describes what happens when the event occurs at the
            target.
All event handlers have names that are the concatenation of the prefix on
 and the
            name of some event, like click
 or mouseover
 (that is, onclick
            or onmouseover). We can assign these properties to a specific action that
            we want to occur when the event happens, that is, on the occurrence of the
            event. There are three practical ways of doing this, all of which have analogs in
            CSS.
onclick event handler can
                be deployed for a particular element by assigning a value to the
                    @onclick attribute of that element.<p onclick="stuff();"> will cause a JavaScript function called
                    stuff() (which we write ourselves) to fire whenever the user clicks
                on that particular paragraph.<p style="color: red;"> uses inline CSSto color a paragraph red.
<head> of the HTML document<script type="text/javascript" src="stuff.js">//</script>
                causes the JavaScript code in an external file called stuff.jsto load and run. To enhance compatibility with older browsers, it is common to write separate start and end tags with two slashes between them, instead of a regular XML empty element.
<link rel="stylesheet" type="text/css" href="style.css"/> causes
                an external CSS stylesheet to be associated with the HTML document. The stylesheet
                contains the information that associates styles with specific elements, just as an
                external JavaScript file may contain the information to associate event handlers
                with their targets, that is, with the elements in the HTML document where the events
                occur.<script> element
            in the <head> of the HTML documenttargetelements within the HTML. Instead, the handlers are assigned within the JavaScript script. The difference between #2 and #3 is that in #2 the
<script> element links to an external file that contains
                JavaScript code, but it does not contain any JavaScript code itself. With #3 there
                is no external file, and the raw JavaScript code is written between the start and
                end <script> tags.<script type="text/javascript"> (raw JavaScript code goes here)
                    </script><style>
                element in the <head> of the HTML document.Recall that the preferred way to cause CSS styling to be applied to HTML is to create an
            external CSS document and link to it from the HTML. It is possible to write CSS rules
            directly inside the HTML, either inside a <style> element in the
                <head> (analogously to our #3, above) or in @style
            attributes on individual elements (analogously to our #1, above), but for a variety of
            reasons that is rarely the best approach. Similarly, the preferred way to associate
            JavaScript with HTML is to use the second of the methods above, that is, to write all of
            the JavaScript event handlers outside the HTML, in a separate JavaScript file, and
            associate that file with the HTML. Nonetheless, because the first approach is easier to
            understand and to code and the third avoids the step of managing an additional document,
            we may use them for some assignments in this course. You can combine these three methods
            within in a single document, just as you can combine the different CSS methods.
External JavaScript scripts are, by convention, stored with a .js
 file extension
            (just as CSS files by convention end in .css
). You can create and edit JavaScript
            in <oXygen/>.
How do we describe actions in JavaScript? That is, how to do we tell JavaScript what to
            do when an event occurs on a target? Functions in JavaScript, as in XPath, perform
            actions using a set of input parameters. A simple function in JavaScript called
                alert() takes a single string as its input, and alerts the user by
            creating a tiny popup window with the string as a message inside it. For example, if we
            wanted a click event for some target to alert the message, Catz r kewl!
, we would
            assign the event handler like this: onclick="alert('Catz r kewl!')", which
            we have done for this <span> element. We’ve used
            strategy #1, inline JavaScript attached to an @onclick attribute, to make
            this happen; you can see our underlying code by viewing the source of this page.
load eventThe window has its own load event, which is triggered when the
            content of the document inside it is finished loading and is ready to be presented in
            the browser. This lets it function as a bootstrapping event; because it fires
            automatically whenever the document loads, it can be used to initialize other JavaScript
            functions. In conformity with the general convention, the event handler for the
                load event is called onload. We can assign this event
            handler to a specific action that we would like to be performed upon the triggering of
            the load event.
Event handlers normally listen on the element to which they’re attached. Recall that the
                target of the event handler is the element where the event occurs.
            For example, the onclick event listener in the example above listens for a
            click on the <span> that carries the @onclick attribute,
            and when the user clicks on that <span>, it activates the
                alert() function. Clicking elsewhere doesn’t trigger the alert; the
            event handler is listening for clicks only on the <span> with which
            it’s associated.
That’s fine for elements like <span>, but the window isn’t an element
            and doesn’t have attributes, so if we want an event to fire when the window loads, we
            need a different strategy. The way to associate an onload event handler
            with the window is to use dot notation; writing
                window.onload="alert('Catz r kewl!');" would mean fire this event
                (pop up the alert) when the window onload event occurs (that is, when the window
                finishes loading the document)
.
Try creating an HTML document, with a paragraph (<p>) containing some
            text, and a span (<span>) containing part of the text within that
            paragraph. Give the span an @onclick attribute, the value of which is an
            alert (alert()) that has a specific message associated with it (inside
            quotation marks between the parentheses). In Real Life you’ll want to style the span, so
            that the text is visibly different from the rest of the paragraph and your users will
            know that it’s clickable. You can do that now, or, for this exercise, you can just
            remember which portion of the text you assigned an event handler to.
After you’ve tested that, modify the HTML document by including a
                <script> element within the <head> that
            contains this line of code: window.onload="alert('Insert message here');".
            Note that the XHTML rules require that you include a @type attribute on
            your script element with a value text/javascript
.
We ended that single line of code with a semicolon. The rules for JavaScript, as for CSS, are that you can include multiple statements in a set of rules, and each must end with a semicolon. The semicolon is optional on the last (or only) statement in both CSS and JavaScript, but we strongly advise including it, so that you won’t forget about it should you go back and add another line. When you’re done, refresh your page, and you should get an alert with the message you wrote in your script before your paragraph’s content is even drawn to the screen.
The resulting HTML document should look something like this:
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Your first JavaScript script</title>
        <script type="text/javascript">
            window.onload = alert('This message came from loading the window!');
        </script>
    </head>
    <body>
        <p>This is a sample paragraph of text meant to <span
                onclick="alert('This message came from clicking the span!');"
                style="color:blue; text-decoration:underline; cursor:pointer">exemplify the
                circumstance</span> of possibly having an HTML paragraph, perchance.</p>
    </body>
</html>
        
        The use of JavaScript to modify CSS in memory, changing the appearance of a page that has
            already been loaded in the browser, is called DHTML (dynamic HTML). You can see it in
            action at http://zatochnik.obdurodon.org.
            Clicking on numbers in the SVG at the top or on individual paragraphs in either of the
            columns on the sides causes paragraphs to appear and disappear (toggling the CSS
                display property) and change color and other font properties (toggling
            the CSS color and font-decoration properties). Those events
            also change the color and opacity of components of the SVG. Some tasks you might want to
            consider for your projects might include:
display property. For an example, click
                on a project title at http://www.obdurodon.org.The Tygeron the
experienceside, that side scrolls, and the
innocenceside also scrolls in sync to its
mirror poem,
The Lamb.
legendarea to highlight words associated with those concepts.