内容显示页
 
类别:专题 | 浏览(2276) | 2007-11-21 11:14:54

三维数组数据源
  A     B     C  
--------------------------------------------------------------------------------------------------
AA BB CC  
--------------------------------------------------------------------------------------------------
二维数组数据源
A1 B1

专题名称:一个网页内多个数组数据源(二维或三维数组)无刷新实现多个二级联动或多级联动下拉列表

关键词组:二级联动,三级联动,多级联动,无限级联动

推荐阅读顺序:先看实例,如果有不明白的地方再看理论知识

理论知识:

二级联动多级联动的理论知识:

二级联动,简单的说就是,当下拉列表A1的的值改变时,下一级下拉列表B1也跟着动,但是下拉列表B1的值是与下拉列表A1的值相对应的。比如:A1选中“技术部”的话,B1的所有下拉项都显示的是与A1相对应的技术部成员,这个过程因为都是在客户端执行的不会在服务器端操作所以是无刷新实现的。

三级联动多级联动,就是利用二级联动的思想,第一级改变时,第二级跟着变,第三级跟着第二级变,第四级跟着第三级变。。。。

二级联动,三级联动,多级联动实践:

二级联动,当第一级选中一个改变选项,激发联动函数,这个函数用以改变第二个下拉列表的值,实现过程是,根据第一级传过来的值遍历数组,找到与第一级相对应的选项,然后加到第二级列表上。

三级联动多级联动,第一级改变时,第二级跟着变,第二级改变时,第三级跟着变。。。

此专题源与:二级联动下拉列表的实现是通过一个函数来实现的,如果在实现三级联动下拉列表或多级联动下拉列表的话,我们是直接复制二级联动下拉列表的函数,改一下函数名及相关参数,这样是可以解决问题的,但咱们是做程序的,应该让自己的程序更通用话,尽量适应各种情况,如果这样一来,平白的又添加了一个函数,并且如果是多级的话您就得重写这个函数多次,然而,您也许会想到,多级联动下拉列表与二级其实思想是一样的,那么我们为什么不能用一个函数来实现呢,并且一定是可以实现的,你相信能实现,我也想信能实现,事实是它就能实现,但这样实现的人很少,为什么呢,一般都觉得没这个必要,但每次遇到这样的问题时还是得研究半天,今天我要给大家介绍的是,一个函数来实现多级联动,使用的是类似与递归的思想,每一级onchange()时都会调用一个函数,这个函数会改变下一级的值并激发其onchange(),这时下一级的onchange里如果还是调用这个函数的话,那么这个函数还会再次运行,直到最后一级,因为最后一级onchange=""所以他不会再激发下一级,完成所有联动。

多级联动函数介绍:

/*=========================================================================
 * Intro       可接收返回值的多级联动下拉列表函数
 * FileName    ChangeSelect.js
 * Author      yongfa365
 * Version     v2.0
 * WEB         http://www.yongfa365.com
 * Email       yongfa365[at]qq.com
 * MadeTime    2007-11-13 17:09:46
 * LastModify  2008-10-23 21:56:53
 *==========================================================================*/

