jquery-weui地区选择器改为时间季度选择器

原创 2017年02月08日 17:25:29

https://github.com/timelessmemory/weui-quarter-picker

city-picker.js更改后的代码

// jshint ignore: start
+function($){

$.rawCitiesData = [];
var quarters = ["第一季度", "第二季度", "第三季度", "第四季度"];
var months = ["第一个月", "第二个月", "第三个月"];

for(var i = 2014; i <= new Date().getFullYear(); i++) {
  var tmpYear = {
    "name" : i + "年",
    "code" : i + "00",
    "sub" : []
  }

  for (var j = 0; j < quarters.length; j++) {
    var tmpQuarter = {
      "name" : quarters[j],
      "code" : i + "00" + j,
      "sub" : []
    }

    for (var k = 0; k < months.length; k++) {
      var tmpMonth = {
        "name" : months[k],
        "code" : i + "00" + j + k
      }
      tmpQuarter.sub.push(tmpMonth)
    }
    tmpYear.sub.push(tmpQuarter)
  }
  $.rawCitiesData.push(tmpYear);
}

}($);
// jshint ignore: end

/* global $:true */
/* jshint unused:false*/

+ function($) {
  "use strict";

  var defaults;
  var raw = $.rawCitiesData;

  var format = function(data) {
    var result = [];
    for(var i=0;i<data.length;i++) {
      var d = data[i];
      if(/^请选择/.test(d.name)) continue;
      result.push(d);
    }
    if(result.length) return result;
    return [];
  };

  var sub = function(data) {
    if(!data.sub) return [{ name: '', code: data.code }];
    return format(data.sub);
  };

  var getCities = function(d) {
    for(var i=0;i< raw.length;i++) {
      if(raw[i].code === d || raw[i].name === d) return sub(raw[i]);
    }
    return [];
  };

  var getDistricts = function(p, c) {
    for(var i=0;i< raw.length;i++) {
      if(raw[i].code === p || raw[i].name === p) {
        for(var j=0;j< raw[i].sub.length;j++) {
          if(raw[i].sub[j].code === c || raw[i].sub[j].name === c) {
            return sub(raw[i].sub[j]);
          }
        }
      }
    }
  };

  var parseInitValue = function (val) {
    var p = raw[0], c, d;
    var tokens = val.split(' ');
    raw.map(function (t) {
      if (t.name === tokens[0]) p = t;
    });

    p.sub.map(function (t) {
      if (t.name === tokens[1]) c = t;
    })

    if (tokens[2]) {
      c.sub.map(function (t) {
        if (t.name === tokens[2]) d = t;
      })
    }

    if (d) return [p.code, c.code, d.code];
    return [p.code, c.code];
  }

  var toCode = function(raw, val) {
    var p, c, d;
    var tokens = val.split(' ');
    raw.map(function (t) {
      if (t.name === tokens[0]) p = t;
    });

    p.sub.map(function (t) {
      if (t.name === tokens[1]) c = t;
    })

    if (tokens[2]) {
      c.sub.map(function (t) {
        if (t.name === tokens[2]) d = t;
      })
    }

    if (d) return [p.code, c.code, d.code];
    return [p.code, c.code];
  }

  $.fn.cityPicker = function(params) {
    params = $.extend({}, defaults, params);

    return this.each(function() {
      var self = this;

      var provincesName = raw.map(function(d) {
        return d.name;
      });
      var provincesCode = raw.map(function(d) {
        return d.code;
      });
      var initCities = sub(raw[0]);
      var initCitiesName = initCities.map(function (c) {
        return c.name;
      });
      var initCitiesCode = initCities.map(function (c) {
        return c.code;
      });
      var initDistricts = sub(raw[0].sub[0]);

      var initDistrictsName = initDistricts.map(function (c) {
        return c.name;
      });
      var initDistrictsCode = initDistricts.map(function (c) {
        return c.code;
      });

      var currentProvince = provincesName[0];
      var currentCity = initCitiesName[0];
      var currentDistrict = initDistrictsName[0];

      var cols = [
          {
            displayValues: provincesName,
            values: provincesCode,
            cssClass: "col-province"
          },
          {
            displayValues: initCitiesName,
            values: initCitiesCode,
            cssClass: "col-city"
          }
        ];

        if(params.showDistrict) cols.push({
          values: initDistrictsCode,
          displayValues: initDistrictsName,
          cssClass: "col-district"
        });

      var config = {

        cssClass: "city-picker",
        rotateEffect: false,  //为了性能
        formatValue: function (p, values, displayValues) {
          return displayValues.join(' ');
        },
        onChange: function (picker, values, displayValues) {
          var newProvince = picker.cols[0].displayValue;
          var newCity;
          if(newProvince !== currentProvince) {
            var newCities = getCities(newProvince);
            newCity = newCities[0].name;
            var newDistricts = getDistricts(newProvince, newCity);
            picker.cols[1].replaceValues(newCities.map(function (c) {
              return c.code;
            }), newCities.map(function (c) {
              return c.name;
            }));
            if(params.showDistrict) picker.cols[2].replaceValues(newDistricts.map(function (d) {
              return d.code;
            }), newDistricts.map(function (d) {
              return d.name;
            }));
            currentProvince = newProvince;
            currentCity = newCity;
            picker.updateValue();
            return false; // 因为数据未更新完,所以这里不进行后序的值的处理
          } else {
            if(params.showDistrict) {
              newCity = picker.cols[1].displayValue;
              if(newCity !== currentCity) {
                var districts = getDistricts(newProvince, newCity);
                picker.cols[2].replaceValues(districts.map(function (d) {
                  return d.code;
                }), districts.map(function (d) {
                  return d.name;
                }));
                currentCity = newCity;
                picker.updateValue();
                return false; // 因为数据未更新完,所以这里不进行后序的值的处理
              }
            }
          }
          //如果最后一列是空的,那么取倒数第二列
          var len = (values[values.length-1] ? values.length - 1 : values.length - 2)
          $(self).attr('data-code', values[len]);
          $(self).attr('data-codes', values.join(','));
          if (params.onChange) {
            params.onChange.call(self, picker, values, displayValues);
          }
        },
        cols: cols,
        rawCitiesData : $.rawCitiesData,
        toCode : toCode
      };

      if(!this) return;
      var p = $.extend({}, params, config);
      var val = $(this).val();
      if (!val) val = '2017年 第一季度 第一个月';
      currentProvince = val.split(" ")[0];
      currentCity = val.split(" ")[1];
      currentDistrict= val.split(" ")[2];

      if(val) {
        p.value = parseInitValue(val);
        if(p.value[0]) {
          var cities = getCities(p.value[0]);
          p.cols[1].values = cities.map(function (c) {
            return c.code;
          });
          p.cols[1].displayValues = cities.map(function (c) {
            return c.name;
          });
        }

        if(p.value[1]) {
          if (params.showDistrict) {
            var dis = getDistricts(p.value[0], p.value[1]);
            p.cols[2].values = dis.map(function (d) {
              return d.code;
            });
            p.cols[2].displayValues = dis.map(function (d) {
              return d.name;
            });
          }
        } else {
          if (params.showDistrict) {
            var dis = getDistricts(p.value[0], p.cols[1].values[0]);
            p.cols[2].values = dis.map(function (d) {
              return d.code;
            });
            p.cols[2].displayValues = dis.map(function (d) {
              return d.name;
            });
          }
        }
      }
      $(this).picker(p);
    });
  };

  defaults = $.fn.cityPicker.prototype.defaults = {
    showDistrict: true
  };

}($);


