js学习总结----选项卡封装

这个插件对应的html的结构如下 

<div class=‘box‘ id=‘tabFir‘>
        <ul id=‘tabOptions‘>
            <li class=‘select‘>页卡一</li>
            <li>页卡二</li>
            <li>页卡三</li>
        </ul>
        <div class=‘select‘>
            <div>1</div>
            <div>2</div>
            <div>3</div>
            <div>4</div>
        </div>
        <div>内容二</div>
        <div>内容三</div>
    </div>

版本1

//实现一个选项卡封装:我们可以分析出,只要多个选项卡的主体结构一样,那么每个实现的思想都是一样的,唯一不一样的就是最外层的盒子不一样

~function(){
    /*
        tabChange:封装一个选项卡的插件,只要大结构保持统一,以后实现选项卡的功能,只需要调取这个方法执行即可实现
        param:container当前要实现选项卡的这个容器
               defaultIndex:默认选中项的索引
    */
    function tabChange(container,defaultIndex){
        var tabFirst = utils.firstChild(container),oLis = utils.children(tabFirst);
        var divList = utils.children(container,"div");
        //让defaultIndex对应的页卡有选中的样式
        defaultIndex = defaultIndex || 0;
        utils.addClass(oLis[defaultIndex],"select");
        utils.addClass(divList[defaultIndex],"select");
        //具体的切换功能
        for(var i = 0;i<oLis.length;i++){
            oLis[i].onclick = function(){
                utils.addClass(this,"select");
                var curSiblings = utils.siblings(this);
                for(var i = 0;i<curSiblings.length;i++){
                    utils.removeClass(curSiblings[i],"select")
                }
                var index = utils.index(this);
                for(var i = 0;i<divList.length;i++){
                    i===index ? utils.addClass(divList[i],"select") : utils.removeClass(divList[i],"select")
                }
            }
        }

    }
    window.fTab = tabChange

}()

版本2(将for循环改为使用事件委托的方式)

//实现一个选项卡封装:我们可以分析出,只要多个选项卡的主体结构一样,那么每个实现的思想都是一样的,唯一不一样的就是最外层的盒子不一样

~function(){
    /*
        tabChange:封装一个选项卡的插件,只要大结构保持统一,以后实现选项卡的功能,只需要调取这个方法执行即可实现
        param:container当前要实现选项卡的这个容器
               defaultIndex:默认选中项的索引
    */
    function tabChange(container,defaultIndex){
        var tabFirst = utils.firstChild(container),oLis = utils.children(tabFirst);
        var divList = utils.children(container,"div");
        //让defaultIndex对应的页卡有选中的样式
        defaultIndex = defaultIndex || 0;
        utils.addClass(oLis[defaultIndex],"select");
        utils.addClass(divList[defaultIndex],"select");
        //具体的切换功能

        //使用事件委托优化
        tabFirst.onclick = function(e){
            e = e || window.event;
            e.target = e.target || e.srcElement;
            if(e.target.tagName.toLowercase()==="li"){//说明当前点击的是li标签
                detailFn.call(e.target,oLis,divList);

            }
        }
    }
    function detailFn(oLis,divList){
        var index = utils.index(this);
        utils.addClass(this,"select");
        for(var i = 0;i<oLis.length;i++){
            i!==index?utils.removeClass(oLis[i],"select"):null;
            i===index ? utils.addClass(divList[i],"select") : utils.removeClass(divList[i],"select");
        }
    }
    window.fTab = tabChange

}()

版本3:面向对象的方式,使用构造函数

//实现一个选项卡封装:我们可以分析出,只要多个选项卡的主体结构一样,那么每个实现的思想都是一样的,唯一不一样的就是最外层的盒子不一样

~function(){
    /*
        tabChange:封装一个选项卡的插件,只要大结构保持统一,以后实现选项卡的功能,只需要调取这个方法执行即可实现
        param:container当前要实现选项卡的这个容器
               defaultIndex:默认选中项的索引
    */

    function TabChange(container,defaultIndex){
        this.init(container,defaultIndex);

    }
    TabChange.prototype = {
        constructor:TabChange,//注意重写原型方法,需要重新指定构造器
        //初始化 ,也是当前插件的唯一入口
        init:function(container,defaultIndex){
            this.container = container || null;
            this.defaultIndex = defaultIndex || 0;
            this.tabFirst = utils.firstChild(this.container);
            this.oLis = utils.children(this.tabFirst);
            this.divList = utils.children(this.container,"div");

            this.defaultIndexEven();
            this.liveClick();
            return this;
        },
        //事件委托实现绑定切换
        liveClick:function(){
            var _this = this;
            this.tabFirst.onclick = function(e){
                e = e || window.event;
                e.target = e.target || e.srcElement;
                if(e.target.tagName.toLowercase()==="li"){//说明当前点击的是li标签
                    _this.detailFn(e.target);

                }
            }
        },
        detailFn:function(curEle){
            var index = utils.index(curEle);
            utils.addClass(curEle,"select");
            for(var i = 0;i<this.oLis.length;i++){
                i!==index?utils.removeClass(this.oLis[i],"select"):null;
                i===index ? utils.addClass(this.divList[i],"select") : utils.removeClass(this.divList[i],"select");
            }
        },
        //按照索引来设置默认选中的页卡
        defaultIndexEven:function(){
            utils.addClass(this.oLis[this.defaultIndex],"select");
            utils.addClass(this.divList[this.defaultIndex],"select");
        }

    }
    window.fTab = TabChange

}()

