利用ASP脚本制作异步装载的树形结构(二)(转)——好东东!!

脚本|异步

三、客户端代码

   下面是程序的启动页面Tree.htm:

 < HTML >
   < SCRIPT SRC="Renderer.js" LANGUAGE="JavaScript" >< /SCRIPT >
   < HEAD >< /HEAD >
   < BODY ID=bodyTree NAME="bodyTree" OnLoad="GetTree();" >
     < IFRAME ID=GetData STYLE="display:none"  >< /IFRAME >
   < /BODY >
 < /HTML >
   该页面装载时将执行Renderer.js中的GetTree函数。HTML代码中的IFRAME部分实现了客户端和服务器端的通讯机制。JavaScript函数GetTree的代码如下:

 function GetTree() {
    if (event.type == 'load') {
       if (typeof(divTree0)!='object')
          GetData.window.location.href = 'GetTreeData.asp?Level=0';
    } else {
       try {
          objManip = eval('divTree' + event.srcElement.getAttribute('ElementId'));
          if (objManip.style.display == 'none') {
             objManip.style.display = '';
          } else {
             objManip.style.display = 'none';
          }
       } catch (e) {
          GetData.window.location.href = 'GetTreeData.asp?Level=' + event.srcElement.getAttribute('ElementId');
       }
       event.cancelBubble = true;
    }
 }
   当文档装载时,onload事件被触发,GetTree函数得以执行。函数检查容器divTree0是否存在,并为IFRAME(ID为GetData)读取第一层节点(这些节点的父节点ID为0)。如前所述,所有的节点都必须处理鼠标单击事件,而且事件句柄都是GetTree函数。当某个节点(如div1)接收到一个鼠标事件时,程序将执行GetTree函数中的else部分。如果发送该事件的节点已经读取了子节点,则程序检查这些子节点是否已经显示,然后切换子节点的显示状态,从而实现了该层节点的扩展或折叠效果。检查子节点是否显示的if语句封装在一个try块内,因此当子节点不存在时,程序将执行catch部分,调用服务器脚本GetTreeData.asp读取子节点内容。最后,程序设置event.cancelBubble = true,目的是禁止上一层容器处理该事件。

   服务器脚本GetTreeData.asp返回的HTML代码类如:

 < HTML >
    < BODY OnLoad="parent.PopulateTree('1|0|节点1|2|0|节点2|3|0|节点3|4|0|节点4|');" >
    < /BODY >
 < /HTML >
   可以看到,这里的Onload事件又调用了另外一个JavaScript函数PopulateTree。PopulateTree函数代码如下:

 function PopulateTree(strData) {
    var arrSplitData;
    var iCnt;
    var objTempDiv;
    var objMainDiv;
 
    if (strData=='') return;
    arrSplitData = strData.split("|");
 
    objMainDiv = document.createElement('DIV');
    objMainDiv.id = 'divTree' + arrSplitData[1];
    objMainDiv.style.cssText = 'position:relative;left:10px;cursor:hand;';
    for (iCnt=0;iCnt< arrSplitData.length-1;iCnt+=3) {
       objTempDiv = document.createElement('< DIV OnClick='GetTree()' OnSelectStart='return false;' >');
       objTempDiv.id = 'div' + arrSplitData[iCnt];
       objTempDiv.innerHTML = arrSplitData[iCnt+2];
       objTempDiv.setAttribute('ElementId',arrSplitData[iCnt]);
       objTempDiv.setAttribute('ParentElementId',arrSplitData[iCnt+1]);
       objTempDiv.style.cssText = 'position:relative;cursor:hand;color:red;width:100px;font-size:x-small;';
       objMainDiv.appendChild(objTempDiv);
    }
    if (arrSplitData[1]=='0')
       document.body.appendChild(objMainDiv);
    else
       eval('div' + arrSplitData[1]).appendChild(objMainDiv);
 }
   我们已经知道,PopulateTree函数由onLoad事件调用,它的参数是一个字符串,比如上例中的“1|0|节点1|2|0|节点2|3|0|节点3|4|0|节点4|”,它是一个“节点标识|父节点标识|节点文本|……”的列表。

   如果某个节点不含子节点,则该参数是一个空字符串,此时PopulateTree直接返回。如果子节点存在,则可以利用split函数将子节点列表以数组形式保存。再接下来,就可以创建该层节点的容器,比如divTree0,然后遍历数组创建各个节点,如div1,div2……。如果某个节点的父节点ID为0,说明该节点没有父节点,程序将把容器divTree0加入文档的BODY;否则当该节点的父节点ID不为0,则创建与其父节点对应的容器“divTree< < 父节点ID > >”。在创建节点的同时指定了鼠标单击事件的句柄GetTree函数。

   注:可以修改GetTreeData.asp,使其返回的子节点列表(即PopulateTree的参数)形式为“节点ID|节点文本|……”,也就是省略父节点ID,因为任何一组子节点列表其父节点总是相同的。同

时间: 2024-09-17 03:43:38

利用ASP脚本制作异步装载的树形结构(二)(转)——好东东!!的相关文章

利用ASP脚本制作异步装载的树形结构(一)(转)——好东东!!