涉及到的样式修改代码jquery-weui.css中添加

.toolbar .cancel-picker {
  position: absolute;
  box-sizing: border-box;
  height: 2.2rem;
  line-height: 2.2rem;
  color: #04BE02;
  z-index: 1;
  padding: 0 .5rem;
}


涉及到jquery-weui.js源码中的修改

toolbarTemplate: '<div class="toolbar">\
          <div class="toolbar-inner">\
          <a href="javascript:;" class="cancel-picker">取消</a>\
          <a href="javascript:;" class="picker-button close-picker">{{closeText}}</a>\
          <h1 class="title">{{title}}</h1>\
          </div>\
          </div>',
添加了<a href="javascript:;" class="cancel-picker">取消</a>\

地区选择器默认只要改变就实时的显示到文本输入框中,我的需求是点击确定才改变值,点击取消不改变。查看源码发现

p.updateValue = function () {
          var newValue = [];
          var newDisplayValue = [];
          for (var i = 0; i < p.cols.length; i++) {
              if (!p.cols[i].divider) {
                  newValue.push(p.cols[i].value);
                  newDisplayValue.push(p.cols[i].displayValue);
              }
          }
          if (newValue.indexOf(undefined) >= 0) {
              return;
          }
          p.value = newValue;
          p.displayValue = newDisplayValue;
          if (p.params.onChange) {
              p.params.onChange(p, p.value, p.displayValue);
          }
          if (p.input && p.input.length > 0) {
              // $(p.input).val(p.params.formatValue ? p.params.formatValue(p, p.value, p.displayValue) : p.value.join(' '));
              $(p.input).trigger('change');
          }
      };

