js插件的经典写法与总结
2015-11-25 11:56
483 查看
之前写了一篇关于js插件的方法,可以传入参数,当时不能够拓展方法,而且模式也不是很好,虽然能够满足一定的业务要求。下面是对js插件的完善,可以实现参数传入,方法拓展,链式操作,设计模式更加清晰。
<!DOCTYPE html> <html> <head> <title>js插件测试</title> <script type="text/javascript" src="./jquery.js"></script> </head> <body> <div style="width:200px;height:200px;border:1px solid;background:red" class="mydiv">测试</div> <script type="text/javascript"> (function($){ //定义在闭包函数中的全局变量,用来初始化参数,其他的所有函数可以调用 var config; //一些私有函数,相当于php类中private的私有方法,被主函数调用 var privateFunction = function(){ // 执行代码 console.log(arguments[0]); } //主函数包含在method中,对外暴露,可以被jquery的实例对象执行 var methods = { //初始化的函数,传入参数对象 init: function(options){ // 在每个元素上执行方法,同时返回该jqueryded的实例对象 // console.log(options); return this.each(function() { var $this = $(this); // console.log($this); // 尝试去获取settings,如果不存在,则返回“undefined” var settings = $this.data('pluginName'); // console.log(settings); // 如果获取settings失败,则根据options和default创建它 if(typeof(settings) == 'undefined'){ var defaults = { name:'zengbing', sex:'nan', onSomeEvent: function() {} }; settings = $.extend({}, defaults, options); // 保存我们新创建的settings $this.data('pluginName',settings); }else{ // 如果我们获取了settings,则将它和options进行合并(这不是必须的,你可以选择不这样做) settings = $.extend({}, settings, options); // 如果你想每次都保存options,可以添加下面代码: $this.data('pluginName', settings); } //将该配置参数赋值全局变量,方便其他函数调用 config=settings; // 执行私有的方法,完成相关逻辑任务 // privateFunction(config.name); }); }, //销毁缓存的变量 destroy: function(options) { // 在每个元素中执行代码 return $(this).each(function() { var $this = $(this); // 执行代码 // 删除元素对应的数据 $this.removeData('pluginName'); }); }, //其他的主题函数。可以完成对象的其他操作 val: function(options1,options2,options3) { // 这里的代码通过.eq(0)来获取选择器中的第一个元素的,我们或获取它的HTML内容作为我们的返回值 var someValue = this.eq(0).html(); // 返回值 console.log(arguments); return someValue; }, getContent: function(){ return this.each(function(){ var content=$(this).text(); console.log(content); //获取全局变量的初始化的值 console.log(config.sex) }); } }; $.fn.pluginName = function(){ var method = arguments[0]; if(methods[method]) { method = methods[method]; //将含有length属性的数组获取从第下标为1的之后的数组元素,并返回数组 arguments = Array.prototype.slice.call(arguments,1); }else if( typeof(method) == 'object' || !method ){ method = methods.init; }else{ $.error( 'Method ' + method + ' does not exist on jQuery.pluginName' ); return this; } //jquery的实例对象将拥有执行method的能力,method的this是指jquery的实例对象 return method.apply(this,arguments); } })(jQuery); //用法实例 var config={ name:'huang', sex:'nv' }; //先初始化参数配置,在执行各个主体函数,函数中可以调用config的变量,其实就是jquery的链式操作 $('div.mydiv').pluginName(config).pluginName('getContent').pluginName('val','bing'); </script> </body> </html>
相关文章推荐
- 返回Json数据浏览器带上<pre></pre>标签解决方法
- js 连接地址分析
- javascript下ie7,ie8的Date Bug的解决
- JavaScript的this词法(二)
- javascript 基础教程[温故而知新一]
- WCF 自托管、无配置文件实现jsonp(跨域)的访问
- highChartsjs饼状图
- ExtJS中的全局变量的保存和使用
- DIV滚动条到底部判断且自动加载,到上限更多选项
- JSON
- javascript定义对象写法
- [javascript]DOM基础
- jsp内置对象作业2-留言簿
- JavaScript设置组件不可见三种方式:display、visibility、opacity
- js两种post方法
- 使用flot.js 发现x轴y轴无法显示轴名称
- JavaScript的作用域链的理解
- javascript图片预加载
- HTML5播放器 MediaElement.js 使用方法
- javascript实现的中国象棋单机双人