我做了三张表,一张省份(province)的表,一张城市(city)表,一张用户(user)表--
-- 表的结构 `city`
--CREATE TABLE `city` (
`idcity` int(11) NOT NULL auto_increment COMMENT '城市ID',
`idprovince` int(11) NOT NULL COMMENT '省ID',
`city_name` varchar(50) character set utf8 collate utf8_unicode_ci NOT NULL COMMENT '城市名称',
PRIMARY KEY (`idcity`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;--
-- 导出表中的数据 `city`
--INSERT INTO `city` (`idcity`, `idprovince`, `city_name`) VALUES
(1, 1, '石家庄市'),
(2, 1, '邯郸市'),
(3, 3, '东城区'),
(4, 3, '西城区'),
(5, 3, '崇文区'),
(6, 3, '宣武区');-- ----------------------------------------------------------
-- 表的结构 `province`
--CREATE TABLE `province` (
`idprovince` int(11) NOT NULL auto_increment COMMENT '省ID',
`province_name` varchar(50) character set utf8 collate utf8_unicode_ci NOT NULL COMMENT '名称',
PRIMARY KEY (`idprovince`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;--
-- 导出表中的数据 `province`
--INSERT INTO `province` (`idprovince`, `province_name`) VALUES
(1, '河北省'),
(2, '河南省'),
(3, '北京市'),
(4, '广东省');-- ----------------------------------------------------------
-- 表的结构 `user`
--CREATE TABLE `user` (
`uid` int(11) NOT NULL auto_increment COMMENT 'user表ID',
`user_name` varchar(50)character set utf8 collate utf8_unicode_ci NOT NULL COMMENT '用户姓名',
`idprovince` int(11) NOT NULL COMMENT '所属省ID',
`idcity` int(11) NOT NULL COMMENT '所属城市ID',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;--
-- 导出表中的数据 `user`
--INSERT INTO `user` (`uid`, `user_name`, `idprovince`, `idcity`) VALUES
(1, '张三', 1, 0),
(2, '李四', 1, 1),
(3, '王五', 2, 0),
(4, '店小二', 3, 3),
(5, '孙二娘', 3, 4),
(6, '武松', 3, 6);
我想做一个三级联动的下拉菜单!<script language="javascript">
function InitAjax()
{
var ajax=false;
try
{
ajax=new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e)
{
try
{
ajax=new ActiveXObject("Microsft.XMLHTTP");
}
catch(E)
{
ajax=false;
}
}
if(!ajax&& typeof XMLHttpRequest !='undefined')
{
ajax=new XMLHttpRequest();
}
return ajax;
}
function onChangeProvince()
{
//获取接受返回信息层
var msg = document.getElementById("space_span"); //获取表单对象和用户信息值 //接收表单的URL地址
var url="selectSpace.php";
//需要POST的值,把每个变量都通过&来联接
var postStr = "idcompany="+ document.getElementById("company").value;
//实例化Ajax
var ajax = InitAjax();
//通过Post方式打开连接
ajax.open("POST", url, true);
//定义传输的文件HTTP头信息
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//发送POST数据
//alert(postStr);
ajax.send(postStr);
//获取执行状态
ajax.onreadystatechange = function()
{
//如果执行状态成功,那么就把返回信息写到指定的层里
if (ajax.readyState == 4 && ajax.status == 200)
{
msg.innerHTML = ajax.responseText;
}
}
}
</script>
<select name="province" id="province" onchange="onChangeProvince()">
<option value='0'>请选择</option>
<?
$sql="select idprovince,province_name from provinceorder by idprovince asc";
$rs=$dbc->getRsArray($sql);
//$dbc是我做一个数据库连接的类,方法getRsArray($sql)是一个从数据库获取的记录,返回所有记录。
//$dbc->num_rows是返回行数
for($i=0;$i<$dbc->num_rows;$i++){
?>
<option value="<?=$rs[$i][idprovince]?>" ><?=$rs[$i][province_name]?></option>
<?}?>
</select>
<span id="space_span">
销售员:
<select name="sale" id="sale">
<option value="0">无</option>
<option value="1">全部</option>
<?
$sql="select uid,user_name from operator_admin";
$rs=$dbc->getRsArray($sql);
for($i=0;$i<$dbc->num_rows;$i++){
?>
<option value="<?=$rs[$i][uid]?>"><?=$rs[$i][user_name]?></option>
<?}?>
</select></span>
selectSpace.php<?php
header("Content-type: text/html; charset=gb2312");
session_start();
include("../../includes/dbconn.php");$idprovince=fixid($_REQUEST["idprovince"]); $sql="select idcity,city_name from city where idprovince=".$idprovince;
$rs=$dbc->getRsArray($sql);if($dbc->num_rows!=0)
{
$str="<select name='city' onchange='onChangeCity()'><option value='0'>全部</option>";
for($i=0;$i<$dbc->num_rows;$i++)
{
$str.="<option value='".$rs[$i][idcity]."'>".$rs[$i][city_name]."</option>"; }
$str.="</select>";
$sql="select uid,user_name from operator_admin where idprovince=".$idprovince;
$rs=$dbc->getRsArray($sql);
if($dbc->num_rows!=0)
{
$str.=" 销售员:<select name='sale' id='sale'><option value='0'>无</option><option value='1'>全部</option>";
for($i=0;$i<$dbc->num_rows;$i++)
{
$str.="<option value='".$rs[$i][uid]."'>".$rs[$i][user_name]."</option>";
}
$str.="</select>";
}
else
{
$str.=" 销售员:<select name='sale' id='sale'><option value='0'>无</option></select>";
}
echo $str;
}
else
{
$sql="select uid,user_name from operator_admin where idprovince=".$idprovince;
$rs=$dbc->getRsArray($sql);
if($dbc->num_rows!=0)
{
$str.=" 销售员:<select name='sale' id='sale'><option value='0'>无</option><option value='1'>全部</option>";
for($i=0;$i<$dbc->num_rows;$i++)
{
$str.="<option value='".$rs[$i][uid]."'>".$rs[$i][user_name]."</option>";
}
$str.="</select>";
}
else
{
$str.=" 销售员:<select name='sale' id='sale'><option value='0'>无</option></select>";
}
echo $str;
}
?>
我的主要含义是选择省份的时候,销售员能列出来。就是省份下的销售员具体显示到城市的时候,销售员也能跟着发生变化,就是省份-城市下的销售员onChangeCity() 这个方法我就不会写了!或者不用Ajax也行!请各位前辈帮我指正应该怎么做!谢谢各位前辈了!
-- 表的结构 `city`
--CREATE TABLE `city` (
`idcity` int(11) NOT NULL auto_increment COMMENT '城市ID',
`idprovince` int(11) NOT NULL COMMENT '省ID',
`city_name` varchar(50) character set utf8 collate utf8_unicode_ci NOT NULL COMMENT '城市名称',
PRIMARY KEY (`idcity`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;--
-- 导出表中的数据 `city`
--INSERT INTO `city` (`idcity`, `idprovince`, `city_name`) VALUES
(1, 1, '石家庄市'),
(2, 1, '邯郸市'),
(3, 3, '东城区'),
(4, 3, '西城区'),
(5, 3, '崇文区'),
(6, 3, '宣武区');-- ----------------------------------------------------------
-- 表的结构 `province`
--CREATE TABLE `province` (
`idprovince` int(11) NOT NULL auto_increment COMMENT '省ID',
`province_name` varchar(50) character set utf8 collate utf8_unicode_ci NOT NULL COMMENT '名称',
PRIMARY KEY (`idprovince`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;--
-- 导出表中的数据 `province`
--INSERT INTO `province` (`idprovince`, `province_name`) VALUES
(1, '河北省'),
(2, '河南省'),
(3, '北京市'),
(4, '广东省');-- ----------------------------------------------------------
-- 表的结构 `user`
--CREATE TABLE `user` (
`uid` int(11) NOT NULL auto_increment COMMENT 'user表ID',
`user_name` varchar(50)character set utf8 collate utf8_unicode_ci NOT NULL COMMENT '用户姓名',
`idprovince` int(11) NOT NULL COMMENT '所属省ID',
`idcity` int(11) NOT NULL COMMENT '所属城市ID',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;--
-- 导出表中的数据 `user`
--INSERT INTO `user` (`uid`, `user_name`, `idprovince`, `idcity`) VALUES
(1, '张三', 1, 0),
(2, '李四', 1, 1),
(3, '王五', 2, 0),
(4, '店小二', 3, 3),
(5, '孙二娘', 3, 4),
(6, '武松', 3, 6);
我想做一个三级联动的下拉菜单!<script language="javascript">
function InitAjax()
{
var ajax=false;
try
{
ajax=new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e)
{
try
{
ajax=new ActiveXObject("Microsft.XMLHTTP");
}
catch(E)
{
ajax=false;
}
}
if(!ajax&& typeof XMLHttpRequest !='undefined')
{
ajax=new XMLHttpRequest();
}
return ajax;
}
function onChangeProvince()
{
//获取接受返回信息层
var msg = document.getElementById("space_span"); //获取表单对象和用户信息值 //接收表单的URL地址
var url="selectSpace.php";
//需要POST的值,把每个变量都通过&来联接
var postStr = "idcompany="+ document.getElementById("company").value;
//实例化Ajax
var ajax = InitAjax();
//通过Post方式打开连接
ajax.open("POST", url, true);
//定义传输的文件HTTP头信息
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//发送POST数据
//alert(postStr);
ajax.send(postStr);
//获取执行状态
ajax.onreadystatechange = function()
{
//如果执行状态成功,那么就把返回信息写到指定的层里
if (ajax.readyState == 4 && ajax.status == 200)
{
msg.innerHTML = ajax.responseText;
}
}
}
</script>
<select name="province" id="province" onchange="onChangeProvince()">
<option value='0'>请选择</option>
<?
$sql="select idprovince,province_name from provinceorder by idprovince asc";
$rs=$dbc->getRsArray($sql);
//$dbc是我做一个数据库连接的类,方法getRsArray($sql)是一个从数据库获取的记录,返回所有记录。
//$dbc->num_rows是返回行数
for($i=0;$i<$dbc->num_rows;$i++){
?>
<option value="<?=$rs[$i][idprovince]?>" ><?=$rs[$i][province_name]?></option>
<?}?>
</select>
<span id="space_span">
销售员:
<select name="sale" id="sale">
<option value="0">无</option>
<option value="1">全部</option>
<?
$sql="select uid,user_name from operator_admin";
$rs=$dbc->getRsArray($sql);
for($i=0;$i<$dbc->num_rows;$i++){
?>
<option value="<?=$rs[$i][uid]?>"><?=$rs[$i][user_name]?></option>
<?}?>
</select></span>
selectSpace.php<?php
header("Content-type: text/html; charset=gb2312");
session_start();
include("../../includes/dbconn.php");$idprovince=fixid($_REQUEST["idprovince"]); $sql="select idcity,city_name from city where idprovince=".$idprovince;
$rs=$dbc->getRsArray($sql);if($dbc->num_rows!=0)
{
$str="<select name='city' onchange='onChangeCity()'><option value='0'>全部</option>";
for($i=0;$i<$dbc->num_rows;$i++)
{
$str.="<option value='".$rs[$i][idcity]."'>".$rs[$i][city_name]."</option>"; }
$str.="</select>";
$sql="select uid,user_name from operator_admin where idprovince=".$idprovince;
$rs=$dbc->getRsArray($sql);
if($dbc->num_rows!=0)
{
$str.=" 销售员:<select name='sale' id='sale'><option value='0'>无</option><option value='1'>全部</option>";
for($i=0;$i<$dbc->num_rows;$i++)
{
$str.="<option value='".$rs[$i][uid]."'>".$rs[$i][user_name]."</option>";
}
$str.="</select>";
}
else
{
$str.=" 销售员:<select name='sale' id='sale'><option value='0'>无</option></select>";
}
echo $str;
}
else
{
$sql="select uid,user_name from operator_admin where idprovince=".$idprovince;
$rs=$dbc->getRsArray($sql);
if($dbc->num_rows!=0)
{
$str.=" 销售员:<select name='sale' id='sale'><option value='0'>无</option><option value='1'>全部</option>";
for($i=0;$i<$dbc->num_rows;$i++)
{
$str.="<option value='".$rs[$i][uid]."'>".$rs[$i][user_name]."</option>";
}
$str.="</select>";
}
else
{
$str.=" 销售员:<select name='sale' id='sale'><option value='0'>无</option></select>";
}
echo $str;
}
?>
我的主要含义是选择省份的时候,销售员能列出来。就是省份下的销售员具体显示到城市的时候,销售员也能跟着发生变化,就是省份-城市下的销售员onChangeCity() 这个方法我就不会写了!或者不用Ajax也行!请各位前辈帮我指正应该怎么做!谢谢各位前辈了!
function onChangeProvince()
{
//获取接受返回信息层
var msg = document.getElementById("space_span"); //获取表单对象和用户信息值 //接收表单的URL地址
var url="selectSpace.php";
//需要POST的值,把每个变量都通过&来联接
var postStr = "idcompany="+ document.getElementById("company").value;
//实例化Ajax
var ajax = InitAjax();
//通过Post方式打开连接
ajax.open("POST", url, true);
//定义传输的文件HTTP头信息
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//发送POST数据
//alert(postStr);
ajax.send(postStr);
//获取执行状态
ajax.onreadystatechange = function()
{
//如果执行状态成功,那么就把返回信息写到指定的层里
if (ajax.readyState == 4 && ajax.status == 200)
{
msg.innerHTML = ajax.responseText;
}
}
}
跟你这个一样的
1 ajax 这块用jquery 来实现,会比较简单.
2 要学会调试,firebug 是个不错的工具,能看到发送的包和接收的包.
3 理清楚思路再做,一步一步的来,先实现二级的,再扩展为三级的。最后,我貼一点我以前实现的一个无限分级的代码,用json 来配置实现的,希望能有所帮助。<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>管理区域</title>
<base href="<?php echo base_url() ?>" />
<?php echo CS_get('public_head'); //公共JS载入 ?>
<?php echo CS_get('public_ui_js'); //公共JS载入 ?>
</head>
<script src="inc/javascript/linklist.js"></script>
<script>$(function(){ // Document is ready
for (var j_index in json)
{
temp_json = json[j_index];
//初始化首结点信息
if(j_index == 0 )
{
head_json = temp_json;
}
/*注册事件*/
if(temp_json.event_type == "change")
{
handle_change(temp_json); //处理onchange 提交事件.
}
}
linklist_child(head_json); //初始化首节点
});
var json = [ //json 配置对象列表.
{divId:"area_div",fieldName:"area2_pid[]",renderType:"checkBox",event_type:"change",table:"area2",cid_name:"area2_id",ctitle_name:"area2_title",pid_name:"area2_pid",pid_obj_name:""},
{divId:"area2_div",fieldName:"area3_pid[]",renderType:"checkBox",event_type:"change",table:"area3",cid_name:"area3_id",ctitle_name:"area3_title",pid_name:"area3_pid",pid_obj_name:"area2_pid[]"},{divId:"area2_div_2",fieldName:"test[]",renderType:"radio",event_type:"",table:"area3",cid_name:"area3_id",ctitle_name:"area2_title",pid_name:null,pid_obj_name:"area2_pid[]"},{divId:"area3_div",fieldName:"area3_id[]",renderType:"radio",event_type:"",table:"area3",cid_name:"area3_id",ctitle_name:"area3_title",pid_name:null,pid_obj_name:"area3_pid[]"}
];</script>
<style>
#area2_div {border:1px solid red; margin:10px;}
#area2_div_2 {border:1px solid green; margin:10px;}
</style>
<body>
<h1>LinkList json 数据模型demo</h1>
<h2>第一级菜单</h2>
<div id="area_div">
<form method="post" id="area_div_form">
<input type="checkbox" name="area2_pid[]" target = "area_id_form" value="1"/> v1
<input type="checkbox" name="area2_pid[]" target = "area_id_form" value="2"/>v2
<input type="checkbox" name="area2_pid[]" target = "area_id_form" value="3"/>v3
</form>
</div><h2>第二级菜单 2.1</h2>
<div id="area2_div">
<input type="checkBox" name="area3_pid[]" value="null" /> 请选择area_2的值.
</div><h2>第二级菜单 2.2</h2>
<div id="area2_div_2">
<input type="checkBox" name="area3_pid[]" value="null" /> 请选择area_2的值.
</div>
<h2>第二级菜单3.1</h2>
<div id="area3_div">
<input type="radio" name="area3_id[]" value="null" /> 请选择上级菜单的值.
</div>
<div id="prompt">提示信息在这里</div>
</body>
</html> js 代码//inc/javascript/linklist.js
// JavaScript Document created by xuxing 2009-12-22
/******************************************************************************/
// json item 组成明细说明
// divId json 对应的层的编号
// fieldName 里面字段的命名
// renderType 里面字段的类型
// event_type 事件触发机制
// table cid_name ctitle_name pid_name 获取下一级数据所需求数据
// pid_obj_name 父结点名称,相当于指针链表的 linkList 里面的pre.
// 树形结构,不支持正向遍历.可以反向遍历
/******************************************************************************/
function handle_change(json_obj)
{
$("[name="+json_obj.fieldName+"]").change( function() {
linklist_child(json_obj);
})
}/**获取下一级菜单的数据,并将其根据json 的配置,显示在下一级菜单中去.*/
function linklist_child(json_obj)
{
form_id = json_obj.divId+"_form";
var queryString = $("#"+form_id).formSerialize();
queryString += "&table="+json_obj.table;
queryString += "&pid_name="+json_obj.pid_name;
queryString += "&cid_name="+json_obj.cid_name;
queryString += "&ctitle_name="+json_obj.ctitle_name;
$.post("/opera/get_link_json_data", queryString, function(data){
handle_load_child(json_obj,data);
}
);
child_json = find_child_object(json_obj);
if(child_json.length) {
for(t = 0;t<child_json.length;t++)
{
linklist_child(child_json[t]);
}
}
}/**取得子结点,并给子结点,按子结点所指定的类型添加数据,并添加 */
function handle_load_child(json_obj,data)
{
child_objects = find_child_object(json_obj);
if(child_objects.length)
{
for(t = 0 ;t <child_objects.length;t++)
{
reder_data(child_objects[t],data);
}
}
}/**将子对象根据不同的渲染器写入相关的数据中去*/
function reder_data(json_obj,data)
{
str = "handel_data_for_"+json_obj.renderType;
str_fun_handel = str+"(json_obj,data)";
divId = json_obj.divId;
formId = divId+"_form";
dest_html = "<form method=\"post\" id=\""+formId+"\">";
dest_html += eval(str_fun_handel);
dest_html += "<\/form>";
$("#"+divId).html(dest_html);
/*注册事件*/
if(json_obj.event_type == "change")
{
handle_change(json_obj); //处理onchange 提交事件.
}}///处理列表
function handel_data_for_checkBox(json_obj,data)
{ dest_html = "";
data_json = eval("var data_json = "+data);
for(var d_index in data_json)
{
for(var d_index2 in data_json[d_index])
{
dest_html += "<input type = 'checkbox' name = '"+json_obj.fieldName+"' value = '"+data_json[d_index][d_index2].value+"'/>"+data_json[d_index][d_index2].text;
}
}
return dest_html;
}function handel_data_for_radio(json_obj,data)
{
dest_html = "";
data_json = eval("var data_json = "+data);
for(var d_index in data_json)
{
for(var d_index2 in data_json[d_index])
{
dest_html += "<input type = 'radio' name = '"+json_obj.fieldName+"' value = '"+data_json[d_index][d_index2].value+"'/>"+data_json[d_index][d_index2].text;
}
}
return dest_html;
}/**获取json 的了结点对象,以数组形式返回.*/
function find_child_object(json_obj)
{
child_obj_arr = new Array();
for (var j_index in json)
{
temp_json = json[j_index];
if(temp_json.pid_obj_name == json_obj.fieldName)
{
child_obj_arr.push(temp_json);
}
}
return child_obj_arr;
}
1 后台将读出来的数据放到数组里,用json_encode将数组转成串,并且返回给html
2 前台用js动态添加option数据.
function initSelect(arrSelect, obj)
{
obj.empty();
var option=null;
var text = "";
for(var i=0; i<arrSelect.length; i++)
{
option = document.createElement("option");
option.text = arrSelect[i];
option.value = arrSelect[i];
obj[0].options.add(option);
}
}//initSelect
省市三级连动,
即时获取数据能有多大的数据量?另 jquery也是js,不要误导新人.
http://www.webkey.cn/demo/view.asp?id=54