//使用
var box1 = new fTab(boxList[0],0)
时间: 2024-08-03 01:46:07

js学习总结----选项卡封装的相关文章

JS学习笔记-OO疑问之封装

封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装.封装实现.封装变量,提高数据.系统安全性,封装正是面向对象的基础. 匿名函数 即没有名字的函数,其创建方式为 function(){...} 单独存在的匿名函数,无法运行,可通过赋值给变量调用或通过表达式自我执行来实现运行. 1.赋值给变量为一般的函数使用方式 var run = function(){ return '方法运行中'; }; alert(run()); 2.通过表达式自我执行 (function(a

JS学习笔记-OO疑问之对象创建

问一.引入工厂,解决重复代码 前面已经提到,JS中创建对象的方法,不难发现,基本的创建方法中,创建一个对象还算简单,如果创建多个类似的对象的话就会产生大量重复的代码. 解决:工厂模式方法(添加一个专门创建对象的方法,传入参数避免重复) function createObject(name,age){ var obj =new Object(); //创建对象 obj.name = name; obj.age = age; obj.run = function(){ return this.nam

js学习笔记知识点

AJAX用法安全限制JSONPCORS面向对象编程创建对象构造函数原型继承class继承 AJAX 用法 AJAX不是JavaScript的规范,它只是一个哥们"发明"的缩写:Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求 在现代浏览器上写AJAX主要依靠XMLHttpRequest对象: 'use strict'; function success(text) { var textarea = document.getE

Angular JS学习笔记

之前的学习方法有点盲目,建议以后只看与工作有关的内容,并且多问那些是只和工作有关联的. 遇到问题的时候,项目不急的话,自己研究,项目急的话,马上问. 方法不对,再努力也没有用. Angular JS学习网站:http://www.zouyesheng.com/angular.html#toc7 [  项目有关的内容 ] ng-model ng-click ng-options ng-repeat ng-if ng-show ng-hide ng-controller ng-href(有印象) {

【Knockout.js 学习体验之旅】(3)模板绑定

本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knockout.js 学习体验之旅](1)ko初体验 [Knockout.js 学习体验之旅](2)花式捆绑 [Knockout.js 学习体验之旅](3)模板绑定 模板引擎 页面是由数据和HTML组件构成的,如何将数据嵌入到HTML组件里面呢?一个比较好的选择是使用模板技术. 回顾下第一篇([Knock

Backbone.js学习之二

经历一段自我修炼,终于领悟到Backbone.js的关键知识点,也发现了原来MVC可以在前端这样梦幻的发挥,Backbone.js确实是一个很有魅力的前端MVC框架. 练就一门技术,需要有扎实的功底,从这点,开始认真研究Backbone.js的一些最基本的操作,以便我日后学习能更上一层楼.那就切入主题: 什么是mvc? 简单的理解就是:模型(models),视图(views),控制器(collections).通过视图把浏览器的网址传给控制器,控制器对网址进行解析,然后去模型层获取数据,模型层将

JS学习笔记-事件绑定

一.传统事件模型 传统事件模型中存在局限性. 内联模型以HTML标签属性的形式使用,与HTML混写,这种方式无疑造成了修改以及扩展的问题,已经很少使用了. 脚本模型是将事件处理函数写到js文件中,从页面获取元素进行对应事件函数的绑定以触发执行.但也存在不足之处: 1.一个事件绑定多个事件监听函数,后者将覆盖前者. 2.需要限制重复绑定的情况 3.标准化event对象 二.现代事件绑定 DOM2级事件定义了两个方法用于添加.删除事件:addEventListener().removeEventLi

JS运动中的封装的部分实用函数(框架)总结

JS运动中的封装的部分实用函数(框架)总结 前段时间学习JS运动时做的很实用的几个函数,应该可以称之为小的框架了,现在总结一下.为什么不当时就总结呢?我认为所谓总结不是趁着大脑中还残留着对新知识印象的时候将其写下来,而是过了一段时间之后再回头去看,将其重新拾起,这个时候一般会有对这些新东西的新看法和新的体会,我把这个过程称为"知识的发酵".对于我来说经过 "发酵"之后的带有自己的见解和体会东西才可以称之为总结. 下面分为几个版本来说,也反映了他们的进化过程,这几个函

Backbone.js学习之一

昨天一个我崇拜的朋友,徐飞送我一本名为<Backbone.js实战>书,让我心中狂喜,于是带着这份浓厚的兴趣,开始研究Backbone.js之路. 打开这本书的第一句话就很有哲理,“授人以鱼,不如授之以渔.”,我花了一段时间仔细的看完了的第一章节,今天通过自己所理解的, 记录下我自学的第一步.其他不多说,进入主题: 首先在学习Backbone.js之前要了解Backbone.js是什么? 在我看来它是一个处理前端MVC很好的js框架,Backbone是一个非常轻量级的javascript库,自