Enhancing the Dynamic Tree Menu System
By Sam M. Reynoso
Introduction
In the summer of 2001, 4GuysFromRolla.com published an article I wrote entitled
A Dynamic Tree Menu System that described how to build a
Web-based treeview control using only ASP, XML, and Javascript. After its publication I began
receiving email from many developers who had incorporated my solution into their projects.
Most were happy with the sample code I provided, but a few were critical and pointed
out a laundry list of things they wished were included in the sample.
I took many of their suggestions into consideration, and over the course of the last six months completely rewrote the sample code from scratch. The code is now streamlined and includes many of the features that were requested. This follow-up article is an attempt to share these improvements with the 4Guys community. This article assumes the reader is familiar with the basic underlying mechanism described in the original article. (You're strongly encouraged to read the original article before reading this followup.)
Microsoft's XML Parser |
---|
To use the Dynamic Tree Menu System you will need to have Microsoft's XML parser (MSXML) installed on your Web server. You can get the free MSXML parser download at: http://www.microsoft.com/xml/. (Go straight to the download page.) |
This article contains, mostly, a description of the changes between my earlier version of the Dynamic Tree Menu System and this updated version. You can download the complete source code for this application at the end of this article. You can also view a live demo of the dynamic menu-based system.
Crossbrowser Compatibility
The original sample code worked beautifully on Internet Explorer,
but did not work at all under Netscape or any other browser. Although the original
article clearly stated that the sample code was intended only as a demonstration
of what was possible with XML, ASP, and Javascript, many readers nevertheless
insisted that cross-browser compatibility should have been taken into consideration.
It turns out that making the code run under Netscape 6.x required very few modifications. Unfortunately Netscape 4.x was a completely different story, since that browser cannot deal with multiple levels of nested tables (the sample code will crash the browser). (Special thanks go out to 4Guys reader Keith Parker who suggested the simple changes to support Netscape 6.x and Mozilla browsers.)
The original code handled mouse clicks with a handful of IE-specific functions.
For example, all folder clicks were captured by the document.onclick
which redirected
them to the doChangeTree()
function with this line of code:
document.onclick = doChangeTree;
|
Once inside that function, a reference to the clicked object was obtained with the following line:
srcElement = window.event.srcElement;
|
If the code determined that the clicked item was a folder, a reference to that object
was obtained using the document.all()
method.
To make this code work with Netscape 6.x browsers, it was necessary to find a way
to call the doChangeTree()
routine whenever a folder was clicked. The solution was
to connect the function to the onClick
event on the folder's <IMG>
tag. We also had to pass the Javascript this
object as one of the parameters:
<img onclick="doChangeTree(this, arClickedElementID, arAffectedMenuItemID);">
|
Inside of doChangeTree()
, we no longer have to rely on the IE method
window.event.srcElement
to retrieve the clicked object's reference. Instead we get
the reference directly from the e
parameter containing the this
object.
Finally, when it is necessary to lookup an object's reference dynamically using its
ID, we call the standard document.getElementById()
function instead of the IE-specific
function document.all
.
To summarize, here are the code differences between the original and the new
crossbrowser version:
|
In Part 2 we'll look at some more new features of the Dynamic Tree Menu System, including some UI enhancements and the ability to load the tree menu data from a database table.