脚本|异步 树形结构是描述层次数据的常见方法.本文介绍的树形结构生成程序主要由一个ASP页面.二个JavaScript函数构成.该树形结构是异步的,也就是说,节点数据仅在必要时才读取,而不是一次性全部发送到客户端. 一.概述 树形结构中所有的节点都必须包含以下属性:本身的ID,父节点的ID,以及本节点的说明(节点文本).本文用到了一个Access数据库Tree.mdb来保存这些节点信息.Tree.mdb包含表tblTree,其定义如下: 字段名称 类型 说明 ElementID 自动编号 节点的

如何使用ASP脚本制作异步装载的树形结构(一)

脚本|异步 树形结构是描述层次数据的常见方法.本文介绍的树形结构生成程序主要由一个ASP页面.二个JavaScript函数构成.该树形结构是异步的,也就是说,节点数据仅在必要时才读取,而不是一次性全部发送到客户端. 一.概述 树形结构中所有的节点都必须包含以下属性:本身的ID,父节点的ID,以及本节点的说明(节点文本).本文用到了一个Access数据库Tree.mdb来保存这些节点信息.Tree.mdb包含表tblTree,其定义如下: 字段名称 类型 说明 ElementID 自动编号 节点的

如何使用ASP脚本制作异步装载的树形结构(二)

脚本|异步 三.客户端代码 下面是程序的启动页面Tree.htm: < HTML > < SCRIPT SRC="Renderer.js" LANGUAGE="JavaScript" >< /SCRIPT > < HEAD >< /HEAD > < BODY ID=bodyTree NAME="bodyTree" OnLoad="GetTree();" >

利用Asp.net Ajax异步获取xml文档内容

ajax|asp.net|xml|异步 Ajax原意本是让人利用异步获取XML内容,以实现无刷新的网页效果asp.net ajax已将底层内容封装实现起来远比自写xmlhttp来的方便,至少浏览器兼容方面要强得很多下面以一个www.asp.net的示例说明一下利用microsoft ajax library来简单异步获取xml文档的方法 // 返回XML的Web 请求function OnSucceededXml(executor, eventArgs) ...{    if (executor

如何利用expect脚本实现备份华为交换机配置之(二)

脚本共有四个文件组成其中如下所示,执行过程是tar.sh->loop.sh->loginfo.exp,依次调用的关系.脚本依次完成登录每台交换机并在每台交换机执行"tftp 192.168.36.44 put vrpcfg.zip"命令,然后将保存的配置文件改名为相应的交换机IP地址.最后以当天日期为文件名打包成一个文件完成所有操作.其中.sh为shell脚本,.exp为expect脚本,expect脚本只完成登录执行命令的功能,而shell脚本只对保存好的文件做处理,不知

运行asp脚本的asp脚本(原作:V37)

脚本|脚本 写这个小东西的出发点,由于经常的需要在线利用asp脚本的ado对数据库执行建表,修改字段每次都要ftp修改升级文件传上去或在线修改好了运行!很是麻烦于是写了这个小东西!很方便~~ 脚本特点:1.可以运行除了 ssi(如#include file) 和 预处理指令(如@ language=javascript)外的任何 asp vbscript 脚本比如数据库连接,记录集的建立,甚至Fso等2.并可运行<%%> <%=%> HTML混编的 ASP脚本 3.有简单的容错处理

利用ASP和XML制作菜单导航系统

xml|菜单|导航 1.1 概述 高效地利用Web页面有限的空间并不容易,特别是要在页面中安排大量的链接时尤为困难.如何才能组织好各种链接以便为其它重要内容留出空间?是一次性地展示所有链接还是分成多个页面把它们深深地隐藏起来?显然,这两种方法都不理想.利用DHTML,我们可以在为用户提供快速方便的访问链接的同时,为其它内容保留足够的页面空间. 本文介绍一个菜单系统的实现.这个菜单与Windows的"开始"菜单非常相似,用户只需点击一次鼠标即可访问所有链接.菜单的内容由XML文档定义,客

利用ASP.NET 2.0的客户端回调功能制作下拉框无限级联动

asp.net|客户端|下拉 记得以前做asp的时候,常会碰到下拉框多级联动,比如说在注册的时候,需要选择省和城市,这就需要二级联动,那个时候一个普遍的做法就是利用javascript脚本来实现,先把数据从数据库中读取出来,放到javascript的数组中,在下拉框的onchange事件触发时,就可以直接从javascript的数组中读取想要的数据.后来在asp.net 1.0中开发时,这种方法也通用,但如果要多级的话,有一个很大的缺点,就是它需要把数据一次性全部读到javascript的数组中

基于ACCESS数据库的纯asp论坛制作心得(树形结构)

access|数据|数据库|心得 感觉做一个论坛不像想象中的那么容易,但也不像想象中的那么复杂:),经过4天的浴血奋战,终于从对论坛制作一无所知到今天的论坛数据结构和组织形势初步确定,中间参考了sunamd,bigeagled,廖家远等的思路,并得到了赖皮王子,hooke,bigeagle大虾的热心帮助,谨以此文一并表示感谢.bigeagle的文章采用了sql数据库的存储过程来实现,但现实中支持asp的免费站点本来就少,支持数据库的免费站点更少,支持sql数据库的免费站点...反正我没见过,哪位