Js 1
Js 1
Js 1
Getting Started
To dive into Javascript all you need is a simple text-editor and a browser. In
windows, you can use notepad under your accessories and Linux and mac
users have a similar editor. Simply create a blank HTML page as such…
<html>
<head>
<title>Learning Javascript</title>
</head>
<body>
<p>Hello World!
</body>
</html>
Save the file then in your browser type in the file name you just created to
see the results. Javascript is interpreted so any changes you make to this file
will show up instantly in the browser the moment you hit the reload button.
In-Line Javascript
To define a Javascript block in your web page, simply use the following block
of HTML.
<script type='text/javascript'>
// Your script goes here.
</script>
You can place these script blocks anywhere on the page that you wish, there
are some rules and conventions however. If you are generating dynamic
content as the page loads you will want the script blocks to appear where
you want their output to be. For instance, if I wanted to say "Hello World!" I
would want my script block to appear in the <body> area of my web page
and not in the <head> section.
Unless your scripts are generating output as the page loads, good practice
says that you should place your scripts at the very bottom of your HTML. The
reason for this is that each time the browser encounters a <script> tag it has
to pause, compile the script, execute the script, then continue on generating
the page. This takes time so if you can get away with it, make sure the
browser hits your scripts at the end of the page instead of the start.
External Javascript
External Javascript is where things get interesting. Any time you have a block
of code which you will want to use on several different web pages you should
place that block in an external Javascript file. The clock on the upper right-
hand corner of this page is a good example. The clock appears on almost
every page on this site and so it is included in my "common.js" file. Every
web-page on the site will load this file and so the clock is available to all of
my web-pages.
There's nothing fancy about an external Javascript file. All it is, is a text file
where you've put all your Javascript. Basically everything that would
ordinarily go between the <script> tags can go in your external file. Note
that between was stressed, you can not have the <script> </script> tags
themselves in your external file or you will get errors.
The biggest advantage to having an external Javascript file is that once the
file has been loaded, the script will hang around the browser's cache which
means if the Javascript is loaded on one page then it's almost a sure thing
that the next page on the site the user visits will be able to load the file from
the browser's cache instead of having to reload it over the Internet (This is
an incredibly fast and speedy process).
Including an external file is basically the same as doing an in-line script, the
only difference is that you specify a filename, and there's no actual code
between <script> and </script>...
<script type='text/javascript' src='common.js'></script>
When the browser encounters this block it will load common.js, evaluate it,
and execute it. Like in-line scripts above you can place this block anywhere
you need the script to be and like in-line scripts you should place these as
close to the bottom of the web-page as you can get away with.
The only difference between in-line Javascript blocks and external Javascript
blocks is that an external Javascript block will pause to load the external file.
If you discount that one thing, there's no procedural difference between the
two!
Output (writeln)
One of the most important things to do when learning a new language is to
master basic input and output which is why hello world has become almost a
cliche in programming textbooks. For Javascript you need three hello worlds
because there are three ways to communicate with the user, each
increasingly more useful than the last.
The first method is to use the document.writeln(string) command. This can
be used while the page is being constructed. After the page has finished
loading a new document.writeln(string) command will delete the page in
most browsers, so use this only while the page is loading. Here's how a
simple web-page will look...
<html>
<head>
</head>
<body>
<script type='text/javascript'>
document.writeln('Hello World!');
</script>
</body>
</html>
As the page is loading, Javascript will encounter this script and it will output
"Hello World!" exactly where the script block appears on the page.
The problem with writeln is that if you use this method after the page has
loaded the browser will destroy the page and start constructing a new one.
As you can see by clicking on this example which will execute
adocument.writeln after the page has finished loading.
For the most part, document.writeln is useful only when teaching yourself
the language. Dynamic content during page load is better served by the
server-side scripting languages. That said, document.writeln is very useful in
pre-processing forms before they're sent to the server -- you can basically
create a new web-page on the fly without the need to contact the server.
Output (alert)
The second method is to use a browser alert box. While these are incredibly
useful for debugging (and learning the language), they are a horrible way to
communicate with the user. Alert boxes will stop your scripts from running
until the user clicks the OK button, and it has all the charm and grace of all
those pop-up windows everyone spent so many years trying to get rid of!
<html>
<head>
</head>
<body>
<script type='text/javascript'>
alert('Hello World!');
</script>
</body>
</html>
You can see this alert in action by clicking here!
Output (getElementById)
The last method is the most powerful and the most complex (but don't worry,
it's really easy!).
Everything on a web page resides in a box. A paragraph (<P>) is a box.
When you mark something as bold you create a little box around that text
that will contain bold text. You can give each and every box in HTML a
unique identifier (an ID), and Javascript can find boxes you have labeled and
let you manipulate them. Well enough verbiage, check out the code!
<html>
<head>
</head>
<body>
<div id='feedback'></div>
<script type='text/javascript'>
document.getElementById('feedback').innerHTML='Hello World!';
</script>
</body>
</html>
The page is a little bigger now but it's a lot more powerful and scalable than
the other two. Here we defined a division <div> and named it "feedback".
That HTML has a name now, it is unique and that means we can use
Javascript to find that block, and modify it. We do exactly this in the script
below the division! The left part of the statement says on this web page
(document) find a block we've named "feedback" (getElementById('feedback') ),
and change its HTML (innerHTML) to be 'Hello World!'.
We can change the contents of 'feedback' at any time, even after the page
has finished loading (which document.writeln can't do), and without
annoying the user with a bunch of pop-up alert boxes (which alert can't do!).
It should be mentioned that innerHTML is not a published standard. The
standards provide ways to do exactly what we did in our example above.
That mentioned, innerHTML is supported by every major Browser and in
addition innerHTML works faster, and is easier to use and maintain. It's,
therefore, not surprising that the vast majority of web pages use innerHTML
over the official standards.
While we used "Hello World!" as our first example, its important to note that,
with the exception of <script> and <style>, you can use full-blown HTML.
Which means instead of just Hello World we could do something like this…
<html>
<head>
</head>
<body>
<div id='feedback'></div>
<script type='text/javascript'>
document.getElementById('feedback').innerHTML='<P><font
color=red>Hello World!</font>';
</script>
</body>
</html>
innerHTML will process your string and basically redraw the web page with
the new content. This is a VERY powerful and easy to use concept. It means
you can basically take an empty HTML element (which our feedback division
is) and suddenly expand it out with as much HTML content as you'd like.
<script type='text/javascript'>
document.getElementById('feedback').innerHTML='Hello World!';
function goodbye() {
document.getElementById('feedback').innerHTML='Goodbye World!';
}
</script>
</body>
</html>
Here we did two things to the example, first we added an "onClick" event to
our feedback division which tells it to execute a function
called goodbye() when the user clicks on the division. A function is nothing
more than a named block of code. In this example goodbye does the exact
same thing as our first hello world example, it's just named and inserts
'Goodbye World!' instead of 'Hello World!'. See for yourself! Click the text
below…
Hello World!
Another new concept in this example is that we provided some text for
people without Javascript to see. As the page loads it will place "Users
without Javascript will see this." in the division. If the browser has Javascript,
and it's enabled then that text will be immediately overwritten by the first
line in the script which looks up the division and inserts "Hello World!",
overwriting our initial message. This happens so fast that the process is
invisible to the user, they see only the result, not the process.
The goodbye() function is not executed until it's explicitly called and that only
happens when the user clicks on the division.
While Javascript is nearly universal there are people who surf with it
deliberately turned off and the search bots (googlebot, yahoo's slurp, etc)
also don't process your Javascript, so you may want to make allowances for
what people and machines are-not seeing.
Here we create an input field and give it a name of userInput. Then we create
a HTML button with an onClickevent that will call the function userSubmit().
These are all standard HTML form elements but they're not bound by a
<form> tag since we're not going to be submitting this information to a
server. Instead, when the user clicks the submit button, the onClick event will
call the userSubmit() function…
<script type='text/javascript'>
function userSubmit() {
var UI=document.getElementById('userInput').value;
document.getElementById('result').innerHTML='You typed: '+UI;
}
</script>
Here we create a variable called UI which looks up the input field userInput.
This lookup is exactly the same as when we looked up our feedback division
in the previous example. Since the input field has data, we ask for
itsvalue and place that value in our UI variable. The next line looks up
the result division and puts our output there. In this case the output will be
"You Typed: " followed by whatever the user had typed into the input field.
Give it a try and see how it works…
Submit
We don't actually need to have a submit button. If you'd like to process the
user input as the user types then simply attach an onKeyup event to the input
field as such…
<input id='userInput' onKeyUp="userSubmit()" size=60><BR>
<P><div id='result'></div>
It's interesting to note that as you're typing you're actually creating HTML
and inserting it into this document which means that html tags you typed will
be appropriately processed. Try typing "The quick<p>brown fox." and you'll
see the line break correctly inserted in the output.
Comments
Javascript supports two types of comments. Double-slashes (//) tell javascript
to ignore everything to the end of the line. You will see them used most
often to describe what is happening on a particular line.
var x=5; // Everything from the // to end of line is ignored(*)
var thingamajig=123.45; // 2 times the price of a whatsit.
Block quotes begin a comment block with a slash-asterisk (/*) and Javascript
will ignore everything from the start of the comment block until it encounters
an asterisk-slash (*/). Block quotes are useful for temporally disabling large
areas of code, or describing the purpose of a function, or detailing the
purpose and providing credits for the script itself.
function whirlymajig(jabberwocky) {
/* Here we take the jabberwocky and insert it in the gire-gimble,
taking great care to observe the ipsum lorum! For bor-rath-outgrabe!
We really should patent this! */
return (jabberwocky*2);
}
You should note that while comments are useful for maintaining the code,
they are a liability itself in Javascript since they will be transmitted along with
the code to each and every page load, which can create substantial
bandwidth penalties and increase the load time of your page for users.
This doesn't mean you shouldn't comment your code, just that once your
code is "finished" you should make a backup copy with the comments, then
strip out all the comments in the file which is actually sent to the user. You
can automate this process with a minimizing application which you can
find here and an on-line javascript version here.
The result of minimizing your Javascript is a tiny, compact file which is a
fraction of the size of the original which will save you bandwidth and increase
page-load time for your visitors. However the result is also a very
unmaintainable mess which is why you should keep a separate, unminimized
(and heavily commented) version of the original file.
(*) Of special consideration, you should note that the browser itself is
ALWAYS looking for a </script> tag to mark the end of your Javascript and if
it finds that tag, intact, in-one-piece, be it in a string or a comment, it is
going to stop processing Javascript at that point and restart-processing
HTML.
var x=5;
/* The browser will break the Javascript when it sees this </script> tag.
Everything from tag forward is now being processed as HTML! This is a
bad thing!
To avoid this you need to avoid using this tag anywhere in your
Javascript, and if
you must have it, you should break the string out like this... */
document.writeln('</scr'+'ipt>');
Variables
Javascript is not a strongly typed language which means you rarely have to
concern yourself with the type of data a variable is storing, only what the
variable is storing and in Javascript, variables can store anything, even
functions.
var thisIsAString = 'This is a string';
var alsoAString = '25';
var isANumber = 25;
var isEqual = (alsoAString==isANumber); // This is true, they are both 25.
var isEqual = (alsoAString===isANumber); // False one is a number, the other
a string.
var concat=alsoAString + isANumber; // concat is now 2525
var addition=isANumber + isANumber; // addition is now 50
…will cause problems in Internet Explorer because the variable name and
the division name are identical.
In recent years a convention has formed around the use of the $ symbol as
various libraries like Prototype and JQuery use it to look up a named HTML
element. For most purposes if you see $('something') in Javascript you
should read that as being document.getElementById('something'). This is not
standard Javascript, in order for$('something') to work, you need to be using
a Javascript framework which will define $ as doing something (Like JQuery,
Prototype, etc).
The use of a leading underscore (_) is generally useful to indicate a global
variable or a variable that has been set outside the current scope.
A final consideration on variables is that functions themselves can be defined
like, and act like variables. Once a function has been defined it can be
passed to other functions as an argument (A process knows as lambda), or
assigned to other variables just like a string, array or any other Javascript
object. Generally if you use a function without trailing parenthesis (), the
function is treated like a variable and can be passed and assigned. Trailing
parenthesis INVOKE the function, executing it and passing back the return
value (if any).
Please note that this is a very broad summary overview of Javascript's data
types. For more information please see the other articles in this series (listed
at the top of the page) which go into exhaustive detail on each Javascript
type.
Variable Scope
Variables in Javascript have FUNCTION scope. That is, all variables are global
unless they are explicitly defined inside a function and even then child-
functions have access to their parent's variables. If a function defines a new
variable WITHOUT using the var keyword, that variable will be global in
scope.
var global = 'this is global';
function scopeFunction() {
alsoGlobal = 'This is also global!';
var notGlobal = 'This is private to scopeFunction!';
function subFunction() {
alert(notGlobal); // We can still access notGlobal in this child
function.
The concept that a variable will continue to exist, and can be referenced
after the function that created it has ceased executing is known as CLOSURE.
In the above example, stillGlobal, and alsoGlobal can be considered closures
because they persist after the function that creates them has ceased to
operate. You can do somepretty fancy stuff with it later on, but it's not
terribly hard to understand once you associate it with creating a global
scoped variable inside a function.
Special Keywords
Javascript has a few pre-defined variables with special meaning.
NaN -- Not a Number (Generated when an arithmetic operation returns an
invalid result). NaN is a weird construct. For one, it is NEVER equal to itself so
you can't simply check to see if 3/'dog' == 'NaN'. You must use the
construct isNaN(3/dog) to determine if the operation failed. In boolean
operations NaN evaluates to false, however 0 also evaluates to false so
use isNaN. Since NaN is never equal to itself you can use this simple trick as
well:
if (result != result) { alert('Not a Number!'); }
Arithmetic Operators
There's nothing particularly exotic about the way Javascript does arithmetic.
Operator Description
+ Addition (also string concatention)
- Subtration (also unary minus)
* Multiplication
/ Division
% Remainder of division (or modulus)
++ pre or post increment
-- pre or post decrement
++ and -- are C style operators their position around the variable they are
operating on is important. If the operator appears BEFORE the variable they
will be evaluated immediately, if they appear AFTER the variable they will be
evaluated only after the entire line has been resolved. For instance…
var x = 5;
var y = x++; // y=5, x=6
var x = 5;
var y = ++x; // y=6, x=6
Conditionals: IF
The if statement lets you execute a block of code if some test is passed.
var x=5;
if (x==5) {
alert('x is equal to 5!');
}
You can also use an else clause to execute code if the test fails.
var x=5;
if (x==5) {
alert('x is equal to 5!');
} else {
alert('x is not equal to 5!');
}
An elseif statement also exists which allows for better formating of long
conditional tests.
var x=5;
if (x==1) {
alert('x is equal to 1!');
} else if (x==2) {
alert('x is equal to 2!');
} else if (x==5) {
alert('x is equal to 5!');
} else {
alert('x isn't 1, 2 or 5!');
}
Conditionals: SWITCH
If you're going to be doing a large number of tests, it makes sense to use a
switch statement instead of nested ifs. Switches in javascript are quite
powerful, allowing evaluations on both the switch and the case.
var x=5;
switch (x) {
case 1: alert('x is equal to 1!'; break;
case 2: alert('x is equal to 2!'; break;
case 5: alert('x is equal to 5!'; break;
default: alert("x isn't 1, 2 or 5!");
}
Note that if you omit the break statement that ALL of the code to the end of
the switch statement will be executed. So if x is actually equal to 5 and there
is no break statement, an alert for "x is equal to 5" will appear as well as an
alert for "x isn't 1,2, or 5!".
Sometimes it makes more sense to do the evaluation in the case statement
itself. In this case you'd use true, false, or an expression which evaluates to
true or false in the switch statement.
var x=5;
switch (true) {
case (x==1): alert('x is equal to 1!'; break;
case (x==2): alert('x is equal to 2!'; break;
case (x==5): alert('x is equal to 5!'; break;
default: alert("x isn't 1, 2 or 5!");
}
doAddition(12);
The question mark (?) and colon (:) tend to get lost in complex expressions
as you can see in this example taken from wikipedia (but which will also
work in Javascript if the various variables are assigned...)
for (i = 0; i < MAX_PATTERNS; i++)
c_patterns[i].ShowWindow(m_data.fOn[i] ? SW_SHOW : SW_HIDE);
Loops: FOR
The for loop follows basic C syntax, consisting of an initialization, an
evaluation, and an increment.
for (var i=0; (i<5); i++) {
document.writeln('I is equal to '+i+'<br>');
}
// outputs:
// I is equal to 0
// I is equal to 1
// I is equal to 2
// I is equal to 3
// I is equal to 4
Loops: FOR/IN
Javascript has a variant of the for loop when dealing with Javascript objects.
Consider the following object…
var myObject = { 'animal' : 'dog',
'growls' : true,
'hasFleas': true,
'loyal' : true }
The typeof check to screen out functions will ensure that your for/in loops
will extract only data and not methods that may be added by popular
javascript libraries like Prototype.
Loops: WHILE
whileloops in Javascript also follow basic C syntax and are easy to
understand and use.
The while loop will continue to execute until its test condition evaluates to
false or the loop encounters a breakstatement.
var x = 1;
while (x<5) {
x = x +1;
}
var x = 1;
while (true) {
x = x + 1;
if (x>=5) {
break;
}
}
Sometimes it makes more sense to evaluate the test condition at the end of
the loop instead of the beginning. So for this Javascript supports
a do/while structure.
var x=1;
do {
x = x + 1;
} while (x < 5);
Now to this we will add an input line, a drop down box, and a submit button.
Notice we give an ID to the form elements, and have the submit button call a
function when it's clicked. A function which we will write later. We've also
added some descriptive text.
<html>
<head>
<title>My First Javascript</title>
</head>
<body>
Hello World!
<p>Say what? <input id="sayThis" size=40>
<P>How many times? <select id='howMany'>
<option value=1>1</option>
<option value=5 selected>5</option>
<option value=10>10</option>
<option value=20>20</option>
</select>
<p><button onClick='doLoop()'>Do It!</button>
</body>
</html>
Now we need to add a division where the output will occurr. We'll add this
right below the form elements, specifically the "Do It!" button.
<html>
<head>
<title>My First Javascript</title>
</head>
<body>
Hello World!
<p>Say what? <input id="sayThis" size=40>
<P>How many times? <select id='howMany'>
<option value=1>1</option>
<option value=5 selected>5</option>
<option value=10>10</option>
<option value=20>20</option>
</select>
<p><button onClick='doLoop()'>Do It!</button>
<p><div id="results"></div>
</body>
</html>
The script for this will be simple enough. When the button is clicked
the doLoop() function will be called. doLoop() will lookup the value of
the sayThis input field, then repeat that howMany times.
Here's the script itself, separate from the HTML…
function doLoop() {
var sayWhat = document.getElementById('sayThis').value;
var maxLoop = document.getElementById('howMany').value;
var str = ''; // where we'll store our output temporarily.
for (var i=1; (i<=maxLoop); i++) {
str=str+i+':'+sayWhat+'<br>';
}
document.getElementById("results").innerHTML=str;
}
Say what?
How many times?
5
Do It!
Conclusion
As stated at the beginning of this article, this document is intended to bring
a programmer up to speed in Javascript, and is not an exhaustive review of
the language. This article is a part of a larger series of reference articles
(listed at the top of the page). As you master the fundamentals introduced
on this page, it's recommended that you visit the other reference articles to
master the details of the language.
Javascript is a surprisingly deep and well considered language (with a few
notable and notorious exceptions). It is simple enough for beginners to
programming to understand and scales to become as advanced as you need
it to be. While it may be frustrating to work around the various idiosyncrasies
of all the browser models and versions, javascript itself is a joy to work in,
and when developing web-applications, the least and most unobtrusive of all
the problems you will have to surmount.
http://www.hunlock.com/blogs/Essential_Javascript_--_A_Javascript_Tutorial