How to test for the Javascript DOM?
Browsing the forums, development articles and other resource
sites raised an interesting yet recurring question: "How do
I test for the Document Object Model (DOM) employed by a
browser?". Strangely enough I was asking the same question
when starting out in Javascript. However, after enough time has
passed, with the same thing done more than once, I started to
realise that this is a question that begs answering for once and
for all.
A Typical Test
Testing for the DOM in
itself is easy enough. A recommended approach is testing for the
support of a DOM, and not for a browser
version. The following describes Boolean variables that
indicates the compliance to the DOM methods and parameters that
you are targeting:
isIE4 = document.all? true :
false;
isIE6 = document.getElementById &&
document.all ? true : false;
isNS4 = document.layers? true :
false;
isNS6 = document.getElementById &&
!document.all ? true : false; The above items return
a set of true or false values for any browser. This method still
requires that you access objects described by the DOM through
that DOM's methods. In the long run the amount of work you have
to do remains more or less the same.
Javasript is an
Object Orientated language
Everyone who is familiar with
Javascript knows that the language supports Object Orientation
(OO). Passing objects around in variables is nothing new, so why
do people persist in performing lengthy tests for the DOM each
time we need to access an object?
The item which
describes the document's referencing structure is nothing more
that an object itself. This means that you only need to perform
the test once, and then proceed to use an arbitrary object that
describes the DOM object throughout the remainder of your
script. However, since this approach would require that you
define a variable for each and every object you will be
referencing, we need an approach which is more robust.
A
Compromise
Typically you access objects though the DOM
for one of two reasons: Get a value, or Set a value. Previous
approaches require that you access the object through the DOM
methods each and every time you need to perform some action on
the object. The same holds true for every other object accessed
by your script. What we need is a method that will:
- Access the correct DOM using the relevant methods
- Return the object of interest
- Not waste time and
patience
A practical approach used by myself is
described in a function that returns your object without any
hassles.
function getDOMObject (documentID){
if
(isIE4){
return document.all[documentID];
}else
if(isIE6){
return document.getElementById(documentID);
}else if (isNS4){
return document.layers[documentID];
}else if (isNS6){
return
document.getElementById(documentID);
}
} The
above function comprimises by using the typical test defined
earlier to identify our browser DOM, and returns the object
identified by its ID / NAME pair. So whenever you need to do
something to an object, this approach requires that you call the
getDOMObeject () function. For example, the following will set
the value attribute of a hypothetical text box to 'test
value'.
getDOMObject('txtMyTextBoxID').value = "Test
Value"; The value of this approach comes to the front
in scripts where you need to access multiple objects in your
document. For example:
getDOMObject('txtMyTextBoxID1').value = "Test Value
1";
getDOMObject('txtMyTextBoxID2').value =
"Test Value 2";
getDOMObject('txtMyTextBoxID3').value = "Test Value
3";
getDOMObject('txtMyTextBoxID4').value =
"Test Value 4";
getDOMObject('txtMyTextBoxID5').value = "Test Value
5";
getDOMObject('txtMyTextBoxID6').value =
"Test Value 6"; Looks like a lot less work, doesn't
it?