博客小子:记录我们对互联网和生活的探索! 注册 | 登陆

javascript的省市县乡村街道ajax联动

Tags: javascript, ajax, 联动, 省市县乡村街道

这个例子我我看到别人的网站这个功能很不错,基于php的javascript的省市县乡村街道ajax联动,自己把他的源代码拷贝了一下,加上自己的修改是一个很不错的功能保留下了。

ajax方式的省市县乡村街道有一个很明显的优势就是:如果一次加载的话省市县乡村街道全国的数据会非常大,具体多大你可以试试你的浏览器上万行会不会卡?而ajax方式就可以很好的避免这个问题。

在我们遇到的这个项目中,由于数据量巨大不可能用传统的一次加载的方式,幸好这个ajax方式的联动效果非常好,于是www.blogguy.cn就收藏了,各位朋友免费用,转载请注明一下来源是www.blogguy.cn

废话少说,直接看javascript代码先:

 

JavaScript代码
  1. <script language="javascript">   
  2. var xmlHttp; //定义一个全局变量   
  3.   
  4. //主函数,用于层和图标的样式及执行AJAX   
  5. function changeselect(id,rid,url)   
  6. {   
  7.     GetId(id).style.display='';   
  8.     ShowChild(id,rid,url);   
  9. }   
  10.   
  11. //创建XMLHttpRequest对象   
  12. function CreateXMLHttpRequest()   
  13. {   
  14.     if (window.ActiveXObject)   
  15.     {   
  16.         xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");   
  17.     }   
  18.     else  
  19.     {   
  20.         xmlHttp = new XMLHttpRequest();   
  21.     }   
  22. }   
  23.   
  24. //Ajax处理函数   
  25. function ShowChild(id,rid,url)   
  26. {   
  27.     CreateXMLHttpRequest();   
  28.     if(xmlHttp)   
  29.     {   
  30.         xmlHttp.open('POST',url,true);   
  31.         xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');   
  32.         var SendData = 'pid='+rid;   
  33.         xmlHttp.send(SendData);   
  34.         xmlHttp.onreadystatechange=function()   
  35.         {   
  36.            if(xmlHttp.readyState==4)   
  37.            {   
  38.              if(xmlHttp.status==200)   
  39.              {   
  40.                 GetId(id).innerHTML = xmlHttp.responseText;   
  41.              }   
  42.              else  
  43.              {   
  44.                 GetId(id).innerHTML='出错:'+xmlHttp.statusText;   
  45.              }   
  46.            }   
  47.            else  
  48.            {   
  49.                 GetId(id).innerHTML="正在提交数据...";   
  50.             }   
  51.         }   
  52.      }   
  53.      else  
  54.      {   
  55.         GetId(id).innerHTML='抱歉,您的浏览器不支持XMLHttpRequest,请使用IE6以上版本!';   
  56.      }   
  57. }   
  58.   
  59. //取得页面对象   
  60. function GetId(id)   
  61. {   
  62.     return document.getElementById(id);   
  63. }   
  64. //www.blogguy.cn的页面效果控制函数   
  65. function EditHousehold(){   
  66.     if(document.getElementById("isEditHousehold").checked==true)    
  67.     {    
  68.         document.getElementById("newCurrentHousehold").className="displayblock";   
  69.     } else{   
  70.         document.getElementById("newCurrentHousehold").className="displaynone";    
  71.     }   
  72. }   
  73. </script>  

 

下面这段是www.blogguy.cn的html+php的混合代码,不太规范,凡是效果是一目了然。简单解释一下就是:如果数据库中已经有记录了就显示是否修改选项,如果如果勾选了修改,那就显示地区选项出来;如果数据库中没有记录,就直接显示地区选项。

 

