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插件分析写插件的方法及注意事项的更多相关文章

  1. 文件的上传/下载+在线游览(转化html)--不需要在线插件//自己写的小方法

    1 /// <summary> 2 /// 文件上传下载帮助类 3 /// </summary> 4 public static class FileHelper 5 { 6 ...

  2. 自己动手写插件底层篇—基于jquery移动插件实现

    序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...

  3. 自己写jquery插件之模版插件高级篇(一)

    需求场景 最近项目改版中,发现很多地方有这样一个操作(见下图gif动画演示),很多地方都有用到.这里不讨论它的用户体验怎么样. 仅仅是从复用的角度,如果每个页面都去写text和select元素,两个b ...

  4. 为jQuery写插件

    很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成sl ...

  5. 关于jQuery写插件及其演示

    关于写jQuery插件是非常有必要的.这是前端学习其中必须经过的一个过程 对于初次写插件先想清楚原理       (function($){  $.fn.yourName = function(opt ...

  6. [jQuery插件]手写一个图片懒加载实现

    教你做图片懒加载插件 那一年 那一年,我还年轻 刚接手一个ASP.NET MVC 的 web 项目, (C#/jQuery/Bootstrap) 并没有做 web 的经验,没有预留学习时间, (作为项 ...

  7. 使用jQuery开发accordion手风琴插件

    一.插件效果 手风琴插件常用的功能均已实现,包括:手风琴菜单项的折叠展开效果.选中指定菜单项.判断菜单项是否选中等. 效果如下: 二.插件内部HTML元素结构 <!-- accordioon组件 ...

  8. JQuery 树状结构 jQuery-treeview.js 插件

    由简入繁实现Jquery树状结构 在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一 ...

  9. ztreeDeptSelect 基于jquery和ztree的部门选择插件

    插件介绍 首先我们来看插件的功能演示(效果): 插件准备好后.前台只需编写html: <input type="text" class="deptName" ...

随机推荐

  1. Java - 枚举与注解

    Enumeration 于Java 1.5增加的enum type... enum type是由一组固定的常量组成的类型,比如四个季节.扑克花色. 在出现enum type之前,通常用一组int常量表 ...

  2. mybatis 排坑记录

    1. mapper xml resultMap 中定义 property 时不能出现空格 否则会出现反射错误,找不到 do 对应的 set 方法

  3. SQL索引优化及实战文章总结(总结)

    1. MySQL索引原理以及查询优化 2.

  4. python循环删除列表里的元素!漏删!

    li = [1,2,3,4,5,6] for i in li: if i<3: li.remove(i) print(li) #输出的结果是 [2,3,4,5,6]    2没有remove掉 ...

  5. git基础命令。

    创建一个新的本地仓库    git init 克隆远程服务器    git clone URL 打开一个文件夹   cd 添加文件   git add . 本地提交更改   git commit -m ...

  6. 远景GIS云上线

    没有发布会.没有嘉宾.没有掌声,趁着国庆假期悄悄地将系统部署到服务器上线运行. 远景GIS云(RGIS Cloud)基于自主研发的远景GIS基础平台开发,目前已实现了Shape上传和导出.符号配置.动 ...

  7. ArcGIS最权威、最专业的技术分享网站:积思园(www.iarcgis.com)

    你对iArcGIS.com说点什么 为什么会有该网站的产生 在这个所谓的“大数据”的时代,每个人都深陷于海量信息无法自拔,因为过多碎片化的数据只会让自己的思维更加迷离,快餐式的阅读只会让自己变得虚胖. ...

  8. 用Jmeter进行接口测试及乱码问题

    web接口测试工具: 手工测试的话可以用postman ,自动化测试多是用到 Jmeter(开源).soupUI(开源&商业版). 下面将对前一篇Postman做接口测试中的接口用Jmeter ...

  9. 【转】OmniGraffle (一)从工具栏开始

    原文链接:http://www.jianshu.com/p/52f3ecbe8f2d OmniGraffle的软件布局和大多数图形类软件类似,中间是编辑区,左边是页面和对象组织的管理,右边是参数设置和 ...

  10. Spring IOC (DI-依赖注入)

    看到一篇文章,讲Spring的依赖注入讲的很好理解,也很容易理解,非常详细.原文地址: https://blog.csdn.net/javazejian/article/details/5456130 ...