jQuery插件编程实践(Step1)
相应代码
1、bootstrap/3.3.7/bootstrap.css
2、site.css
3、bootstrap.min.js
4、jquery-3.3.1.js
5、tag_list.js
6、index.html
第一阶段,实现DOM节点在页面显示,效果图如下,这个2个tag是用本次自定义jQuery插件显示的。
代码风格参考之 jQuery pagination plugin v1.4.2
1、 index.html
<div class="row"> <div id="tagList"></div> </div> .... <script type="text/javascript"> //运行插件 $(function () { $('#tagList').tagsPagination({ startPage: 1 }); }) </script>
2、 tag_list.js
1 //参考jquery.twbsPagination 怎样设计一个插件。小括号,里面声明一个function,之后用子运行模式执行 2 (function ($, window, document, undefined) { 3 'use strict'; 4 var TagsPagination = function(element,options){ 5 this.$element = $(element); //将插件初始化时传入的html dom对象转jQuery对象,这里是div,拿到这个对象很重要,之后就可以基于它做很多事情 6 7 //定义对象基本设置参数对象,合并2个对象到第一个对象 8 this.options = $.extend({}, $.fn.tagsPagination.defaults, options);//设计模式,参数处理 9 10 var tagName = (typeof this.$element.prop === 'function') ? 11 this.$element.prop('tagName') : this.$element.attr('tagName'); 12 13 //访问页面上的HTML DOM对象 14 // var t = this.$element.first(); 15 // console.info(t); 16 this.$listContainer = this.$element;//赋值基本属性$listContainer,容器对象 17 18 //this.show(); 19 //1.绚烂插件对象的DOM,并将绚烂的结果用append方法追加到由参数传入的dom对象上去 20 this.render(this.getPages(this.options.startPage));//getPages在下面prototyp链中定义 21 return this;//编程模式,不影响DOM显示 22 }; 23 //基本设计模式,在大括号内定义,对TagsPagination原型链进行编程 24 TagsPagination.prototype = { 25 constructor: TagsPagination, 26 //销毁jQuery对象 27 destroy:function () { 28 29 }, 30 show:function() { 31 32 }, 33 //render相关基础function, 绚烂所有的tag标签,返回数组类型 34 _buildListItems: function (pages) { 35 var listItems = []; 36 for(var i = 0; i < pages.tags.length; i++){ 37 listItems.push(this._buildItem('page', pages.tags[i])); 38 } 39 return listItems; 40 }, 41 //render相关基础function 绚烂一个tag DOM标签,返回jQuery对象 42 _buildItem:function(type,tag) { 43 //绘制一个tag标签的dom节点 44 var $itemContainer = $('<div></div>'), $itemContent = $('<span></span>'); 45 // var $itemDelIcon = $('<span></span>'); 46 47 $itemContainer.addClass('tag_container'); 48 $itemContent.addClass('label label-default').html(tag); 49 // $itemDelIcon.addClass('glyphicon glyphicon-remove-circle'); 50 // $itemDelIcon.attr('aria-hidden',"true"); 51 // $itemContainer.append($itemContent).append($itemDelIcon); 52 $itemContainer.append($itemContent); 53 return $itemContainer; 54 }, 55 //render相关基础function 获取tag数据,怎样和ajax结合,返回结果传给render function 56 getPages: function (currentPage) { 57 //TODO Mock(模拟) 58 var tags = []; 59 tags.push("Default"); 60 tags.push("Primary"); 61 return {"currentPage": currentPage, "tags": tags}; 62 }, 63 //核心方法,在对象构造器中被调用 64 render: function (pages) { 65 var _this = this; 66 this.$listContainer.children().remove(); 67 var items = this._buildListItems(pages); 68 $.each(items, function (key, item) { 69 _this.$listContainer.append(item); 70 }); 71 72 } 73 } 74 75 //入口之一:开始定义插件模块,页面引用从这里加载执行 76 $.fn.tagsPagination = function(option){ 77 console.log("PLUGIN DEFINITION"); 78 var data = new TagsPagination(this, option);//调用自己定义的jQuery插件对象,之后就是思考怎样定义TagsPagination对象了 79 }; 80 //将自定义JS对象赋值给插件,感觉仅仅起到标识作用 81 //$.fn.tagsPagination.Constructor = TagsPagination; 82 83 })(window.jQuery, window, document);
//TODO 事件处理以及和ajax联动 jQuery插件编程实践(Step2)