用Jquery简单封装一个可重复调用的省市级联动插件

前言:基于公司项目简单封装的一个省市联动组件,由于只涉及广东省内,故省份默认广东省,由于比较简单,自己可以重新改写插件(样式也可以自己定义)

效果图:

这里写图片描述

点击选择城市:

这里写图片描述

选择地区:

这里写图片描述

代码结构:

自定义样式:

.cascade-container>div{position: relative;float: left;font-size: 20px;margin-bottom: 30px}
.cascade-container .input-select{height: 20px;font-size: 20px;text-align: center;background-color: #eee;border: 1px solid #000;}
.cascade-container .list-select{position: absolute;top: 0;left: 0;width: 100%;padding: 0;text-align: center;margin: 0;background-color: #eee;z-index: 9;border: 1px #000 solid;display: none;}
.cascade-container li{list-style: none}

结构:

    <div id="cascade1" class="cascade-container"></div>
    <div id="cascade2" class="cascade-container"></div>

控制初始化:

       $(function(){
        $('#cascade1').cascade({
            url:'****'//自定义接口地址
        });
        $('#cascade2').cascade();
    })//需要几处省市联动就调用几次,注意id区分

代码解析:

根据《jQuery高级编程》的描述,jQuery插件开发方式主要有三种:
1.通过$.extend()来扩展jQuery
2.通过$.fn 向Jquery添加新的方法
3.通过$.widget()应用Jquery UI的部件工厂方式创建
通常我们使用第二种方法来进行简单插件开发,说简单是相对于第三种方式。第三种方式是用来开发更高级Jquery部件的,该模式开发出来的部件带有很多Jquery内建的特性,比如插件的状态信息自动保存,各种关于插件的常用方法等,非常贴心,这里不细说。

所以首先

$.fn.cascade = function(obj){} //往$.fn上面添加一个方法,方法名字是cascade,即插件名字
var init = this;//在这里面,this指的是用Jquery选中的元素 example :$('a'),则this=$('a')

为防止this作用域等问题,我们这里把this赋值给init

var defaults = {
        url : 'http://###'//默认接口地址
    };
var sets = $.extend({},defaults, obj);//当用户没有自定义参数时,则用默认参数

在处理插件参数的接收上,通常使用Jquery的extend方法,当给extend方法传递一个以上的参数时,它会将所有参数对象合并到第一个里。同时,如果对象中有同名属性时,合并的时候后面的会覆盖前面的。
利用这一点,我们可以在插件里定义一个保存插件参数默认值的对象,同时将接收来的参数对象合并到默认对象上,最后就实现了用户指定了值的参数使用指定的值,未指定的参数使用插件默认值。

组织html结构:

     var html = '<div class="pro-wrap">'+
                    '<input type="text" readonly value="广东省" class="input-select"/>'+
                '</div>'+
                '<div class="city-wrap">'+
                    '<input type="text" readonly  value="请选择市" class="input-select"/>'+
                    '<ul id="city-list" class="list-select"></ul>'+
                '</div>'+
                '<div class="dist-wrap">'+
                    '<input type="text" readonly value="请选择区" class="input-select"/>'+
                    '<ul id="dist-list" class="list-select"></ul>'+
                '</div>';
    init.append(html);
    ajaxData(28240,'city-list');//city init

其中每次点击某个城市均会触法区域查询请求,如下:

function ajaxData(id,$select){
      $.ajax({
          type:"post",
          url:sets.url, //注意此处
          data:"parentId=" + id ,
          dataType:"json",
          success:function( data ){
              var obj = data.data,
                  htm ='' ;
              if(data.result == 1){
                  $.each(obj,function(i){
                      htm += '<li id="'+obj[i].id+'">'+obj[i].name+'</li>';
                  });
                  init.find('#'+$select+'').html(htm);
              }
          },
          error:function(){
              alert('网络繁忙');
          }
      })
  }

点击交互事件:(此处代码不够简洁,大家看下就行了。哈哈哈)

init.on('click','.input-select',function(){
    init.find('ul').hide();
    $(this).next('ul').show();
});
init.on('click','#city-list li',function(){
    init.find('.dist-wrap input').val('请选择区');
    var id = $(this).attr('id'),
        val = $(this).text();
    init.find('.city-wrap input').val(val).attr('id',id);
    init.find('ul').hide();
    ajaxData(id,'dist-list');
});
init.on('click','#dist-list li',function(){
    var id = $(this).attr('id'),
        val = $(this).text();
    init.find('.dist-wrap input').val(val).attr('id',id);
    init.find('ul').hide();
});
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值