前言
很久没有写博客了,话说真的工作后才发现很多需要学的,有很多不足。
加之最近工作没有什么沉淀,现在团队又面临解散,反正闲着也是闲着,就自己写了个插件,反正水平就这样,当时自我总结吧!
应用背景
在我们工作中,经常会遇到这种需求:
① 鼠标点击某个文本框时出现下拉菜单
② 常用的操作鼠标划上出现下拉菜单
③ 按钮类应用
我们会用到这种功能往往原因是因为地方小了,按钮多了,这往往说明产品设计一般出问题了。。。 但是,我辈屁民豪不关注产品(没资格插手),所以需要完成以上功能;
其实总的来说,这些功能还是非常实用的。
于是,为了应对以上场景,我工作中先是做了一个,然后又遇到了,然后又遇到了,所以最后就写了这么一个东西。
集中展示
几个功能放到一起了,前端代码如下:
View Code
1 2 3 45 14 15 16 69 70 71 72 73 74 点击按钮出现下拉菜单7576 77 78 79 80 81 82 8384 鼠标滑动8586 87 88
js代码:
View Code
var DropList = function (opts) { if (!opts.id) { alert('请指定触发展开事件的元素id'); return false; } //触发展开元素id this.toggleId = opts.id; this.toggleEl = opts.id ? $('#' + opts.id) : $('body'); this.key = opts.id ? opts.id + '_list' : new Date().getTime(); this.open = opts.open || 'click'; //展开菜单方式 mousein this.close = opts.close || 'click'; //关闭菜单方式 mouseleave //this.initShow = false; //判断是否初始化出现菜单绑定事件 /*下拉菜单数据,可能出现多级菜单数据格式: [['v', 'k', []], ['v', {}, []], ['v', 'k', [['v', 'k', []], ['v', 'k', []]] ] */ this.dropItems = opts.dropItems || null; this.loadData = opts.loadData; //用于异步加载下拉菜单数据//具有层级关系 this.listEl = null; this.func = opts.func || null; //点击时的事件处理 //同步方式加载 if (this.dropItems) { this.initDropItems(); this.eventBind(); } else { }};DropList.prototype.closeList = {};DropList.prototype.dropItemLoad = function (data, el) { for (var i in data) { var item = data[i]; var tmp = $(''); el.append(tmp); //标签已装载 if (item[0]) { tmp.html(item[0]); } if (item[1] || typeof item[1] == 'number') { if (typeof item[1] == 'string' || typeof item[1] == 'number') { tmp.attr('id', item[1]); } else { for (_k in item[1]) { tmp.attr(_k, item[1][_k]); } } } if (item[2] && item[2]['length']) { //此处需要递归 var child = $('
难点&后续
做的过程中还是遇到了几个问题的,比如:
① 菜单展开后如何关闭
② 多级菜单如何处理
不完善的级联效果
③ 事件如何回调
最后做出了这个比较简陋的东东。。。。
但是做完后也发现了一些问题:
① 像这种菜单在最左最下出现时没有解决;
② 然后菜单项过多时候也没有出现像select的滚动条;
③ 由于个人水平,整个代码的质量亦有问题;
④ 开始也考虑了异步数据加载的问题,但是着实有点难便放弃了,功能代码有一点,有兴趣的同学可以看看:
View Code
1 2 3 45 86 87 88 159 160 161 162 点击按钮出现下拉菜单163 164 165 166 167 滑动按钮出现下拉菜单168 169 170 171 172 点击文本出现下拉菜单173 174 175 176 177 185 186 187 188 189 /// 190 191 192 var DropList = function (opts) {193 this.id = opts.id || '';194 //组件容器195 this.container = $('#' + this.id);196 //确定点击/滑动元素为按钮或者文本框(button/text)197 this.toggleType = opts.toggleType || 'button';198 this.toggleText = opts.toggleText || '请点击我';199 //展开方式(点击/滑动)200 this.openType = opts.openType || 'click';201 this.drop_items = opts.drop_items || [];202 this.loadData = opts.loadData;203 this.func = opts.func;204 205 if (this.drop_items && this.drop_items[0]) {206 this.init();207 this.eventBind();208 } else {209 if (this.loadData && typeof this.loadData == 'function') {210 this.asyncLoad();211 }212 }213 };214 215 DropList.prototype.initBtn = function () {216 var scope = this;217 var container = scope.container;218 var openType = scope.openType;219 var toggleType = scope.toggleType;220 var toggleText = scope.toggleText;221 var toggleEl = '';222 if (toggleType == 'button') {223 toggleEl = '' + toggleText + '';224 } else {225 toggleEl = '';226 }227 //获得点击元素用以添加事件228 scope.toggleEl = $(toggleEl);229 container.append(scope.toggleEl);230 };231 232 DropList.prototype.initDropItems = function () {233 var scope = this;234 var container = scope.container;235 //组装下拉元素236 var drop_items = scope.drop_items;237 var item_container = $('
所以先贴出来和各位看看,后续小生再行优化,希望能把这个功能做好!