jQuery WeUI City-Picker Demo:http://www.jqweui.cn/extends#city-picker

官方的city-picker提供了两种样式:

(1)省级-市级-区级

(2)省级-市级(不显示区级)


前端页面要引入的JS、CSS文件如下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><!--控制页面自动适应屏幕大小--><meta charset="UTF-8" name="viewport"content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"><title>BORN TO LOVE</title><link rel="shortcut icon" href="#"><!--JQuery--><script type="text/javascript" charset="UTF-8" src="resources/scripts/jquery-3.3.1.min.js"></script><!--JQuery WEUI--><script type="text/javascript" charset="UTF-8" src="resources/scripts/jquery-weui.min.js"></script><script type="text/javascript" charset="UTF-8" src="resources/scripts/fastclick.js"></script><script type="text/javascript" charset="UTF-8" src="resources/scripts/city-picker.js"></script><!--WeUI CSS--><link rel="stylesheet" type="text/css" href="resources/css/weui.css"><link rel="stylesheet" type="text/css" href="resources/css/jquery-weui.css">
</head>

最近开发的应用有一个新的需求,由于是在湖北省内使用,要求不显示“湖北省”,只选择市级-区级,而且地址名称需要自定义。

因此这里需要解决两个问题:

#1-> 如何只显示两级“市级-区级”?

#2-> 如何实现city-picker数据源动态加载,即数据自定义的问题?

在解决上述问题之前,我们先看看[city-pcker.js]里的源数据是如何组织的吧 ^^。

[city-pcker.js] 里的源数据是按JSON格式组织的 rawCitiesData ,例如“湖北省-武汉市-武昌区”的组织结构如下所示。

$.rawCitiesData = [{"name":"湖北省","code":"420000","sub":[{"name":"武汉市","code":"420100","sub":[{"name":"武昌区","code":"420106"},]},...]}
]

现在来解决第一个问题,如何只显示“市级-区级”,不显示“省级”。

思路1:参照官网不显示区级的做法