/*
数组数据源可以接受两种:
1.["CategoryName","ParentCategoryName"]  即:["当前名称","父级名称"]
2.['CategoryName','ParentId','NowId']    即:["当前名称","父级ID","当前ID"]
上面说的父级,如果本身就是最上一级,那么父级就写成0或"0"
调用方法:
网页各级联(联动)下拉列表必须含有两个属性:id,onchange.
最后一个下拉列表onchange=""(空,但必须写上)。
函数调用方法:ChangeSelect(上一级的值,下一级Select控件的ID值,下一级Select控件要选中的值(即value而非text),数据源数组名,默认显示字符(如:请选择...如果不写的话会用默认值填充)),
举例:
第一级<select id="province"  onchange="ChangeSelect(this.value,'city','',ArrCity3,'请选择市')" ></select>
第二级<select id="city" onchange="ChangeSelect(this.value,'area','',ArrCity3)" ></select>
第三级<select id="area" onchange="" ></select>
设置网页加载完后运行一次,可以设置默认值,默认状态下第一个参数是0
<SCRIPT language=JavaScript>ChangeSelect('0','province','110000',ArrCity3,'请选择省') </SCRIPT>


*/
function ChangeSelect(ParentValue, NextId, NextSelectedValue, ArrObj,DefaultStr)
{
    StrObj = eval(document.getElementById(NextId));
    StrObj.length = 0;
    //判断它是二级数据源,还是三级
    if (ArrObj.length > 0)
    {
        if (ArrObj[0].length == 2)
        {ArrNum = 0;}
        else
        {ArrNum = 2;}
    }
    //显示所有列表
    for (i = 0; i < ArrObj.length; i++)
    {
        if (i == 0)
        {
        	if (DefaultStr == undefined ) DefaultStr="==请选择==";
            StrObj.options[StrObj.length] = new Option(DefaultStr, "");
        }
        if (ArrObj[i][1] == ParentValue)
        {
            StrObj.options[StrObj.length] = new Option(ArrObj[i][0],ArrObj[i][ArrNum]);
        }
    }
    //选中列表内某一项
    for (i = 0; i < StrObj.length; i++)
    {
        if (StrObj.options[i].value == NextSelectedValue)
        {
            StrObj.options[i].selected = true;
        }
    }
    //激发下一级的onchange事件以实现多级级联
    StrObj.onchange();
}

以下代码为一个浓缩版多级联动演示:


可修改代码后再运行

 

 备注:此文最上面的几个联动相关代码下载下去也许不能使用,因为本页是utf-8格式的,为了能让上面的联动运行正常,所以相关JS文件都改成了utf-8 格式,如果您要使用的话可以将其转为gb2312格式来用,做此说明主要是上面的省市三级联动代码的JS数据库使用的是信息产业部最新发布的数据。比较有用且权威,原下载地址:最新省市县数据库 

本专题相关数据库下载


引用本页地址:http://www.yongfa365.com/item/ErJiLianDongSanJiLianDongDuoJiLianDongWuXianJiLianDongXiaLaLieBiaoHuoCaiDanZhuanTi.html
 
 
相关链接
 
网友评论:
1 ohare - 2008-3-22 0:12:23
利用这个联动方法后,再用request("province")得到的值是ID值,如何才能得到文本的值呢?
 
2 yongfa365 - 2008-3-22 10:50:49
有时候是不用知道值是什么的,只是一个标识而已,如果您非要弄出那个ID对应的省市名,可以自己写个函数需要的时候再从数据里用javascript输出,当然,如果您想不用javascript您可以把那个javascript数组放到数据库里,当然,我也是有这个数据库的,有空我放上去。
 
3 ohare - 2008-3-24 13:53:37
很感谢您上次的回复。
如果需要用这个值的时候再从数据库中把这个ID对应的值找出来的话,对运行效率会有很大影响吗?
 
4 yongfa365 - 2008-3-25 9:32:44
理论上来说会有较大影响,尤其是数据量大,访问量大时,如果您觉得这个很重要,可以在写入数据库时根据接收的ID查找相应的省市表,然后把他写到当前表里,这样需要时直接调用就可以了,因为这种数据组织结构导致相关JS文件已经很大了,如果换成直接操作name而不是ID的话,JS文件会更大,就不合适了
 
5 ohare - 2008-3-28 16:46:12
谢谢您的回复!!!!!!!!!!
 
6 wangtao - 2008-5-6 15:00:50
我想把三级数据从数据库里读出来,保存在一个三维数组里,可以吗?如果可以的话请问一下怎么实现呢?
 
7 yongfa365 - 2008-5-6 18:57:10
不知道你是不是要实现三级联动,如果结构跟我这个差不多可以弄出来。
 
8 wangtao - 2008-5-7 9:29:07
我是要实现多级联动,昨天试过了,数组不行,list还没有试过
 
9 wangtao - 2008-5-7 10:09:20
上面问题的补充:那个数据源ArrObj是否可以为多个list呢
 
