PHP + AJAX 实现二级联动

原文地址:http://blog.csdn.net/s_willan/article/details/7221802  

建立数据库表,如果是少量的数据就先全加载进去

SQL 语句

/*
SQLyog 企业版 - MySQL GUI v5.02
主机 - 5.0.45 : 数据库 - ld
*********************************************************************
服务器版本 : 5.0.45
*/


create database if not exists `ld`;

USE `ld`;

/*数据表 `class` 的表结构*/

DROP TABLE IF EXISTS `class`;

CREATE TABLE `class` (
`cid` int(10) NOT NULL auto_increment,
`class` varchar(100) NOT NULL COMMENT '类别',
`sid` int(10) NOT NULL default '0',
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=gbk;

/*数据表 `class` 的数据*/

insert into `class` values (1,'A',0), (2,'B',0), (3,'C',0), (4,'D',0), (5,'aa',1), (6,'ab',1), (7,'ac',1), (8,'ad',1), (9,'ba',2), (10,'bb',2), (11,'ca',3), (12,'da',4);
------------------------------------------------------------------------------------------------------------------------------------

执行以上的 SQL 语句,就建立好了我们的数据库( `ld` )和表( `class` )

建立 index.php , 将其当成我们的主页,代码如下(在搜索一级分类的时候,把搜索的 PHP 代码和 页面HTML 代码掺写在了一块儿,看的有点乱,如果你做的二级联动,一级分类是固定的话,就可以直接把一级分类写在页面上,而不用再去搜索,还有,若使用了代码分离的框架,例如Smarty,也可以使用它来分离 PHP 和 HTML 代码,这里不作介绍):

------------------------------------------------------------------------------------------------------------------------------------

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>PHP+Ajax 二级联动菜单测试</title>
<script language="javascript" src="ld.js"></script>
</head>

<body>

<?php
//连接数据库
$con = mysql_connect('localhost', 'root', 'hicc');
if(!$con){

die('Could not connect:'.mysql_error());

}
mysql_select_db("ld", $con);

//搜索一级分类
$sql = "SELECT cid,class FROM class WHERE `sid` = '0'";
$result = mysql_query($sql);
?>

<form name="myform">
<b>Please Select A Big Class:</b>
<!--一级下拉框-->

<select name="users" οnchange="showsecond(this.value)">

<?php
while($row = mysql_fetch_array($result)){
?>

<option value="<?=$row['cid'];?>"><?=$row['class'];?></option>

<?
}
?>

</select>

<select id="second" style="width:200px; display:none;"></select>

</form>

</body>
</html>

------------------------------------------------------------------------------------------------------------------------------------

建立 out.php ,作为与 Ajax 互动的文件,代码如下:

------------------------------------------------------------------------------------------------------------------------------------

<?php

//必要的
header("Content-Type:text/xml;charset=gb2312");

$value = $_GET['value'];

$link = mysql_connect("localhost","root","hicc") or die("链接数据库失败");
mysql_select_db("ld", $link);
$sql = "SELECT cid, class FROM class WHERE `sid` = '".$value."'";
$result = mysql_query($sql, $link);
$data = '';

while(list($cid, $class) = mysql_fetch_row($result)){

$data .= "<row value='{$cid}'>{$class}</row>";

}
//要显示的信息
echo "<data>".$data."</data>";
mysql_close($link);

?>

------------------------------------------------------------------------------------------------------------------------------------

建立 ld.js ,这是我们的重头戏,代码如下:

------------------------------------------------------------------------------------------------------------------------------------


//This Is JavaScript Document
function CreateXHR(){

var request;
//返回浏览器的名称
var browser = navigator.appName;

//使用IE,则使用XMLHttp对象
if(browser == "Microsoft Internet Explorer"){

   var arrVersions = ["Microsoft.XMLHttp", "MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp","MSXML2.XMLHttp.5.0"];
   for (var i=0; i < arrVersions.length; i++){

    try{

     //从中找到一个支持的版本并建立XMLHttp对象
     request = new ActiveXObject(arrVersions[i]);
     return request;

    }

    catch(exception){
    //忽略,继续
    }

   }

}

else{

   //否则返回一个XMLHttpRequest对象
   request = new XMLHttpRequest();
   if(request.overrideMimeType){

    request.overrideMimeType('text/xml;charset=gb2312');

   }

    return request;

}

}

//实例化
var Request = new CreateXHR();

function showsecond(x){

var URL = "out.php?value=" + x;     
Request.open("GET", URL, true);
Request.onreadystatechange = Show_Second;
Request.send(null);

}

function Show_Second(){

if(Request.readyState == 4 && Request.status == 200){
  
   //显示二级框
   document.getElementById("second").style.display = '';
   //读取返回的xml数据
   var myData = Request.responseXML.getElementsByTagName("row");

   //如果数据长度为0,则表示没有取到数据,则不显示二级菜单
   if(myData.length == 0){

    document.getElementById("second").style.display = 'none';
  
   }

   var myStr   = new Array();
   var myValue = new Array();

   for(var i = 0; i < myData.length; i++){

    myStr[i]   = myData[i].firstChild.data;
    myValue[i] = myData[i].getAttribute("value");

   }
   document.getElementById("second").options.length = 0;  

   for(var j = 0;j<myStr.length;j++){

   document.getElementById("second").options[document.getElementById("second").options.length] = new Option(myStr[j], myValue[j]);

   }

}

}

------------------------------------------------------------------------------------------------------------------------------------

OK !
点击第一个下拉框,第二个也会跟着联动!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现三级联动的基本思路是通过Ajax技术实现异步请求后端数据,然后动态生成页面元素实现级联效果。下面是一个Spring MVC+JSP实现三级联动的示例代码: 1. 前端JSP页面 ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>三级联动示例</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ // 加载省份列表 $.ajax({ url: "${pageContext.request.contextPath}/province", type: "GET", success: function(data){ var provinceList = JSON.parse(data); var html = ""; for(var i=0; i<provinceList.length; i++){ html += "<option value='"+provinceList[i].id+"'>"+provinceList[i].name+"</option>"; } $("#province").html(html); } }); // 根据省份id加载城市列表 $("#province").change(function(){ var provinceId = $(this).val(); $.ajax({ url: "${pageContext.request.contextPath}/city/"+provinceId, type: "GET", success: function(data){ var cityList = JSON.parse(data); var html = ""; for(var i=0; i<cityList.length; i++){ html += "<option value='"+cityList[i].id+"'>"+cityList[i].name+"</option>"; } $("#city").html(html); } }); }); // 根据城市id加载区县列表 $("#city").change(function(){ var cityId = $(this).val(); $.ajax({ url: "${pageContext.request.contextPath}/district/"+cityId, type: "GET", success: function(data){ var districtList = JSON.parse(data); var html = ""; for(var i=0; i<districtList.length; i++){ html += "<option value='"+districtList[i].id+"'>"+districtList[i].name+"</option>"; } $("#district").html(html); } }); }); }); </script> </head> <body> <select id="province"> <option value="">请选择省份</option> </select> <select id="city"> <option value="">请选择城市</option> </select> <select id="district"> <option value="">请选择区县</option> </select> </body> </html> ``` 2. 后端Controller代码 ```java @Controller public class RegionController { @Autowired private RegionService regionService; @RequestMapping(value="/province", method=RequestMethod.GET) @ResponseBody public String getProvinceList(){ List<Province> provinceList = regionService.getProvinceList(); return JSON.toJSONString(provinceList); } @RequestMapping(value="/city/{provinceId}", method=RequestMethod.GET) @ResponseBody public String getCityList(@PathVariable("provinceId") String provinceId){ List<City> cityList = regionService.getCityList(provinceId); return JSON.toJSONString(cityList); } @RequestMapping(value="/district/{cityId}", method=RequestMethod.GET) @ResponseBody public String getDistrictList(@PathVariable("cityId") String cityId){ List<District> districtList = regionService.getDistrictList(cityId); return JSON.toJSONString(districtList); } } ``` 3. Service层代码 ```java @Service public class RegionServiceImpl implements RegionService { @Autowired private RegionDao regionDao; @Override public List<Province> getProvinceList() { return regionDao.getProvinceList(); } @Override public List<City> getCityList(String provinceId) { return regionDao.getCityList(provinceId); } @Override public List<District> getDistrictList(String cityId) { return regionDao.getDistrictList(cityId); } } ``` 4. DAO层代码 ```java @Repository public class RegionDaoImpl implements RegionDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public List<Province> getProvinceList() { String sql = "select province_id, province_name from tb_province"; List<Province> provinceList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Province>(Province.class)); return provinceList; } @Override public List<City> getCityList(String provinceId) { String sql = "select city_id, city_name from tb_city where province_id=?"; List<City> cityList = jdbcTemplate.query(sql, new Object[]{provinceId}, new BeanPropertyRowMapper<City>(City.class)); return cityList; } @Override public List<District> getDistrictList(String cityId) { String sql = "select district_id, district_name from tb_district where city_id=?"; List<District> districtList = jdbcTemplate.query(sql, new Object[]{cityId}, new BeanPropertyRowMapper<District>(District.class)); return districtList; } } ``` 其中Province、City和District是数据实体类,包含id和name两个属性。以上代码只是一个简单示例,实际项目中需要根据具体需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值