zoukankan      html  css  js  c++  java
  • 夜深了,写了个JQuery的省市区三级级联效果

    刚刚练手的JQuery,希望大神们指正

    主要实现以下功能:

    1、三级菜单级联加载数据

    2、可以在不操作脚本的情况下,给元素加属性实现级联功能

    3、自定义动态显示数据

    咨询问题:

    对于一般比较固定不变的数据,是不是应该生成静态的文件,直接加载整个数据文件,访问文件比较好?还是这样动态的访问比较好?

    一般的数据文件,小的会在50k,大的会在3M

    这个可以讨论下

      1 /**
      2 省市区县级联
      3 */
      4 (function($){
      5     
      6     /*
      7     *
      8     *获取ele的相对元素
      9     *
     10     **/
     11     function CssFirstElement(ele, css) {
     12         ele = $(ele);
     13         if (!ele) {
     14             var event = event ? arguments[0] : window.event;
     15             ele = event.srcElement ? event.srcElement : event.target;
     16             ele = $(ele);
     17         }
     18         var targetInpage;
     19 
     20         if ((typeof css == 'string') && css.constructor == String && css.substr(0, "css:#".length) == "css:#") {
     21             //以css:# 开头,是一个ID选择器
     22             targetInpage = $( $(css.substring(4))[0] );
     23         } else if ((typeof css == 'string') && css.constructor == String && css.substr(0, "css:".length) == "css:") {
     24             //以css: 开头,是一个基于元素的父级元素
     25             var css0 = css.substring(4);
     26             if (css0.split(' ').length==1) {
     27                 var parentCss = css0.substring(0, css0.indexOf(' '));
     28                 var eleCss = css0.substring(css0.indexOf(' ')).replace(/(^s*)|(s*$)/g, "");
     29                 targetInpage = ele.parents(eleCss + ":first");
     30             } else {
     31                 var parentCss = css0.substring(0, css0.indexOf(' '));
     32                 var eleCss = css0.substring(css0.indexOf(' ')).replace(/(^s*)|(s*$)/g, "");
     33                 targetInpage = ele.parents(parentCss+":first").find(eleCss);
     34             }
     35                  
     36         } else if ((typeof css == 'string') && css.constructor == String) {
     37             targetInpage = $(css);
     38         } else {
     39             //对象直接返回
     40             return [];
     41         }
     42 
     43         return targetInpage.length > 0 ? $(targetInpage.get(0)) : [];
     44     }
     45     function SelectData(element) {
     46         this.element = element;//元素
     47         this.optionUrl = element.attr("data-optionUrl");//加载选项的url
     48         this.defaultValue = element.attr("data-defaultValue");//加载选项试的默认值
     49         this.display = element.attr("data-display");//返回对象的 option 显示的键
     50         this.value = element.attr("data-value");//返回对象的 option 绑定的键
     51         this.changeTarget = CssFirstElement(element, element.attr("data-changeTarget"));//元素选择改变后,触发目标元素重新加载选项
     52         this.showAll = element.attr("data-showAll");//是否显示全部选项
     53         this.immediately = element.attr("data-immediately");//是否立即加载选项
     54         this.param = element.attr("data-param");//请求时携带的参数
     55         //有需要触发改变选项的目标,就添加change事件,触发目标请求时,携带的参数
     56         if (this.changeTarget.length > 0) {
     57             this.element.on("change.selectDataFill",$.proxy(this.changeEvent,this));
     58         }
     59         this.element.data("SelectDataFillObj",this);
     60     }
     61     SelectData.prototype = {
     62         changeEvent: function () {
     63             this.changeTarget.attr("data-param",
     64                 this.element.get(0).name + "=" + this.element.get(0).value);
     65             this.changeTarget.data("SelectDataFillObj").empty();
     66             
     67             var targetW=this.changeTarget;
     68             while (true) {
     69                 targetW = targetW.data("SelectDataFillObj").changeTarget;
     70                 if (targetW && targetW.length>0) {
     71                     targetW.data("SelectDataFillObj").empty();
     72                 } else {
     73                     break;
     74                 }
     75             }
     76             this.changeTarget.data("SelectDataFillObj").LoadData();
     77         },
     78         empty: function () {
     79             this.element.empty();
     80             if (this.showAll) {
     81                 $("<option value="">全部</option>").appendTo(this.element);
     82             }
     83         },
     84         FillDataSuccess: function (data) {
     85             debugger;
     86             var element = this.element;
     87             this.empty();
     88            
     89             for (var i = 0; i < data.list.length; i++) {
     90                 var item = data.list[i];
     91                 $("<option value="" + item[this.value] + "" " +
     92                     (item[this.value] == this.defaultValue ? "selected" : "") + ">" +
     93                     item[this.display] + "</option>").appendTo(element);
     94             }
     95             if (this.element.val()!='') {
     96                 this.element.trigger("change.selectDataFill");
     97             }
     98         },
     99         LoadData: function () {
    100             $.getJSON(this.optionUrl,this.element.attr("data-param")).success($.proxy(this.FillDataSuccess, this));
    101         }
    102     };
    103     $.fn.SelectDataFill = function () {
    104     
    105         this.each(function (index, element) {
    106 
    107             var element = $(element);
    108             var obj = new SelectData(element);            
    109             if (obj.immediately) {
    110                 obj.LoadData();
    111             }
    112             
    113         });
    114 
    115     }
    116 
    117 
    118 })(jQuery);

    应用:

     1 <td colspan="3">
     2     <select name="ProvinceId" 
     3             data-optionUrl="/BasicPlugin/Area/ProvinceJson" 
     4             data-defaultValue="3" 
     5             data-display="Name" 
     6             data-value="Id" 
     7             data-changeTarget="css:td select[name=CityId]" 
     8             data-showAll="true" 
     9             data-immediately="true">
    10         <option value="">请选择</option>    
    11     </select>
    12     <select name="CityId" 
    13             data-optionUrl="/BasicPlugin/Area/CityJson" 
    14             data-defaultValue="1" 
    15             data-display="Name" 
    16             data-value="Id" 
    17             data-changeTarget="css:td select[name=DistrictId]" 
    18             data-showAll="true"> 
    19         <option value="">请选择</option>                                                  
    20     </select>
    21     <select name="DistrictId" 
    22             data-optionUrl="/BasicPlugin/Area/DistrictJson" 
    23             data-defaultValue="1" 
    24             data-display="Name" 
    25             data-value="Id" 
    26             data-changeTarget="css:td select[name=StreetId]" 
    27             data-showAll="true">  
    28         <option value="">请选择</option>                                                     
    29     </select>
    30         <select name="StreetId" 
    31                 data-optionUrl="/BasicPlugin/Area/StreetJson" 
    32                 data-defaultValue="1" 
    33                 data-display="Name" 
    34                 data-value="Id" 
    35                 data-showAll="true">  
    36         <option value="">请选择</option>                                                     
    37     </select>
    38 </td> 

    以上代码中的请求路径,如  /BasicPlugin/Area/StreetJson 返回的json格式为:

    1 {
    2     list:[
    3         {ID:1,Name:"名称",Code:"001"},
    4         {ID:1,Name:"名称",Code:"001"}
    5     ]  
    6 }

    效果如下:

    一级选择改变,相关联的均重新加载数据,如果加载项中有默认值,则会选中默认值

     暂时公开访问地址可以看到效果:

    http://uiprogrammer.sxxxt.cn/Home/Index

  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/ZhyjEye/p/6012272.html
Copyright © 2011-2022 走看看