10 yongfa365 - 2008-5-7 12:41:01
你的问题太广了,如果这样讨论下去不知何时了,你可以QQ聊系我
 
11 风云 - 2008-11-26 14:35:35
你的QQ是多少啊?
 
12 学习笔记 - 2008-12-5 11:54:17
这些数据哪里来的啊,能不能告诉下我地址,我记得以前在家国的一个网站上下载过一个表格,但现在要用时找不到啊,
 
13 yongfa365 - 2008-12-5 13:58:12
@学习笔记
估计你只是来宣传网站来了,数据库下载地址下边有,信息产业部提供的,你留言想知道内容就应该写邮箱,你留个网站,做什么用
 
14 锦龙 - 2009-1-1 14:28:37
我将你的程序代码和jquery的空间合并到一起写入access数据库后,出现一个问题,就是在FireFox下,默认的都是"==请选择==",但是在IE6SP2下,只有第一个选择框是"==请选择==",而后面的两个却是空的,这是怎么回事呀???
 
15 匿名网友 - 2009-1-1 20:50:32
@锦龙,不管你怎么弄,都不重要,重要的是这代码是客户端的,你看下你的程序生成的客户端代码是什么样的,应该能分析出是什么问题
 
16 锦龙 - 2009-1-2 4:23:47
生成的代码是这样的,我还没看出有什么问题。不过很高兴你的答复

//ChangeSelect(上一级的值,下一级Select控件的ID值,下一级Select控件要选中的值(即value而非text),数据源数组名,默认显示字符(如:请选择...如果不写的话会用默认值填充)),第一级的上级值为0
function ChangeSelect(ParentValue, NextId, NextSelectedValue, ArrObj,DefaultStr)
{
StrObj = eval(document.getElementById(NextId));
StrObj.length = 0;
//判断它是二级数据源,还是三级
if (ArrObj.length > 0)
{
if (ArrObj[0].length == 2)
{ArrNum = 0;}
else
{ArrNum = 2;}
}
//显示所有列表
for (i = 0; i < ArrObj.length; i++)
{
if (i == 0)
{
if (DefaultStr == undefined ) DefaultStr="=请选择=";
StrObj.options[StrObj.length] = new Option(DefaultStr, "");
}
if (ArrObj[i][1] == ParentValue)
{
StrObj.options[StrObj.length] = new Option(ArrObj[i][0],ArrObj[i][ArrNum]);
}
}
//选中列表内某一项
for (i = 0; i < StrObj.length; i++)
{
if (StrObj.options[i].value == NextSelectedValue)
{
StrObj.options[i].selected = true;
}
}
//激发下一级的onchange事件以实现多级级联
StrObj.onchange();
}
PC = [
["place_name","place_up","placeid"],
["块","0","19"],
["段","0","20"],
["点","0","21"],
["一类","19","22"],
["二类","19","23"],
["三类","19","24"],
["四类","19","25"],
["一街","22","26"],
["二街","22","27"],
]
CC = [
["case_name","case_up","caseid"],
["侵犯财产权利案","0","12"],
["侵犯人身权利案","0","13"],
["扰乱社会治安案","0","14"],
["扰乱公共秩序案","0","15"],
["妨害公共安全案","0","16"],
["妨害社会管理案","0","17"],
["盗窃","12","18"],
["一类","18","24"],
["二类","18","25"],
["测试二下","25","26"],
["上海","26","27"],
["测试一下","24","28"],
["北京","28","29"],
];
 
姓名: 记住我
网址:
邮箱:
内容:
验证码:  验证码图片 看不清? 换张图试试
 
     
 
 
文章分类
 
 
专题(3)
 
.Net + C#(41)
 
ASP+VBS(153)
 
 
 
Linux(10)
 
 
 
web 2.0(24)
 
 
 
 
 
心程(59)
 
生活(80)
 
 
     

Power by :柳永法(yongfa365)'Blog | Model by :hibaidu | CSS by:众网友 | 京ICP备07011491号  QQ:64049027  E-mail:64049027qq.com

本空间赞助商:北京中科兴联信息技术有限公司