注释掉的就是导致实时改变input框的代码,将其移至确定按钮点击时间代码中

$(document).on("click", ".close-picker", function() {
        var pickerToClose = $('.weui-picker-modal.weui-picker-modal-visible');
        if (pickerToClose.length > 0) {
          $(p.input).val(p.params.formatValue ? p.params.formatValue(p, p.value, p.displayValue) : p.value.join(' '));
          $.closePicker(pickerToClose);
        }
      });
由于取消按钮是后来添加的,所以也给其注册点击事件

  $(document).on("click", ".cancel-picker", function() {
    var pickerToClose = $('.weui-picker-modal.weui-picker-modal-visible');
    if (pickerToClose.length > 0) {
      $.closePicker(pickerToClose);
    }
  });


发现一个bug,每次选择完取消再点击显示的是新选择的值而不是原来input正确的值,估计还是因为默认是实时显示引起的。查看源码

// Set value
              if (!p.initialized) {
                  if (p.params.value) {
                      p.setValue(p.params.value, 0);
                  }
              }
              else {
                  var tmpCode = p.params.toCode(p.params.rawCitiesData, p.input.val());
                  p.setValue(tmpCode, 0);
                  // if (p.value) p.setValue(p.value, 0);
              }

注释部分就是把change引起的新值显示到控件上,所以只需要改为显示input中的值。

p.params.toCode和p.params.rawCitiesData在config中配置,具体见city-picker.js


最后展示一下季度选择器




版权声明:本文为博主原创文章,未经博主允许不得转载。

时间控件:my97DatePicker选择年、季度、月、周、日

一直以来,用的最多的就是my97DatePicker获得年月日的方法,今天突然逛到了这篇文章,留下来,以备以后使用自己写的一个:获取年月,并从下个月开始计算 [html] view plain cop...

WeUI 入门教程

WeUI 是由微信官方设计团队专为微信移动 Web 应用设计的 UI 库。WeUI 是一套同微信原生视觉体验一致的基础样式库,为微信 Web 开发量身设计,可以令用户的使用感知更加统一。包含butto...
  • cometwo
  • cometwo
  • 2016年02月24日 23:37
  • 36931

weui 时间控件含全天 上午 下午 选择

请假    $(function(){     $("#endtime").datetimePicker({         times...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

datepicker只选择年月的设置技巧

本文不适合初学者,建议有一定jQuery ui基础的朋友继续阅读 首先在style中屏蔽日期选择面板 .ui-datepicker-calendar { display: none;//...

weui之Picker的使用教程

这个问题调试了很久,因为调用example.js时没问题,一移开就失效,一度觉得很诡异。 经过多次测试,才发现,是zepto.min.js的次序放错了,应该放到头部。 完整的代码: ...
  • gdali
  • gdali
  • 2016年12月10日 16:14
  • 12778

WEUI picker复杂逻辑使用经验

WEUI picker控件使用技巧

weui学习总结——2、操作反馈

前言:weui是一个专门用于开发手机移动web或微信的样式库。但是官方只提供了demo没有提供相关文档,所以这篇博客就当是方便以后开发而使用吧。weui资源下载(也可以从官网下载): http://...

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

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

Bootstrap的日期选择插件DateTime Picker增强版

虽然HTML5可以直接把input的type设置成date,但各个浏览器的支持情况不一,所以我们还是乖乖的用插件。 之前的一个日期插件虽然可以选择时间,但存在着一点小bug,所以又去找其...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jquery-weui地区选择器改为时间季度选择器
举报原因:
原因补充:

(最多只允许输入30个字)