您好,欢迎访问一九零五行业门户网

ajax级联菜单实现方法实例分析

本文实例讲述了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; }
其它类似信息

推荐信息