PHP代码
  1. <?php    
  2. if($realname!=""){   
  3.     //数据库中以及有数据   
  4.     $sql = "SELECT * FROM www.blogguy.cn_area where id=$provinceid";;   
  5.     $query = $_SGLOBAL['db']->query($sql);   
  6.     $row = $_SGLOBAL['db']->fetch_array($query);   
  7.     $provincename = $row['name'];   
  8.   
  9.     $sql = "SELECT * FROM www.blogguy.cn_area where id=$cityid";;   
  10.     $query = $_SGLOBAL['db']->query($sql);   
  11.     $row = $_SGLOBAL['db']->fetch_array($query);   
  12.     $cityname = $row['name'];   
  13.   
  14.     $sql = "SELECT * FROM www.blogguy.cn_area where id=$countyid";;   
  15.     $query = $_SGLOBAL['db']->query($sql);   
  16.     $row = $_SGLOBAL['db']->fetch_array($query);   
  17.     $countyname = $row['name'];   
  18.     echo("<span id='CurrentHousehold' class=''>当前户口所在地:$provincename - $cityname - $countyname</span>");   
  19. ?>   
  20.     <input type="checkbox" name="isEditHousehold" id="isEditHousehold" value="0" onclick="javascript:EditHousehold();">我要修改   
  21.     <div id='newCurrentHousehold'  class='displaynone'>   
  22.     <select name="province" onchange="changeselect('cityID',this.value,'http://www.blogguy.cn/include/area.php?type=1&level=2');">   
  23.     <option value="">-选择省份-</option>   
  24.     <?php    
  25.     $sql = "SELECT * FROM www.blogguy.cn_area where parentid=0";;   
  26.     $query = $_SGLOBAL['db']->query($sql);   
  27.     while ($row = $_SGLOBAL['db']->fetch_array($query))    
  28.     {   
  29.         echo("<option value=\"".$row["id"]."\">".$row["name"]."</option>");    
  30.     }   
  31.     ?>   
  32.     </select>   
  33.     <span id="cityID"></span>   
  34.     </div>   
  35. <?php }else{?>   
  36.     <select name="province" id="province" onchange="changeselect('cityID',this.value,'http://www.blogguy.cn/include/area.php?type=1&level=2');">   
  37.     <option value="">-选择省份-</option>   
  38.     <?php    
  39.     $sql = "SELECT * FROM www.blogguy.cn_area where parentid=0";;   
  40.     $query = $_SGLOBAL['db']->query($sql);   
  41.     while ($row = $_SGLOBAL['db']->fetch_array($query))    
  42.     {   
  43.         echo("<option value=\"".$row["id"]."\">".$row["name"]."</option>");    
  44.     }   
  45.     ?>   
  46.     </select>   
  47.     <span id="cityID"></span>   
  48.     <font color="#FF0000">*</font>   
  49. <?php }?>  

然后是服务器端的php脚本,也就是http://www.blogguy.cn/include/area.php这个文件该如何写的问题,这个文件要考虑到是否存在下个等级,如果存在下一个分类等级的话,那么要加一个类似于onchange=\"changeselect('countyID',this.value,'http://www.blogguy.cn/include/area.php?type=1&level=3');的函数,然后需要一个id是'countyID'的div或者span,用于放置下一季对象。

给一个www.blogguy.cn的简单的代码。下面的代码是我为了方便演示使用的mysql数据库,在实际项目中我都是直接生成数据保存到文件中,直接读取文件的,这里仅仅是一个演示,就不做文件中读取操作了。

 

PHP代码
  1. if($pid!=""&$type==1&$level==2){   
  2.     $return="<select name=\"city\" id=\"city\" onchange=\"changeselect('countyID',this.value,'http://www.blogguy.cn/include/area.php?type=1&level=3');\">";   
  3.     $return.="<option value=\"\">-请选择-</option>";   
  4.     $sql = "SELECT * FROM www.blogguy.cn_area where parentid=$pid";;   
  5.     $query = $_SGLOBAL['db']->query($sql);   
  6.     while ($row = $_SGLOBAL['db']->fetch_array($query))    
  7.     {   
  8.         $return.="<option value=\"".$row["id"]."\">".$row["name"]."</option>";     
  9.     }      
  10.     $return.="</select>";   
  11.     $return.="<span id=\"countyID\"></span>";   
  12.     echo iconv("gbk""UTF-8"$return);   
  13. }   
  14.   
  15. if($pid!=""&$type==1&$level==3){   
  16.     $return="<select name=\"county\" id=\"county\">";   
  17.     $sql = "SELECT * FROM www.blogguy.cn_area where parentid=$pid";;   
  18.     $query = $_SGLOBAL['db']->query($sql);   
  19.     if($_SGLOBAL['db']->num_rows($query)<1){   
  20.         $sql = "SELECT * FROM job_area where id=$pid";;   
  21.         $query = $_SGLOBAL['db']->query($sql);     
  22.         while ($row = $_SGLOBAL['db']->fetch_array($query))    
  23.         {   
  24.             $return.="<option value=\"".$row["id"]."\">".$row["name"]."</option>";     
  25.         }                  
  26.     }else{   
  27.         $return.="<option value=\"\">-请选择-</option>";   
  28.         while ($row = $_SGLOBAL['db']->fetch_array($query))    
  29.         {   
  30.             $return.="<option value=\"".$row["id"]."\">".$row["name"]."</option>";     
  31.         }      
  32.     }   
  33.     $return.="</select>";   
  34.     echo iconv("gbk""UTF-8"$return);   
  35. }  

 

