|
|
|
|
JavaScript
/ DHTML
What is
it, why did I stop using it?
|
|
|
This article assumes a
very basic understanding of HTML.
The Web technology of the week is called DHTML (Dynamic
Hyper-Text Markup Language) -- which is basically just a
renaming, and some extension, of JavaScript. DHTML has some
added functionality, and uses extensions to HTML and has
more features -- but the concepts are the same.
What is it?
Well what is JavaScript? JavaScript is just a poorly
implemented scripting language that allows programmers (and
web designers) to make web pages do certain things based on
users actions. Sometimes it is used to send in a form when a
user clicks on send (a useful way to use JavaScript), and
other times it is to highlight a button or picture when the
mouse moves over it. (you see this one a lot -- including on
the previous versions of MacKiDo).
JavaScript is NOT Java! JavaScript has
nothing to do with Java. Sun started promoting Java as
THE language of the Web, so Netscape AND SUN
decided to rename LiveScript into JavaScript to try to
tag along on each others marketing. They are as related
as car and cargo (which both have 'car' in their name).
Special thanks go to their respective marketing cretins
(and management) for forever confusing users!
In an wonderful metaphor for life on the web. I tried
to cross reference their Press Release (non prime-time,
on a weekend). Suns site was dog-slow, found dead-link to
the release once [951204],
search wouldn't work the second time (with the exact same
parameters) and crashed my machine -- hard. Netscape had
no references to their own press releases at all. These
are the supposed leaders of the industry!
How does it work?
There is no magic to JavaScript, it is a simple scripting
language, with some branches and functions (routines ) to
perform simple functions. We embed this script right into
the HTML page. This script gets run by your browser, and
will allow for changing things, depending on what the user
does (that is where the Dynamic, in DHTML comes from --
things can change).
Let me show you the basics of how to animate a button in
three easy steps.
1) First we should create the button itself.
<A HREF="URL"
onmouseover="setImage('button1'); return true"
onmouseout="resetImage('button1')"
>
<IMG SRC="Graphics/navAbout.GIF"
name=button1
>
</A>
|
The <A> tag is a link, and we must fill
out a URL for what it is a link to.
"onmouseover", means just that -- when the
mouse goes over this object, then we call the "setImage"
routine, with 'button1' as the first (and only)
parameter.
"onmouseout", means just that -- when the mouse
stops being over this object (it goes out of the region),
then we call the "resetImage" routine, with 'button1' as
the first (and only) parameter.
We also must remember to name our object the same as
the parameter we are passing ('button1').
This is all done anywhere where you would normally
define your HTML code for a link.
2) Next we have to implement the two functions we
used; setImage() and resetImage().
function setImage(imgName) {
imgOn = eval(imgName + "on.src");
document [imgName].src = imgOn;
}
function resetImage(imgName) {
imgOff = eval(imgName + "off.src");
document [imgName].src = imgOff;
}
|
The routines just sets a temp
variable (imgOn or imgOff) to be the parameter we passed
("button1") and we append a string to that (either
"button1on.src" or "button1off.src).
Then we call (execute) the main
(document) script with button1.src set to what was in our
temp variable ("button1on.src"). A little complex, but
all this is just a way to set things up for the main
script.
3) Lastly we have to implement the main script.
button1on
= new Image(sizeX, sizeY);
button1on.src
= "imageON.gif";
-
button1off
= new Image(sizeX, sizeY);
button1off.src
= "imageOFF.gif";
|
The main script creates an image
for button1on (or off), that will display in the same
physical place on our web page as the original item did
(of the size we specify).
Then the browser sets the source
(the picture) to be the image we want -- so it will
change to the
"imageON .gif"
or
"imageOFF .gif"
as is appropriate.
That's it. Our image changes
depending on moving over the item or not.
Steps 2 and 3 are
placed between <script></script> tags at
the top of the HTML document (in the <head>
block) -- so that the code is preloaded before it is
run. Imagine if it wasn't loaded yet, and the user
moved over a button. The browser would look for code
that isn't there, or only partially loaded, and there
would be some ugly results.
Pretty easy stuff.
Now the example I used was a little
simplified, since you should really check what Browser
version you are being run on (to make sure it supports
JavaScript) and so on. But you should get the idea. It is
not that complex for programmers -- and even nonprogrammers
can understand the basic concepts.
However, there are glaring flaws in
the design.
Why it fails to work and why I will avoid it whenever
possible
If JavaScript is so simple and
easy, then why did I pull it out of my page?
Well there are quite a few problems
with JavaScript. Let me give you an idea of some of the
problems, so that you can make an informed decision on
whether to use it or not.
- JavaScript is
proprietary and Microsoft is pure evil. Microsoft
didn't implement JavaScript for their browsers -- they
use something called JScript. JScript is almost like
JavaScript, and some scripts can run -- but many don't.
Microsoft added some features, and implemented some
different (some say it is better). Either way, many
Scripts will only run right on one platform (Netscape or
Explorer). Many other browsers don't implement it at
all.
- You can't depend on
JavaScript being there! I'm not only talking about
all the browsers that don't support it -- and there are
quite a few. I'm talking about the fact that people turn
it off. Almost everyone that has ever visited GeoCities
has turned it off (because of those annoying pop-up ads),
and many people have security or reliability concerns. So
you can't depend on it -- which means you have to be real
careful what you try to do with it (because some people
won't have access to it).
- JavaScript is slow. Now
the scripts don't run that fast, but they run fast enough
for most things -- so that is not what I'm complaining
about. JavaScript slows down your entire page/site. Lets
take the example of my page. I had 16 animated buttons.
Because JavaScript is poorly designed, I had to implement
the above code 16 times in my page -- this cause my pages
to be much larger (sometimes twice as large), and size is
the same as performance (the bigger the slower). It is a
poorly designed language that causes such redundancy.
Then I had to have multiple versions of every button
image (3 of them), one for each state. Individually, the
buttons were small, but loading 48 of them was a pain,
and it caused peoples disks to thrash, and loading all
those sub-files slowed performance even more. More
complex JavaScripts are even worse, often they require
large chunks of code, for very small displays, and every
possible display element to be preloaded -- so users have
to wait for everything to load, to see the one choice
that they want. More importantly, since removing
JavaScript, people keep telling me how much faster my
page is.
NOTE: I made a mistake. I
thought that I had to add the same code to every page --
that users couldn't define the JavaScript on one page,
and tell others to use that one instance (because
JavaScript is part of your HTML file, not an additional
file). I was wrong, you can in a limited way -- there is
a command <SCRIPT LANGUAGE="JavaScript1.1"
SRC="script.js"> that allows this function.
- JavaScript is poorly
designed. It is a bad design that can't eliminate
redundancy, and causes as many problems as it cures.
Instead of being able to create text buttons that
highlighted as I moved over them, I had to create graphic
ones (that take more space). I was annoyed at the
documentation, and the size that scripts ended up. I was
annoyed by the loss of stability. All elements of bad
design -- but read on, it gets worse.
- Javascript causes
crashes. It will bring down the browser and sometimes
the System -- and crashes (bugs) can survive that will
survive a restart and crash you again and again. Why?
- Microsoft and Netscape don't
value stability and quality in their products. Their
browsers are proof of this -- crashy monsters that
they are. JavaScript is actually a language -- and
bugs in something so complex as a language make things
worse, but it is hard to remove such bugs.
- Networks are "buggy" and
introduce "noise". So sometimes text comes across as
gobbledygook. So when you load an HTML page that has a
script, the script can have errors in it caused by
network noise. This means that when the JavaScript is
run, it will crash. (A good design would have
prevented this by having a special "validated" stream
for the JavaScript, or sanity checking the
JavaScript). It was unimportant to have noise in HTML
text, but for script embedded in that stream it can be
catastrophic.
NOTE: I know in theory
this isn't supposed to happen. I also know that in
function, I do get noisy connections, and garbage in
my web pages, and scripts, that causes the machine (or
at least browser) to crash or hang. I've also recieved
enough complaints from MacKiDo readers, to know that
it is not a fluke with my machine.
- Browsers CACHE (they save
files locally, to your hard disk, for speed). So lets
say you go to my site, and you get some noise in the
JavaScript. Crash! If Microsoft or Netscape valued
quality products, they would validate the Script
before they ran it (sanity checking), and they would
stop the script before it caused a problem. They
don't, so your browser may come crashing down.
Furthermore, your browser may crap all over memory or
on system resources and bring your whole machine
crashing down. Bad design and testing by Microsoft and
Netscape -- but you get to reboot. Rerun your browser.
Go back to the page that crashed you (say my old site)
-- but the browser saves a local copy of the file (it
cached it). The browser will try to use that cached
one first (instead of reloading) -- guess what
happens? It crashes again (the script is still wrong).
It will continue to do so until you (the user) flushes
the browsers cache, or forces a reload from the site.
I was getting just such complaint, infrequently (one
or two a month) -- but common enough. Microsoft and
Netscape had forced me into become THEIR technical
support, because they didn't design or implement a
usable scripting language.
Conclusion
JavaScript as a concept is not bad, and there is a lot of
functionality that it can add. Sometimes you need that
functionality so much, that you will use JavaScript. Too
bad. It will slow your site down, it may work right only on
some browsers, it will cause crashes, and it will promote a
bad implementation of a mediocre technology -- but sometimes
the importance of that feature (function) outweighs all the
disadvantages of the technology / implementation. I know
that I will use JavaScript only when I can't avoid it -- and
avoid it whenever I can (1).
(1) This doesn't mean that Java is better
alternative, nor does it mean that CGI's can't slow your
site down as well. There are tradeoffs with all the
technology choices.
Now I am not advocating a "No-JavaScript" policy. I would
use it for small and occasional things (where you are
statistically less likely to get an error, and where it
won't effect performance much). Using JavaScript on a single
page, for filling out a form, or so on, is not so bad. At
least problems with your site will be localized to a single
page or two. However, using DHTML, which is supposed to add
all sorts of little controls, palettes and doodads, to every
page, is a really bad idea. On a web site, remember --
it's the content, not wizzy little features, that
bring your readers back. Stick with the basics and what is
reliable whenever possible -- JavaScript is neither.
Notice that most content publishers don't go JavaScript
happy, Netscape uses it sparringly throughout their site
(except for their annoying homepage), and Suns site seems to
use it even less -- instead opting for more Java, and more
crashes. So don't go feature happy. Think about what
your viewers want more, think about the tradeoffs, and think
if they want to pay for a little animated buttons with their
browsers running slower, machines crashing (occasionally),
or other obstructions to their browsing experience.
JavaScript Resources
|