直接在 city-picker.js 修改  defaults = $.fn.cityPicker.prototype.defaults 增加 showProvince: true

  defaults = $.fn.cityPicker.prototype.defaults = {showDistrict: true, //是否显示地区选择showProvince: true  //是否显示省份选择};

前端页面初始化添加 showProvice: false

 $("#home-city").cityPicker({title: "选择目的地",showProvince: false,  //不显示省级onChange: function (picker, values, displayValues) {console.log(values, displayValues);}});

但是,并没有达到想要的效果,没有任何影响。

原因是这里相当于只是写了一个属性名,必须自定义完善对应的方法,相当于要参照showDistrict的方法写一套处理showProvince的方法,虽然确实可以实现,但必须要读懂 city-picker.js 源码再进行相应的修改,对小白来说太不友好了。

比如下图展示了源码中涉及到showDistrict的所有地方,如果要改showProvince只会更麻烦,因为省份默认是带sub子节点的,这个结构注定了可以向下追溯,没法直接从中间节点向上追溯的,感兴趣的大神可以自行考虑如何改写这个逻辑代码。

思路2严格按照 rawCitiesData 的JSON格式重新组织数据源

原始数据:“湖北省” - “武汉市” - “武昌区”

改写数据:“武汉市” - “武昌区” -      null

 {"name": "武汉市","code": "420100","sub": [{"name": "武昌区","code": "420106","sub": []}]
}

页面再按照不显示区级的方法初始化city-picker

 $("#home-city").cityPicker({title: "选择目的地",showDistrict: false,onChange: function (picker, values, displayValues) {console.log(values, displayValues);}});

<body></body>

<h2 class="demos-second-title">只选择城市</h2>
<div class="weui-cells weui-cells_form"><div class="weui-cell"><div class="weui-cell__hd"><label for="home-city" class="weui-label">城市</label></div><div class="weui-cell__bd"><input class="weui-input" id="home-city" type="text" value="武汉市 武昌区"></div></div>
</div>

需要强调的是,这里的<input>必须初始化value值,不然会报错

报错原因分析

原始的 city-picker.js 里有一段代码

//计算value
var val = $(this).val();
if (!val) val = '北京 北京市 东城区';
currentProvince = val.split(" ")[0];
currentCity = val.split(" ")[1];
currentDistrict = val.split(" ")[2];

这段代码的意思是取input框的value值,如果value为空则赋值为“北京 北京市 东城区”,并初始化picker的三层选择框的省份为“北京”、城市为“北京市”、地区为“东城区”,当点击这个input框的时候,初始的选择值就是“北京 北京市 东城区”。但是我们之前已经把 rawCitiesData 进行了重写,只保留了武汉市的数据,因此如果input不初始化value值,控件找不到这个值,自然会报错。

解决方式主要有两种:

一种是直接给input赋值初始value,另一种就是在city-picker.js里修改上面那段代码

需要注意的是value值必须是 rawCitiesData 中初始化的值,不然也会报错。

//计算value
var val = $(this).val();
if (!val) val = '武汉 武昌区';
currentProvince = val.split(" ")[0];
currentCity = val.split(" ")[1];
currentDistrict = val.split(" ")[2];

演示效果: 


现在来解决第二个问题, 如何动态加载数据源,可以自定义数据,满足个性化需求。

#-> 思路:

要自定义显示的数据,直接修改 city-picker.js 里的 rawCitiesData 就行了。

一种方式,自己按照 rawCitiesData 的JSON格式组织自己要的数据,然后粘贴复制替换掉原来的rawCitiesData 就行。这种方式比较适合数据量比较小,且固定后期变动比较小的情况,优点是修改直观且简单粗暴。

另一种方式就是实现动态加载数据源,通过外部传参的方式初始化数据源,数据源可通过ajax的方式去后台数据库查询,然后组织成对应的JSON格式返回前端。这种方式就比较适合数据量比较大且后期数据变动较大的情况,优点是维护方便。

#-> 实现

首先,我们来看看 city-picker.js 源码是如何对数据源进行操作的。

其实很简单,就是设置了一个变量 raw ,然后初始化赋值成数据源 rawCitiesData 。有点类似一个类Class里直接给属性赋值初始化的过程,如果要动态修改这个属性的值,我们通常会增加 set 方法,所以这里也是一样的道理,可以给 raw 也增加一个 set 方法,实现动态修改 raw 的值。

// 初始化赋值成空
var raw = [];
// 新增set方式为raw赋值
var setRawDataList= function (raw_data_list) {raw = raw_data_list;
}

和构造函数设置参数一样,这里 set 方法里传入的参数 raw_data_list  也需要修改默认参数设置,新增一个参数 initDataList ,用于接收外部数据源。

defaults = $.fn.cityPicker.prototype.defaults = {showDistrict: true, //是否显示地区选择initDataList: []   //加载数据源-参数设置
};

最后在 city-picker 初始化的时候为 raw 进行赋值操作,在 $.fn.cityPicker = function (params) {}里新增如下代码,params.initDataList 就是刚刚在defaults里设置的新增参数。

 $.fn.cityPicker = function (params) {params = $.extend({}, defaults, params);return this.each(function () {var self = this;// 根据外部传入的参数为raw赋值if(params.initDataList != null && params.initDataList.length > 0 ){setRawDataList(params.initDataList);}...  // 其他代码不变}

主要修改的就只有三个地方,如下图所示

至此,city-picker.js 修改完毕。

前端<input>html

<h2 class="demos-second-title">请选择目的地</h2>
<div class="weui-cells weui-cells_form"><div class="weui-cell"><div class="weui-cell__hd"><label for="home-city" class="weui-label">城市</label></div><div class="weui-cell__bd"><input class="weui-input" id="home-city" type="text"></div></div>
</div>

city-picker初始化,datalist可以通过ajax去后台获取,这里为了演示方便直接写出来了,另外需要注意的是JSON数据要加“[ ]”。

<script>// 注意要加[]  -- datalist可以通过ajax去后台查询数据库获取let datalist = JSON.parse("[{\n" +"            \"name\": \"武汉市\",\n" +"            \"code\": \"420100\",\n" +"            \"sub\": [\n" +"                {\n" +"                    \"name\": \"市辖区\",\n" +"                    \"code\": \"420101\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"江岸区\",\n" +"                    \"code\": \"420102\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"江汉区\",\n" +"                    \"code\": \"420103\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"硚口区\",\n" +"                    \"code\": \"420104\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"汉阳区\",\n" +"                    \"code\": \"420105\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"武昌区\",\n" +"                    \"code\": \"420106\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"青山区\",\n" +"                    \"code\": \"420107\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"洪山区\",\n" +"                    \"code\": \"420111\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"东西湖区\",\n" +"                    \"code\": \"420112\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"汉南区\",\n" +"                    \"code\": \"420113\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"蔡甸区\",\n" +"                    \"code\": \"420114\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"江夏区\",\n" +"                    \"code\": \"420115\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"黄陂区\",\n" +"                    \"code\": \"420116\",\n" +"                    \"sub\": []\n" +"                },\n" +"                {\n" +"                    \"name\": \"新洲区\",\n" +"                    \"code\": \"420117\",\n" +"                    \"sub\": []\n" +"                }\n" +"            ]\n" +"        }]");$("#home-city").cityPicker({title: "选择目的地",// showProvince: false,showDistrict: false,initDataList: datalist,onChange: function (picker, values, displayValues) {console.log(values, displayValues);}});</script>

--- 20200724  --- 更新 ----------------------------------

#-> 自定义打开滚动框时的默认选中值

整体修改思路和上面自定义数据源的方式类似,把默认值改成外部自定义输入即可,添加相应的set方法完成赋值。

分析city-picker.js源代码,打开滚动框设定默认值的代码是这一行,因此需要修改这里的val为外部输入的变量值。

var val = $(this).val();
if (!val) val = '湖北 武汉 武昌区';

在defaults设置里新增一个默认外部输入变量 initCityShowValue

defaults = $.fn.cityPicker.prototype.defaults = {initCityShowValue: ""  //设置滚动框显示的默认值
};

给新变量 showval 新增set方法 setShowValue()

// 初始化赋值成""
var showval = "";
// 新增set方式为showval赋值
var setShowValue = function (show_value) {showval = show_value;
}

通过set方法将外部传入的参数 params.initCityShowValue 赋值给 showval

$.fn.cityPicker = function (params) {params = $.extend({}, defaults, params);return this.each(function () {var self = this;// 根据外部传入的参数为showval赋值if(params.initCityShowValue !== "" && params.initCityShowValue.length > 0 ){setShowValue(params.initCityShowValue);}
}

最后修改原来的默认值为我们新增的这个变量值 showval 即可

if (!val) val = showval;

前端初始化的时候,通过指定 initCityShowValue 的值即可

$("#destination").cityPicker({title: "请选择出差地点",// showDistrict: false,initCityShowValue: "武汉 江岸 个险",onChange: function (picker, values, displayValues) {console.log(values, displayValues);console.log("values:" + values);console.log("displayValues:" + displayValues[0] + " " + displayValues[1] + " " + displayValues[2]);}
});

参考https://blog.csdn.net/weixin_41913378/article/details/103175157

【JavaWeb】jQuery WeUI框架 地址选择器 City-Picker 自定义demo相关推荐

  1. jQuery WeUI 上传

    jQuery WeUI 是专为微信公众账号开发而设计的一个框架,jQuery WeUI的官网:http://jqweui.com/ 需求:需要在微信公众号网页添加上传图片功能 技术选型:实现上传图片功 ...

  2. 利用微信的weui框架上传、预览和删除图片

    jQuery WeUI 是专为微信公众账号开发而设计的一个框架,jQuery WeUI的官网:http://jqweui.com/ 需求:需要在微信公众号网页添加上传图片功能 技术选型:实现上传图片功 ...

  3. MUI 地址选择器 - picker使用

    MUI 地址选择器 - picker使用 很多安卓原生的地址选择器中,选择器基本是实时滚动的. 就像腾讯QQ应用的地址选择器一样! 效果截图如下: 代码如下: <!DOCTYPE html> ...

  4. Web前端UI框架 JQuery WeUI

    获取JQueryUI http://jqweui.com/ jQuery WeUI 是 WeUI 的一个 jQuery 实现版本,除实现了官方插件之外,它还提供了如下拉刷新.日历.地址选择器等丰富的拓 ...

  5. jQuery框架学习第二天:jQuery中万能的选择器

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...

  6. 关于使用jquery weui的picker部分遇到的问题及解决办法

    关于使用jquery weui的picker部分遇到的问题及解决办法 本人在使用jquery weui制作app项目时,遇到[picker][6]部分,按钮点击触发事件时发生的问题,在这里把它记录下来 ...

  7. jQuery系列 第四章 jQuery框架的选择器

    第四章 jQuery框架的选择器 4.1 jQuery选择器说明 jQuery 最核心的组成部分就是选择器引擎.它完全继承了 CSS 的风格,可以对 DOM 元 素的标签名.属性名.状态等进行快速准确 ...

  8. 移动端框架之JQuery WeUI

    和JQuery WeUI 配合使用的WeUI,是移动端快速开发的利器. 在初步使用的过程中,发现JQuery WeUI扩展的几个功能特别实用: 1.通知:模仿iOS风格的通知.你可以自定义标题,文案和 ...

  9. jq-weui滚动刷新,日历,和地址选择器

    最近工作方面的原因,接触到了微信公众号.然后网上找资料发现了jq-weui这个框架,觉得特别不错,分享一下 下载jq-weui点击这里下载jquery-weui,这里一定要注意下载的版本.因为有些功能 ...

最新文章

  1. MARKET1501的学习,跟着苏同学的博客学习
  2. 【代码示例】 一个简单的Java死锁
  3. Spring Boot-@Configuration注解
  4. 认知无线电matlab代码详解,认知无线电频谱感知之功率检测matlab代码.docx
  5. java集合框架(set)
  6. RocketMQ开发指导之二——RocketMQ部署
  7. 计算机原理及应用课程,课程描述
  8. 鸿蒙2.0内测版手机版,不再遮遮掩掩,鸿蒙2.0测试版下月发布,用于手机内测
  9. TabLayout的自定义
  10. Another Redis DeskTop Manager:一款可视化的Redis管理工具
  11. 税控盘是服务器系统,税控盘系统设置服务器地址
  12. matlab画倾斜的椭球_用matlab绘制椭球体x^2/4+y^2/9+z^2/16=1,并通过改变观察点获得它在各个坐标面上的投影。...
  13. 中关村买手机上当案例
  14. form 表单提交后,使页面不跳转
  15. PDF转成Word或PPT后还是图片是怎么回事?
  16. Oracle数据库中神奇的dual表
  17. 台式机安装EXSI,通过官方方式定制安装包
  18. P5.JS绘制动态图形
  19. OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(下)
  20. 欢迎注册和登陆我们的学海灯塔

热门文章

  1. 入门学习MySQL数据库基础
  2. 如何通过JS唤醒APP页面!
  3. 用Python实现一个简单课堂点名器V4
  4. 图像二值化中阈值算法浅析
  5. Vivado简单双端口RAM 使用,问题探析
  6. 毕业生报到系统服务器繁忙,报到证一定要去报到吗?不报到有哪些严重后果?...
  7. Hex hsl 转换 php,HEX和RGB和HSL颜色数值在线转换工具
  8. uniapp实战项目 (仿知识星球App) - - 实现图片懒加载
  9. MySQL——表的四种关联关系
  10. JavaScript关于JSON字符串的相关操作