/* * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。 * * 指定登记&发行网站: https://www.zhiqim.com/ 欢迎加盟知启蒙,[编程有你,知启蒙一路随行]。 * * 本文采用《知启蒙登记发行许可证》,除非符合许可证,否则不可使用该文件! * 1、您可以免费使用、修改、合并、出版发行和分发,再授权软件、软件副本及衍生软件; * 2、您用于商业用途时,必须在原作者指定的登记网站,按原作者要求进行登记; * 3、您在使用、修改、合并、出版发行和分发时,必须包含版权声明、许可声明,及保留原作者的著作权、商标和专利等知识产权; * 4、您在互联网、移动互联网等大众网络下发行和分发再授权软件、软件副本及衍生软件时,必须在原作者指定的发行网站进行发行和分发; * 5、您可以在以下链接获取一个完整的许可证副本。 * * 许可证链接:http://zhiqim.org/licenses/zhiqim_register_publish_license.htm * * 除非法律需要或书面同意,软件由原始码方式提供,无任何明示或暗示的保证和条件。详见完整许可证的权限和限制。 */ +(function(Z) {//BEGIN // @version v1.1.0 @author zouzhigang 2015-11-12 新建与整理 /************************************************************************/ //下拉列表,包括属性和方法 /************************************************************************/ // 1、配置方式,必须包括data-role="dropdown"表示是下拉列表 // 2、可选属性data-onchange表示修改的函数,类似于select // 2、可选属性data-options值为样式格式event:click;width:160px;item-width:160px; // 3、支持的参数值 // 1)event 表示该窗口的触发方式,click|hover,默认click // 2)width 表示下拉列表宽度,默认等于elem的宽度,类似于select // 3)height 表示下拉列表高度,默认200px时会出现滚动条,可以通过设计该值进行修改 // 4)item-width 表示下拉项的宽度,默认等于width,一行一个类似于select,如果设置成width/2,则表示一行两个 // 4、举例如下: //
// 湖南省 // //
/************************************************************************/ /********************************************/ //提示类定义,包括属性和方法 /********************************************/ Z.Dropdown = Z.Class.newInstance(); Z.Dropdown.prototype = { defaults : {//缺省值 elem: null, hasSelected: true//firefox第一次focus不会show }, init: function() {//初始化 this.$elem = Z.$elem(this.elem, "Z.Dropdown"); this.$default = this.$elem.find(".z-default"); this.$input = this.$default.children('input'); this.$arrow = this.$elem.find("i.z-float-right.z-font"); this.$list = this.$elem.find(".z-list"); this.$spans = this.$list.find("span"); if (this.$list.length == 0) return; //获取配置的属性 var options = Z.AR.toObject(this.$elem.attr("data-options"), ";"); var expression = this.$elem.attr("data-onchange"); if (Z.T.isString(expression)) this.onchange = Z.evals(expression); //初始化列表高度 this.event = options && options.event || "click"; this.stop = options && options.stop || "false"; var maxHeight = Z.S.prefixNum(options && options.maxHeight || "200"); this.$list.css("maxHeight", maxHeight); //初始化条目宽高 this.width = options && options.width || this.$elem.offsetWidth(); var itemWidth = Z.S.prefixNum(options && options.itemWidth || this.width); var itemHeight = Z.S.prefixNum(options && options.itemHeight || "30"); this.$spans.css({width: itemWidth, height: itemHeight, lineHeight: itemHeight-6}); //把条目的高度缓存起来 this.$list.show(); this.itemHeight = this.$spans.offsetHeight(); this.$list.hide(); //初始化成功 this.status = 0; //初始化注册移入移出事件,鼠标在元素和提示上显示 this.$spans.click(this.select, this); if (this.event == "click") { this.$elem.click(this.show, this); Z(document).click(this.hide, this); } else { this.$elem.mouseover(this.show, this); this.$elem.mouseout(this.hide, this); this.$list.mouseover(this.show, this); this.$list.mouseout(this.hide, this); } if (this.$input.length > 0) { this.$input.on('focus',this.focus, this); this.$input.on('input',this.show, this); this.$input.on('blur',this.blur, this); } }, focus: function(e) { this.$input.attr("placeholder", this.$input.attr("data-value")); this.$input.val(""); if (Z.B.firefox && this.hasSelected) {//firefox第一次focus不会show this.hasSelected = false; this.show(e); } }, show: function(e) { if (this.stop == "true") {//默认为false,即向上冒泡,以支持多个下拉列表时相互关闭,当父节点有click事件时,可设置为true,不冒泡 Z.E.stop(e); } var target = Z.E.target(e); if (this.event == "click" && this.status == 1 && !(target instanceof HTMLInputElement)) {//第二次点击表示关闭,如果input下点击不处理,箭头处理 this.close(); return; } //把列表恢复为初始模式 this.status = 1; this.$elem.addClass("z-active"); this.$arrow.removeClass("z-arrowhead-down").addClass("z-arrowhead-up"); if (this.$input.length > 0) { this.$list.removeClass("z-none").css("height", "auto"); this.$spans.removeClass("zi-hide"); if (target instanceof HTMLInputElement) {//如果是从input点击的执行搜索,箭头不执行,显示全部 this.search(); } } //定义到元素的下方 var top = this.$elem.offsetHeight() - 2;//上下边框2px var left = -1;//左边框1px this.$list.inBlock().css({top: top, left: left, width: this.width}); var listRect = this.$list[0].getBoundingClientRect(); var topBody = listRect.top; var height = listRect.height; if (topBody > height && Z.D.clientHeight() - topBody - height < 0) {//如果顶部够高,底部不够高时,则向上弹出 top = top - height - this.$elem.offsetHeight() + 2; this.$list.css("top", top); } }, hide:function(e) { if (this.stop == "true") {//默认为false,即向上冒泡,以支持多个下拉列表时相互关闭,当父节点有click事件时,可设置为true,不冒泡 Z.E.stop(e); } //鼠标在元素和提示中间不关闭 var x = Z.E.clientX(e); var y = Z.E.clientY(e); var tx = this.$elem.clientX(); var ty = this.$elem.clientY(); var tw = this.$elem.offsetWidth(); var th = this.$elem.offsetHeight(); if (x > tx && x < (tx+tw) && y > ty && y < (ty+th)) return; this.close(); }, search: function() { var val = this.$input.val(); this.$spans.addClass("zi-hide"); this.$list.removeClass("z-none"); this.$spans.each(function(elem) {//检索字符串是否存在 if(Z(elem).text().indexOf(val) > -1) Z(elem).removeClass("zi-hide"); }); var num = this.$spans.length - this.$list.find(".zi-hide").length; this.$list.css("height", this.itemHeight * num + 2); //如果不存在匹配对象,显示提示 if (this.$list.find(".zi-hide").length == this.$spans.length) { this.$list.addClass('z-none').css("height", this.itemHeight); } }, blur: function(e) {//输入框退出时,恢复输入框 this.$input.val(this.$input.attr("data-value")); }, setValue: function(value) { if (Z.V.isEmpty(value)) return; var $selected; this.$spans.each(function(item) { var $span = Z(item); if (value == $span.attr("value")){ $selected = $span; return true; } }); if ($selected) {//找到 this.selected($selected); //设置值时,需要检查是否是z-select,是同步到select中 var selectId = this.$elem.attr("data-id"); if (selectId) { var sel = Z.D.id(selectId); if (sel){ Z.Select.click($selected[0], sel); } } } }, select: function(e) { Z.E.stop(e); this.selected(Z(Z.E.target(e))); }, selected: function($selected) { this.$spans.each(function(item) {//先清理选中 Z(item).removeClass("z-selected").removeAttr("selected"); }); $selected.addClass("z-selected"); if (this.$input.length > 0) { this.$input.attr('data-value', $selected.text()).val($selected.text()); } else { this.$default.val($selected.val()); this.$default.text($selected.text()); } this.hasSelected = true; this.close(); if (this.onchange) this.onchange($selected.val()); }, close: function() { this.status = 0; this.$elem.removeClass("z-active"); this.$arrow.removeClass("z-arrowhead-up").addClass("z-arrowhead-down"); this.$list.hide(); }, remove: function() { this.$elem.remove(); } }; /********************************************/ //刷新静态函数和第一次加载 /********************************************/ Z.Dropdown.load = function(target) {//加载 Z.$selector("[data-role=z-dropdown]", target).each(function(elem){ new Z.Dropdown({elem: elem}); }); }; Z.onload(Z.Dropdown.load); /********************************************/ //选择框定义和加载转换成下拉列表对象 /********************************************/ Z.Select = function(e) { Z.E.stop(e); Z.Select.click(Z.E.current(e), this); } Z.Select.click = function(target, elem) { var index = Z(target).attr("index"); var oldIndex = elem.selectedIndex; for (var i=0;i' + '' + ''; var $role = Z(dropdown).appendTo($cover) .css({position: "absolute", left: 0, top: 0, width: width, height: height}) .cssMaybe("padding-left", $elem.css("paddingLeft")) .cssMaybe("padding-right", $elem.css("paddingRight")) .cssMaybe("padding-top", $elem.css("paddingTop")) .cssMaybe("padding-bottom", $elem.css("paddingBottom")) .addClass(classes) .attr("id", random).attr("data-id", id).attr("data-name", name) .attr("data-options", options); //如果是模糊查找选择框 if(isSearch) { $role.find(".z-default").append(''); } var hasSelected = null; for (var i=0;i'; var $span = Z(span); //如果有配置点击事件,则设置 if (option["onclick"]){ $span.attr("onclick", option["onclick"]); } //再增加单击修改到select去的事件 $span.click(Z.Select, elem); $role.find('.z-list').append($span); } //如果未选中取第一个 if (hasSelected == null){ hasSelected = (elem.length>0)?elem.options[0]:null; } if (hasSelected) { if (isSearch){ $role.find('.z-default > input').attr("data-value", hasSelected.text).val(hasSelected.text); } else{ $role.find('.z-default').attr("value", hasSelected.value).text(hasSelected.text); } } //转成下拉列表 new Z.Dropdown({elem: $role[0]}); }); }; Z.onload(Z.Select.load); //END })(zhiqim);