现在你应该可以看到想要的结果了,是不是挺好的呢?你可能好想问我如何通过javascript来判断用户是不是有选择呢?或者用户选择的数据是不是完整呢?其实很简单,看下面的javascript代码,判断用户是否有选择地区。

 

JavaScript代码
  1. if (document.getElementsByName("isEditHousehold").length!=0) {   
  2.     if(document.getElementById("isEditHousehold").checked==true){   
  3.         if(document.getElementsByName("county").length==0||document.getElementById("county").value==""){   
  4.             alert("地址不能为空!");   
  5.             return false;   
  6.         }   
  7.     }   
  8. }else{   
  9.     if(document.getElementsByName("county").length==0||document.getElementById("county").value==""){   
  10.         alert("地址不能为空!");   
  11.         return false;   
  12.     }   
  13. }   

 

好了,基本上贴完了,这也是blogguy.cn在最近项目遇到的问题和解决办法,大家看图。

 第一张:数据库没有记录

大小: 3.31 K
尺寸: 231 x 30
浏览: 23 次
点击打开新窗口浏览全图

第二张:选择地区

大小: 19.07 K
尺寸: 391 x 136
浏览: 9 次
点击打开新窗口浏览全图

第三张:ajax等待效果

大小: 3.53 K
尺寸: 186 x 41
浏览: 12 次
点击打开新窗口浏览全图

第四张:数据库中已经有记录

大小: 5.36 K
尺寸: 318 x 33
浏览: 3 次
点击打开新窗口浏览全图

第五张:点击修改

大小: 7.06 K
尺寸: 381 x 35
浏览: 4 次
点击打开新窗口浏览全图

第六张:修改数据

大小: 21.88 K
尺寸: 550 x 102
浏览: 6 次
点击打开新窗口浏览全图

有朋友问www.blogguy.cn的省市县乡街道的数据,其实我的数据也很不完善~~呵呵

Tags: javascript, ajax, 联动, 省市县乡村街道

« 上一篇:php变量名如何包含变量,或者叫php变量的变量 | 下一篇:nginx上支持ssi(shtml) »

只显示10条记录相关文章

Trackbacks

点击获得Trackback地址,Encode: UTF-8

4条记录访客评论

我需要c#.net的,大哥。。。救命!!!

Post by andyson on 2010, August 12, 12:15 PM 引用此文发表评论 #1

引用 andyson 说过的话:
我需要c#.net的,大哥。。。救命!!!
自己搞搞,也就那么回事,不难

Post by wayswang on 2010, August 15, 4:13 PM 引用此文发表评论 #2

你好,我正在到处找 省市县乡村 的数据库,不知道你能不能分享我一份?不胜感激!我的QQ:252423303@163.com

Post by 天涯海角 on 2011, May 16, 11:15 AM 引用此文发表评论 #3

引用 天涯海角 说过的话:
你好,我正在到处找 省市县乡村 的数据库,不知道你能不能分享我一份?不胜感激!我的QQ:252423303@163.com

我的数据不全,只有一个城市的数据。呵呵

Post by wayswang on 2011, May 23, 9:36 AM 引用此文发表评论 #4


发表评论

评论内容 (必填):