【jQuery】结合accordion插件分析写插件的方法及注意事项
1.jQuery插件的命名方式:jquery.[插件名].js
2.对象方法附加在jQuery.fn上,全局函数附加在jQuery对象本身上
3.插件内部this指向的是通过选择器获取的jQuery对象
4.结尾加分号,插件头部最好也加分号
5.插件应该返回一个jQuery对象,保证插件的链式操作
6.插件内部应用完整的jQuery而不是$,但可以利用闭包,将jQuery传入,使插件内部可以继续使用$符合作为jQuery别名
7.闭包另一大好处:可以避免内部变量影响全局空间
;(function($){
})(jQuery);//jQuery作为实参传递给$
红色的()代表运算符,执行绿色的括号()
8.jQuery.extend()方法:扩展jQuery对象、扩展已有的object对象
9.jQuery.extend()方法常用于设置插件方法的一系列默认参数,可以很方便的用传入的参数来覆盖默认值。
10.jQuery的选择符可能会匹配一个或多个元素,所以写插件时,可以用each()方法遍历元素,然后执行相应的方法,this.each(。。)this会依次引用每个DOM元素
采用UMD: 通用模块规范:
参考:http://web.jobbole.com/82238/
既然CommonJs和AMD风格一样流行,似乎缺少一个统一的规范。所以人们产生了这样的需求,希望有支持两种风格的“通用”模式,于是通用模块规范(UMD)诞生了。不得不承认,这个模式略难看,但是它兼容了AMD和CommonJS,同时还支持老式的“全局”变量规范:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// Node, CommonJS之类的
module.exports = factory(require('jquery'));
} else {
// 浏览器全局变量(root 即 window)
root.returnExports = factory(root.jQuery);
}
}(this, function ($) {
// 方法
function myFunc(){}; // 暴露公共方法
return myFunc;
}));
接下来结合注释分析jQuery手风琴插件:
;(function (factory) {
if (typeof define === "function" && (define.amd || define.cmd) && !jQuery) {
// AMD或CMD
define([ "jquery" ],factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(root);
}
}
factory(jQuery);//将jQuery作为实参传递给factory函数,在factory中就可以使用$符号了
return jQuery;
};
} else {
//Browser globals
factory(jQuery);
}
}(function ($) {//function(factory){。。。}(function($){xxx})立即执行,
//function($){xxx}这个函数将作为参数传递给factory,不直接写在里面,是因为要兼容不同的模式,提高代码复用性,否则得写三次
//function(factory){}(),这个()是运算符,执行这个函数 ,
//利用闭包(函数中的函数),可以继续使用$符号
$.fn.accordion = function(parameter,getApi) {//对象方法要附加到jQuery.fn对象上
if(typeof parameter == 'function'){ //重载
getApi = parameter;
parameter = {};//只传入了一个参数,且这个参数对应的是getApi
}else{
parameter = parameter || {};//传入两个参数的情形
getApi = getApi||function(){};
}
var defaults = {
triggerCls: "trigger", //主列表的class值
panelCls: "panel", //列表所对应的内容列表的class值
activeCls: "active", //导航选中时的class
triggerType: 'mouse', //切换时的触发事件
activeIndex: 0, //默认选中导航项的索引
multiple: false, //是否同时支持多面板展开
animate: false, //是否开启动画
duration:500, //动画开启时长
beforeEvent: function() { //切换前执行,返回flase时不移动;传入一个对象,包含:target当前导航项对象,tabs导航列表对象,panels内容列表对象,index当前导航项索引,event事件对象;
},
afterEvent: function() { //切换后执行;传入一个对象,包含:target当前导航项对象,tabs导航列表对象,panels内容列表对象,index当前导航项索引,event事件对象;
}
};
var options = $.extend({}, defaults, parameter);//jQuery除了可以扩展jQuery对象外,还可以扩展object对象
//用defaults, parameter对象扩展{}
//结果是options合并了这两个对象
//$.extend()经常用于设置插件方法的一系列默认参数
//这里defaults就是默认参数,parameter是传递的参数,传递的参数会覆盖默认参数
return this.each(function() {//调用each()遍历选中的元素,且返回jQuery对象
//对象定义
var $this = $(this);
var $triggers = $this.find("." + options.triggerCls);
var $panels = $this.find("." + options.panelCls);
//全局变量
var _api = {};
options.triggerType += options.triggerType === "mouse" ? "enter" : ""; //使用mouseenter防止事件冒泡,先执行===
//函数
_api.select = function(i,animate){
var animate = animate==false?animate:options.animate;
if(options.multiple){
if(animate){
$panels.eq(i).slideToggle(options.duration);
}else{
$panels.eq(i).toggle(options.duration);
}
$triggers.eq(i).toggleClass(options.activeCls);
}else{
if(animate){
$panels.not(':eq('+i+')').slideUp(options.duration);
$panels.eq(i).slideDown(options.duration);
}else{
$panels.not(':eq('+i+')').hide();
$panels.eq(i).show();
}
$triggers.removeClass(options.activeCls).eq(i).addClass(options.activeCls);
}
};
//初始化
_api.select(options.activeIndex,false);
$triggers.bind(options.triggerType, function(e) { //事件绑定
var i = $triggers.index($(this));
var status = {
target:$this,
triggers:$triggers,
panels:$panels,
index:i,
event:e
};
if(options.beforeEvent(status)!=false){
_api.select(i);
options.afterEvent(status);
}
});
getApi(_api);
});
};
}));
【jQuery】结合accordion插件分析写插件的方法及注意事项的更多相关文章
- 文件的上传/下载+在线游览(转化html)--不需要在线插件//自己写的小方法
1 /// <summary> 2 /// 文件上传下载帮助类 3 /// </summary> 4 public static class FileHelper 5 { 6 ...
- 自己动手写插件底层篇—基于jquery移动插件实现
序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...
- 自己写jquery插件之模版插件高级篇(一)
需求场景 最近项目改版中,发现很多地方有这样一个操作(见下图gif动画演示),很多地方都有用到.这里不讨论它的用户体验怎么样. 仅仅是从复用的角度,如果每个页面都去写text和select元素,两个b ...
- 为jQuery写插件
很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成sl ...
- 关于jQuery写插件及其演示
关于写jQuery插件是非常有必要的.这是前端学习其中必须经过的一个过程 对于初次写插件先想清楚原理 (function($){ $.fn.yourName = function(opt ...
- [jQuery插件]手写一个图片懒加载实现
教你做图片懒加载插件 那一年 那一年,我还年轻 刚接手一个ASP.NET MVC 的 web 项目, (C#/jQuery/Bootstrap) 并没有做 web 的经验,没有预留学习时间, (作为项 ...
- 使用jQuery开发accordion手风琴插件
一.插件效果 手风琴插件常用的功能均已实现,包括:手风琴菜单项的折叠展开效果.选中指定菜单项.判断菜单项是否选中等. 效果如下: 二.插件内部HTML元素结构 <!-- accordioon组件 ...
- JQuery 树状结构 jQuery-treeview.js 插件
由简入繁实现Jquery树状结构 在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一 ...
- ztreeDeptSelect 基于jquery和ztree的部门选择插件
插件介绍 首先我们来看插件的功能演示(效果): 插件准备好后.前台只需编写html: <input type="text" class="deptName" ...
随机推荐
- hdu 3415 Max Sum of Max-K-sub-sequence 单调队列。
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- Code Signal_练习题_palindromeRearranging
Given a string, find out if its characters can be rearranged to form a palindrome. Example For input ...
- nodejs报错 XMLHttpRequest cannot load localhost:3000/test_date/. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
z在请求本地的时候 如果ajax的URL 前面没有http的话 就会报错 jq.js:2 XMLHttpRequest cannot load localhost:3000/test_date/. ...
- 20个实用便捷的CSS3工具、库及实例
编者按:坊间传闻,有本CSS的高手炼成秘籍在江湖失传已久,书中所载,多为最新的惊人技术与实例示范,是为集大成者,一旦学成,代码效率猛增,功力提升数倍,今日偶获,不敢怠慢,赶紧发到优设,望人人受益.说人 ...
- html5 表单 填表 select 下拉 textarea多行文本 output Js计算结果
<select> 下拉 <select>下有很多属性 name 其实有name就有value了,因为button提交的都是? name=value的格式, ...
- Vuex2.0边学边记+两个小例子
最近在研究Vuex2.0,搞了好几天终于有点头绪了. 首先vuex概念比较多,一定要搞懂里面的概念,可以参考官网Vuex2.0概念,我写此文的目的是希望能对前端爱好者提供个参考,加深对vuex2.0各 ...
- Jarvis OJ-Reverse题目Writeup
做一道更一道吧233333 DD-Android Easy 下载apk,先安装一下试试吧…… 猜测是输入正确的内容后给flag吧 将后缀改成zip,解压,用dex2jar处理classes.dex,然 ...
- golang开发不错的参考资料
https://golangbot.com/learn-golang-series/ https://gist.github.com/ivangabriele/1c552aadc247c0a2f256 ...
- Python学习---基于JQuery的Ajax实现[快捷+底层$.ajax]
快捷API <1>$.get(url, [data], [callback], [type]) <2>$.post(url, [data], [callback], [type ...
- c#listbox使用详解和常见问题解决
关于ListBox ListBox是WinForm中的 列表 控件,它提供了一个项目列表(一组数据项),用户可以选择一个或者多个条目,当列表项目过多时,ListBox会自动添加滚动条,使用户可以滚动查 ...