【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元素

接下来结合注释分析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);
        });
    };
}));
时间: 2024-10-13 16:01:30

【jQuery】结合accordion插件分析写插件的方法及注意事项的相关文章

为JQuery写插件

很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成slider,比起slider($('#slider'))更贴近jQuery的链式调用写法,可读性和通用性更好些. 那么,我们也来为jQuery写插件.便于项目中的组件化. 方法是非常简单的,那就写一个测试的demo来作为基础的验证吧. 定义html,假设我们要把test div修改成宽高都是200px,背景色为

给jQuery写插件的方法

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style> div div{ border:#ccc solid 1px; margin-bottom:2px;} </style> <title>无标题文档</title>

jquery写插件的几种写法总结(持续补充中)

1:jQuery.fn.extend(object);  给jQuery对象添加方法. js封装文件示例 $.fn.extend({ alertWhileClick:function(){ $(this).click(function(){ alert($(this).val()); }); } }); HTML中的js调用 $(“#input1″).alertWhileClick(); HTML代码 <input id=”input1″ type=”text”/> 2:jQuery.exte

使用jQuery开发accordion手风琴插件

一.插件效果 手风琴插件常用的功能均已实现,包括:手风琴菜单项的折叠展开效果.选中指定菜单项.判断菜单项是否选中等. 效果如下: 二.插件内部HTML元素结构 1 <!-- accordioon组件 --> 2 <ul class="accordion"> 3 <li accordion-id="menu1" class="active">插件使用</li> 4 <li> 5 <u

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

插件介绍 首先我们来看插件的功能演示(效果): 插件准备好后.前台只需编写html: <input type="text" class="deptName" /> 然后在javascript中渲染插件(代码使用jQuery写法): $(".deptName").ztreeDeptSelect(); 插件即渲染完成. 此插件已发布至github,源码地址: https://github.com/harveyhang/ztreeDeptS

jQuery 常用插件和UI插件 总结笔记

1. jQuery 常用插件 (1). 表单验证插件--validate 该插件自带包含必填.数字.URL在内容的验证规则,即时显示异常信息,此外,还允许自定义验证规则,插件调用方法如下:$(form).validate({options});其中form参数表示表单元素名称,options参数表示调用方法时的配置对象,所有的验证规则和异常信息显示的位置都在该对象中进行设置. Jquery Validate 验证规则 (1)required:true 必输字段 (2)remote:"check.

Jquery.validate.js表单验证插件的使用

作为一个网站web开发人员,以前居然不知道还有表单验证这样好呀的插件,还在一行行写表单验证,真是后悔没能早点知道他们的存在. 最近公司不忙,自己学习一些东西的时候,发现了validation的一个实例讲解应用.it's perfect. 首先记录一些使用过程中,爱犯的错误: 1>忘记给表单form添加id属性 2>input这些表单标签必须id属性和name属性名字一样.例如:<input type="text" id="name" name=&q

转载:基于jquery的bootstrap在线文本编辑器插件Summernote

基于jquery的bootstrap在线文本编辑器插件Summernote 转载:jQ酷 » 基于jquery的bootstrap在线文本编辑器插件Summernote Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Opera.Internet Explorer 9 +(IE8支持即将到来). 特点: 世界上最好的WYSIWYG在线编辑器 极易安装

有了这些chrome插件,写程序就像开了挂!

这些插件都是非常适合程序员小伙伴使用,希望可以帮助大家创一个小群,供大家学习交流聊天如果有对学python方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学python能够持之以恒python爱好群,如果你想要学好python最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织:快乐学习python组织 可以点击组织二字,可以直达1.Tampermonkey有了这些chrome插件,写程序就像开了挂!俗称"油猴&q