`

多级联动下拉框控件实现

阅读更多
现在实现控件联动的有纯脚本实现和AJAX,当数据量大时,AJAX的确不错,当数据不是很多时,用AJAX就有点浪费了。
这里我们介绍如何用纯脚本实现多级联动下拉框控件的生成。
希望大家给与建议。

脚本 LinkageControl.js
负责生成多个下拉框,并实现父级控件改变时刷新子列表。

/*********************************
描述:多级级联控件基础脚本
作者:叶浩恩
日期:2008-8-2
版本:0.1

使用说明:
需要在页面进行以下初始化工作
1。在脚本定义前,建立脚本输出的容器
<div id="LinkageContor"></div>

2。定义级联控件列表

3。如果需要处理最后一层节点改变,定义函数  LastLinkageControlChange()

4。调用初始化函数 InitControl("LinkageContor");

5. 支持页面回调保持原来选择
服务器端根据页面提交的信息,生成脚本
    var LinkageContorBindValues = new Array();
    LinkageContorBindValues[0] = "key1";
    LinkageContorBindValues[1] = "key8";
    ...
    生成的脚本需要在调用InitControl前
**********************************/

// 多级级联控件树结点定义类
function LinkageControlNode(p_name, p_value, p_level, p_chiltNodes)
{
    // 定义 tagName 值
    this.tagName = "LinkageControlNode";
   
    // 节点ID
    this.KeyId = "";
   
    // 节点名称
    this.Name=p_name;
    // 节点值
    this.Value = p_value;
    // 节点值2,保存额外的数据
    this.Value2 = p_value;
    // 节点深度值
    this.Level = p_level;
    // 子节点列表
    if (p_chiltNodes!=null)
        this.ClientNodes = p_chiltNodes;
    else
        this.ClientNodes = new Array();
}

// 根据节点定义创建一个列表的 OPTION 项,并进行必要的付值。
LinkageControlNode.prototype.CreateOptionElement= function()
{
    // 创建列表项
    var oOption = document.createElement("OPTION");
    oOption.text = this.Name;
    oOption.value= this.Value;
   
    // 列表项可以通过 Node 属性访问对应的节点信息
    oOption.Node = this;
    return oOption;
}
   
// 实现多级级联控件列表数据绑定
// ctrl: 绑定的下拉框控件
// source:数据源 LinkageControlNode 数组,
function BindLinkageControl(ctrl, source)
{
    if (ctrl == null)
        alert("BindLinkageControl:: ctrl 参数为空!");
    if (ctrl.tagName != "SELECT")
        alert("BindLinkageControl:: ctrl 参数不是下拉框控件类型!");
    if (source == null)
        alert("BindLinkageControl:: source 参数为空!");
       
    // 清空原列表
    var i = 0;
    ctrl.options.length = 0;
    for (i = 0; i < source.length; i++)
    {
        ctrl.options[i] = source[i].CreateOptionElement();
    }
   
    // 如果列表只有一项,不会触发onchange事件,
    // 我们需要选择他,让它可以自动绑定到下一层空间
    if (ctrl.options.length > 0 && ctrl.options[0].Node != null && ctrl.LinkageLevel < linkageControlLevel - 1)
    {
        BindLinkageControl(ctrl.NextLevelControl, ctrl.options[0].Node.ClientNodes);
    }


   
}

// 级联控件选择变化事件处理函数
function LinkageControlChange(e)
{
    var oSource;
    if(e!=null)
        oSource = e.target;
    else
        oSource = window.event.srcElement;

    if (oSource == null)
    {
        alert("LinkageControlChange 无法获得当前事件源控件!");
        return;
    }
       
    // 取当前值
    var currentControlLevel = oSource.LinkageLevel;
    var selectOption = oSource.options[oSource.selectedIndex];
    if (selectOption == null)
    {
        alert("无法获得当前选择项数据!");
        return;
    }

    //alert("selectOption="+selectOption);
    //alert("selectOption.Node="+selectOption.Node);
    //alert("selectOption.Node.ClientNodes="+selectOption.Node.ClientNodes);
    var selectName  = selectOption.text;
    var selectValue = selectOption.value;
    //alert("selectName="+selectName);
    //alert("selectValue="+selectValue);

    oSource.TextField.value = selectName;

    // 取下一个控件
    var nextControl = oSource.NextLevelControl;
    //alert(nextControl);
    if (nextControl == null)
    {
        alert("无法获得下一个级联控件!");
        return;
    }

    if (selectOption.Node == null)
    {
        alert("当前选择项未设置 Node 数据!");
        return;
    }

    // 重新绑定内容
    BindLinkageControl(nextControl, selectOption.Node.ClientNodes);
}



// 创建级联控件
function CreateLinkageControl(obj, level, linkageContorName, linkageContorTitle)
{
    if (obj == null)
    {
        alert("CreateLinkageControl obj 参数为空!");
        return ;
    }
    if (typeof(level) != "number")
    {
        alert("CreateLinkageControl level 参数为空或不是整数!");
        return;
    }
    if (level < 2)
    {
        alert("CreateLinkageControl level 参数值小于2,无法创建级联控件!");
        return;
    }
    // 存放控件的数组
    var listControls = new Array();
    var i = 0;
    // 检查是否需要显示标题
    var bCreateLabel = (typeof(linkageContorTitle)!="undefined");
   
    for (i = 0; i < level; i++)
    {
        // 控件名称和ID
        var ctrlName = linkageContorName + "_" + i;
       
        // 建立一个隐藏域,存放选择项的文本值。
        var textFieldName = ctrlName + "_text";
        var textField = document.createElement("input");
        textField.type = "hidden";
        textField.id = textFieldName;
        textField.name = textFieldName;
        // 加入列表
        obj.appendChild(textField);

        if(bCreateLabel && linkageContorTitle[i] != null)
        {
            // 创建标题字符
            var label = document.createElement("LABEL");
            label.FOR = ctrlName;
            label.innerHTML = linkageContorTitle[i];
            obj.appendChild(label);
        }
       
        // 创建下拉框
        listControls[i] = document.createElement("select");
        listControls[i].id = ctrlName;
        listControls[i].name = ctrlName;
        listControls[i].LinkageLevel = i;
        listControls[i].TextField = textField;

        if (i > 0){
            listControls[i - 1].NextLevelControl = listControls[i];
        }
       
        // 加入列表
        obj.appendChild(listControls[i]);
       
        // 绑定改变选择事件
        // 如果不是最后一层空间,绑定 LinkageControlChange 函数
        if (i < linkageControlLevel - 1){
            listControls[i].onchange = LinkageControlChange;
        }
        else
        {   // 最后一层时,如果用户定义了 LastLinkageControlChange 函数,则绑定该函数
            if (typeof(LastLinkageControlChange) == "function")
            {
                listControls[i].onchange = LastLinkageControlChange;
            }
        }
    }
    //alert("创建级联控件"+listControls.length);
   
    return listControls;
}

// 处理页面回传后的控件绑定
function RebindControl(listControls, linkageControlLevel)
{
    // 检查由服务器端输出的原控件值。
    // 当页面PostBack后,需要将原控件的值,填写道教本数组 LinkageContorBindValues 中。
    if (typeof(LinkageContorBindValues) == "undefined")
    {
        return;
    }
    var i = 0, j = 0;
    // 检查每个下拉框控件
    for (i = 0; i < linkageControlLevel && i < listControls.length; i++)
    {
        // 将下拉框每个选择项值与服务器绑定值比较
        for (j = 0 ; j < listControls[i].options.length; j++)
        {
            if (listControls[i].options[j].value == LinkageContorBindValues[i])
            {
                // 找到后,让该项选中,刷新下一个联动控件的值,并退出循环
                listControls[i].selectedIndex = j;
               
                if (i < linkageControlLevel -1)
                {
                    BindLinkageControl(listControls[i+1], listControls[i].options[j].Node.ClientNodes);
                }
                break;
            }
        }
    }
}

// 初始化并创建多级绑定控件
function InitControl(divName, linkageControlLevel, linkageContorName, linkageContorTitle, rootNodes)
{
    var obj = document.getElementById(divName);
    if (obj == null)
    {
        alert("找不到用于填充级联控件的指定元素!");
        return;
    }
    if (rootNodes == null) return;
   
    // 创建级联控件
    var listControls = CreateLinkageControl(obj, linkageControlLevel, linkageContorName, linkageContorTitle);

    // 绑定第一层空间
    if (listControls != null && listControls.length > 0)
    {
        BindLinkageControl( listControls[0], rootNodes);
        RebindControl(listControls, linkageControlLevel);
    }
}

以下是页面文件内容:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>级联控件测试</title>
    <script src="LinkageControl.js" type="text/javascript" language="javascript"></script>
</head>
<body>
<form action="LinkageControl.htm" >
    <div id="LinkageContor"></div>
    <script type="text/javascript" language="javascript">
    <!--
    // 定义级联控件数量
    var linkageControlLevel = 3;
    // 级联控件的名称
    var linkageContorName = "AreaZoneSelect";
    // 控件前面显示的标题
    var linkageContorTitle = new Array();
    i = 0;
    linkageContorTitle[i++] = "省";
    linkageContorTitle[i++] = "市";
    linkageContorTitle[i++] = "地区";

// <%= GetRebindData() %> 调用服务器端代码。。。输出一下格式数据
//  var LinkageContorBindValues = new Array();
//  LinkageContorBindValues[0] = "key1";
//  LinkageContorBindValues[1] = "key8";
   
    function CreateData()
    {
        i = 0, j = 0;
        rootNodes = new Array();
// <%= GetCreateDataScript() %> 调用服务器端代码。。。填充节点内容。。。输出一下格式数据

        rootNodes[i] = new LinkageControlNode("--请选择--", null, 0, null);
        i++;
       
        j = 0;
        rootNodes[i] = new LinkageControlNode("广东省", "T_guangdong", 0, null);
        rootNodes[i].ClientNodes[j] = new LinkageControlNode("深圳市", "S_shenzhen", 1, null);
        rootNodes[i].ClientNodes[j].ClientNodes[0] = new LinkageControlNode("罗湖区", "S_shenzhen_luohu", 1, null);
        rootNodes[i].ClientNodes[j].ClientNodes[1] = new LinkageControlNode("福田区", "S_shenzhen_futian", 1, null);
        j++;
        rootNodes[i].ClientNodes[j] = new LinkageControlNode("广州市", "S_guangzhou", 1, null);
        rootNodes[i].ClientNodes[j].ClientNodes[0] = new LinkageControlNode("越秀区", "S_guangzhou", 1, null);
        rootNodes[i].ClientNodes[j].ClientNodes[1] = new LinkageControlNode("荔湾区", "S_guangzhou", 1, null);
        i++;
       
        j = 0;
        rootNodes[i] = new LinkageControlNode("湖南省", "T_hunan", 0, null);
        rootNodes[i].ClientNodes[j] = new LinkageControlNode("长沙市", "S_changsha", 1);
        rootNodes[i].ClientNodes[j].ClientNodes[0] = new LinkageControlNode("芙蓉区", "S_changsha1", 1, null);
        rootNodes[i].ClientNodes[j].ClientNodes[1] = new LinkageControlNode("雨花区", "S_changsha2", 1, null);
        j++;
        rootNodes[i].ClientNodes[j] = new LinkageControlNode("株洲市", "S_zhuzhou", 1);
        rootNodes[i].ClientNodes[j].ClientNodes[0] = new LinkageControlNode("动物园", "S_zhuzhou1", 1, null);
        rootNodes[i].ClientNodes[j].ClientNodes[1] = new LinkageControlNode("火车站", "S_zhuzhou2", 1, null);
        return rootNodes;
    }

    InitControl("LinkageContor", linkageControlLevel, linkageContorName, linkageContorTitle, CreateData());
    --></script>
   
    <input type="button" value="view" onclick="alert(document.getElementById('AreaZoneSelect_2').value);" />
</form>
    </body>
</html>


以上文章出自http://blog.csdn.net/greenery/archive/2008/08/28/2844579.aspx
分享到:
评论

相关推荐

    帆软FineReport实现下拉框控件多级联动查询模板 + SQL脚本

    本资源主要涉及的是利用FineReport的下拉框控件实现多级联动查询模板以及饼图联动饼图的制作方法,适用于FineReport 10.0版本。 首先,我们要理解“下拉框控件多级联动查询”这一概念。在FineReport中,下拉框控件...

    layui-省市县三级联动下拉框-HTML源码

    在IT行业中,网页开发经常会遇到需要实现省市区县等多级联动下拉框的需求,这在用户填写地址、选择服务区域等场景十分常见。本文将详细介绍如何使用HTML、JavaScript(通常配合jQuery)以及可能涉及的CSS来实现...

    js多级联动多选checkbox插件

    在JavaScript开发中,多级联动多选checkbox插件是一种常见的交互元素,用于实现层次结构数据的筛选和选择。这类插件通常用在如地区选择、类别分类等场景,用户可以通过逐级选择来过滤出需要的结果。`cascadebox-...

    jQuery EasyUI编辑DataGrid用combobox实现多级联动

    在jQuery EasyUI中,DataGrid是一种常用的表格展示控件,它可以与各种编辑器结合使用,如combobox(下拉框)来实现更丰富的交互功能。本文主要探讨的是如何利用jQuery EasyUI的DataGrid和combobox组件实现多级联动的...

    Android开发之二级联动下拉框

    综上所述,实现Android的二级联动下拉框涉及到XML布局、数据绑定、事件监听、动态更新数据等多个环节,需要结合面向对象编程思想,合理组织代码结构,以达到灵活配置和高效运行的效果。在实际开发中,还需要根据具体...

    多级联动下拉选择框,动态获取下一级

    综上所述,实现多级联动下拉选择框在ASP.NET中主要涉及服务器控件的使用、数据绑定、级联数据源、XML数据解析以及客户端脚本的协同工作。通过这些技术,我们可以构建出高效且用户体验良好的多级选择系统。在实际项目...

    Java 使用POI生成带联动下拉框的excel表格实例代码

    联动下拉框是一种特殊的数据验证控件,允许用户从预定义的列表中选择一个或多个选项,并根据选择的选项动态更新其他单元格的值。这种控件广泛应用于各种报表、数据分析和业务智能应用中。 在我们的示例代码中,我们...

    组态王下拉式组合框.zip_areax8y_spokenimj_下拉式组合框_组态王_组态王tagname.db

    组态王下拉式组合框使用样例,包含了使用的说明,以及控件存放位置,可以直接运行

    datagridview使用combobox进行二级联动

    当需要实现二级联动效果时,即一个`ComboBox`的选择会影响到另一个`ComboBox`的选项,这种功能常见于多级分类选择或筛选场景。本篇文章将深入探讨如何在C#环境下,利用这两个控件在`DataGridView`中实现二级联动。 ...

    三级联动前端js代码

    联动是指在多个控件之间建立的关联,当一个控件的状态改变时,其他相关的控件也会自动更新。在这个场景中,就是指当用户在省、市、县的下拉框中做出选择时,下一级的选项会根据前一级的选择自动调整。 "js"...

    vue2.0.js的多级联动选择器实现方法

    标题中提到的“vue2.0.js的多级联动选择器实现方法”指的是如何在Vue 2.0框架下编写一个多级联动选择器的组件。联动选择器是一种常见的前端交互控件,它能够让用户在多个下拉选择框中进行选择,上一级选择的结果会...

    extjs网页控件开发

    ExtJS是一种基于JavaScript的...总结起来,"extjs网页控件开发"涵盖了ExtJS的核心技术,包括图表的创建和多级联动下拉列表框的实现。通过深入学习和实践,不仅可以提高开发效率,还能打造出具有专业水准的Web应用程序。

    Ext combo 下拉框级联

    实现级联下拉框的核心在于数据的联动和更新。这通常通过监听第一个下拉框的选中事件来完成,当用户在父级ComboBox中选择一个项时,会触发一个事件,这个事件可以用来更新子级ComboBox的数据源。在Ext JS中,可以通过...

    联动无刷新联动

    在这个项目中,我们通过实例演示了一种简单易懂的联动效果,并利用Ajax技术实现了页面的无刷新更新,使得多级联动成为可能,无论是二级、三级还是四级联动,都可以按照此思路进行扩展。 联动,顾名思义,是不同控件...

    自定义级别联动 .net

    标题中的"自定义级别联动 .NET"意味着我们要讨论的是如何在.NET框架下,根据业务需求定制这样的多级联动功能。这通常涉及到以下几个关键知识点: 1. **ASP.NET Web Forms** 或 **MVC**:.NET提供了两种主要的Web...

    ajaxpro三级联动

    **AjaxPro三级联动**是一种基于ASP.NET的Ajax技术实现的多级联动下拉框效果,它使得用户在选择某一选项时,能够实时地更新并显示与其关联的下级选项,无需刷新整个页面,从而提供了更好的用户体验。在VS2005开发环境...

    qt 定制省市区三级选择框

    本文将深入探讨如何使用Qt 5.9版本,并结合Visual Studio(VS)进行界面定制,特别是关于“QPushButton”的样式修改以及实现省市区三级选择菜单的功能。 首先,让我们理解“QPushButton”在Qt中的角色。QPushButton...

    jQuery 美化界面的下拉框

    之前我们介绍过一款基于jQuery多级联动美化版Select下拉框,很多朋友都非常喜欢,可见经过美化过的下拉框的确可以让你的网页更为精妙。今天我们要介绍的这款美化界面下拉框也是基于jQuery的,它的特点是可以通过上下...

    asp.net 省市联动 省市齐全

    在ASP.NET开发中,省市联动是一项常见的功能,它主要用于网页上的地址选择,用户在选择省份后,下拉框会自动更新展示对应省份的城市列表。这种交互设计极大地提升了用户体验,尤其在处理大量的地区数据时。本资源...

    Mydwr的联动dgdsgdfgd

    4. **扩展至多级联动**:对于三级联动,当第二个下拉框的值改变时,同样触发DWR调用,获取第三级的数据并更新第三个下拉框。 5. **处理回调**:DWR的异步特性使得服务器的响应可以在回调函数中处理,确保数据更新的...

Global site tag (gtag.js) - Google Analytics