本文实例讲述了ajax级联菜单实现方法。分享给大家供大家参考,具体如下:
效果如下:
选择第一项,第二项、第三项的内容跟着改变。
选择第二项,第三项的内容跟着改变。
第三项则不影响第一项和第二项。
有几点值得提:
1.html到底是前台拼接还是后台拼接。
我选择的是前台拼接,这样可以节省流量,和后台的资源。这也比较符合程序处理,一般后台只负责提供数据。
通过json传递给前台,完了前台获取进行处理。
ajax函数
function ajaxgetbigclass(val){
$.ajax({
type:"post",
async:false,
url:"/default/index/ajax/do/ajaxgetbigclass",
data:"typeid="+val,
success:function(response){
if(response){
res = response;
}else{
res = false;
}
}
});
return res;
}
function ajaxgetsmallclass(val){
$.ajax({
type:"post",
async:false,
url:"/default/index/ajax/do/ajaxgetsmallclass",
data:"bigclassid="+val,
success:function(response){
if(response){
res = response;
}else{
res = false;
}
}
});
return res;
}
后台ajax处理代码
case 'ajaxgetbigclass':
$typeid = trim($this->_getparam('typeid'));
$daonews = new dao_news();
if(isset($typeid)){
$bigclass = $daonews->getbigclassbytype($typeid,true);
if($bigclass){
$json = json_encode($bigclass);
echo $json;
}else{
echo false;
}
}else{
echo false;
}
break;
case 'ajaxgetsmallclass':
$bigclassid = trim($this->_getparam('bigclassid'));
$daonews = new dao_news();
if(isset($bigclassid)){
$smallclass = $daonews->getsmallclassbybigclass($bigclassid,true);
if($smallclass){
$json = json_encode($smallclass);
echo $json;
}else{
echo false;
}
}else{
echo false;
}
break;
调用ajax函数,并拼接成html函数
function setbigclass(id,flag){
var flag = arguments[1] ? arguments[1] : false;//默认值
var res = ajaxgetbigclass(id);
//alert(res);
if(res){
myobj = eval(res);
for(var i=0;i<myobj.length;i++){
strhtml+="<option value='"+myobj[i].id+"'>"+myobj[i].name+"</option>";
}
$("#bigclassid").html(strhtml);
}else{
var strhtml = "<option value=''>无子选项</option>";
$("#bigclassid").html(strhtml);
}
if(flag&&res){
return myobj[0].id;
}
}
function setsmallclass(id){
var res = ajaxgetsmallclass(id);
//alert(res);
if(res){
myobj = eval(res);
var strhtml = "<option value=''>请选择</option>";
for(var i=0;i<myobj.length;i++){
strhtml+="<option value='"+myobj[i].id+"'>"+myobj[i].name+"</option>";
}
$("#smallclassid").html(strhtml);
}else{
var strhtml = "<option value=''>请选择</option><option value=''>无子选项</option>";
$("#smallclassid").html(strhtml);
}
}
主函数,事件动作
$(function(){
//ajax级联
$("#typeid").change(function(){
var id = $(this).val();
var res = setbigclass(id,true);
if(res){
setsmallclass(res);
}else{
setsmallclass(0);
}
});
$("#bigclassid").change(function(){
var id = $(this).val();
setsmallclass(id);
});
});
2.后台查询函数化。
public function gettype($where = false, $order = 'typeid asc', $pagesize = false, $offset = false, $count = false, $from = false, $join = false, $group = false){
return $this->getdata($this->_typename,$where,$order,$pagesize,$offset,$count,$from,$join,$group);
}
public function gettypename($flag=false){
$where = array();
$atype = $this->gettype($where);
if($atype){
if($flag){
foreach ($atype as $key => $value) {
$type[$key]['id'] = $value['typeid'];
$type[$key]['name'] = $value['typename'];
}
return $type;
}else{
foreach ($atype as $key => $value) {
$type[$value['typeid']] = $value['typename'];
}
return $type;
}
}else{
return false;
}
}
public function getbigclass($where = false, $order = 'bigclassid asc', $pagesize = false, $offset = false, $count = false, $from = false, $join = false, $group = false){
return $this->getdata($this->_bigname,$where,$order,$pagesize,$offset,$count,$from,$join,$group);
}
public function getbigclassbytype($typeid = 60,$flag=false){
$where = array();
$where['bigclass.typeid =?'] = array("type"=>1,"val"=>$typeid);
//print_r($where);exit;
$from = array('bigclassid',"bigclassname","convert(text,bigclassmaster) as bigclassmaster","typeid");
$abigclass = $this->getbigclass($where, false, false, false, false,$from);
if($abigclass){
if($flag){
foreach ($abigclass as $key => $value) {
$bigclass[$key]['id'] = $value['bigclassid'];
$bigclass[$key]['name'] = $value['bigclassname'];
}
return $bigclass;
}else{
foreach ($abigclass as $key => $value) {
$bigclass[$value['bigclassid']] = $value['bigclassname'];
}
return $bigclass;
}
}else{
return false;
}
}
public function getsmallclass($where = false, $order = 'smallclassid asc', $pagesize = false, $offset = false, $count = false, $from = false, $join = false, $group = false){
return $this->getdata($this->_smallname,$where,$order,$pagesize,$offset,$count,$from,$join,$group);
}
public function getsmallclassbybigclass($bigclassid = 221,$flag=false){
$where = array();
$where['smallclass.bigclassid =?'] = array("type"=>1,"val"=>$bigclassid);
//print_r($where);exit;
$asmallclass = $this->getsmallclass($where);
if($asmallclass){
if($flag){
foreach ($asmallclass as $key => $value) {
$smallclass[$key]['id'] = $value['smallclassid'];
$smallclass[$key]['name'] = $value['smallclassname'];
}
return $smallclass;
}else{
foreach ($asmallclass as $key => $value) {
$smallclass[$value['smallclassid']] = $value['smallclassname'];
}
return $smallclass;
}
}else{
return false;
}
}
这样就可以多处使用,多种角度使用。
3.前台js,文件化,同一个功能的js放在一个js文件中。内容最后也函数化。
<script type="text/javascript" src="/js/news/cascade.js"></script>
<tr>
<td width="20%" height="56" align="right" >请选择分类:</td>
<td width="80%" style="padding:10px;">
<select id="typeid" name="typeid" class=" ffb-input">
<!--{html_options options=$atype selected=$adata.typeid|default:'0'}-->
</select>
>
<select id="bigclassid" name="bigclassid" class=" ffb-input">
<!--{html_options options=$abigclass selected=$adata.bigclassid|default:'0'}-->
</select>
>
<select id="smallclassid" name="smallclassid" class=" ffb-input">
<option value="">请选择</option>
<!--{html_options class=" ffb-input" options=$asmallclass selected=$adata.smallclassid|default:'0'}-->
</select>
</td>
</tr>
这样会让文件很清晰。
优化后的js
$(function(){
//ajax级联
$("#typeid").change(function(){
var id = $(this).val();
setbigclass(id);
});
$("#bigclassid").change(function(){
var id = $(this).val();
setsmallclass(id);
});
});
function setbigclass(id){
var res = ajaxgetbigclass(id);
var strhtml;
if(res){
myobj = eval(res);
for(var i=0;i<myobj.length;i++){
strhtml+="<option value='"+myobj[i].id+"'>"+myobj[i].name+"</option>";
}
$("#bigclassid").html(strhtml);
$("#bigclassid").show().change();
}else{
$("#bigclassid").hide();
$("#smallclassid").hide();
}
}
function setsmallclass(id){
var res = ajaxgetsmallclass(id);
if(res){
myobj = eval(res);
var strhtml = "<option value=''>请选择</option>";
for(var i=0;i<myobj.length;i++){
strhtml+="<option value='"+myobj[i].id+"'>"+myobj[i].name+"</option>";
}
$("#smallclassid").html(strhtml);
$("#smallclassid").show();
}else{
$("#smallclassid").hide();
}
}
function ajaxgetbigclass(val){
$.ajax({
type:"post",
async:false,
url:"/default/index/ajax/do/ajaxgetbigclass",
data:"typeid="+val,
success:function(response){
if(response){
res = response;
}else{
res = false;
}
}
});
return res;
}
function ajaxgetsmallclass(val){
$.ajax({
type:"post",
async:false,
url:"/default/index/ajax/do/ajaxgetsmallclass",
data:"bigclassid="+val,
success:function(response){
if(response){
res = response;
}else{
res = false;
}
}
});
return res;
}