js中组件的开发实例

一个组件开发的例子:

来源:http://www.cnblogs.com/uedqd/archive/2013/02/23/2923099.html

先上代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
.tabs input.active{ background:red; }
.tabs div{ width:200px; height:200px; border:1px #000 solid; display:none;}
</style>
<script type="text/javascript" src="jquery-2.1.4.min.js"></script>
<script>

$(function(){
    var t1 = new CreateTab();
    t1.init({
        id : ‘div1‘
    });
    var t2 = new CreateTab();
    t2.init({
        id : ‘div2‘,
        events : ‘mouseover‘
    });
    var t3 = new CreateTab();
    t3.init({
        id : ‘div3‘,
        events : ‘mouseover‘,
        delay : 300
    });

    $(‘#input1‘).click(function(){
        t3.select(2);
        alert( t3.currentContent() );
    });

    var t4 = new CreateTab();
    t4.init({
        id : ‘div4‘,
        events : ‘click‘
    });
    $(t4).on(‘toBeforeChange‘,function(){       //使用on绑定事件,jquery1.8之后使用on绑定事件,来替代bind等方法,解除事件使用off
        alert( t4.currentContent() );
    });
    $(t4).on(‘toChange‘,function(){
        //alert( t4.currentContent() );
        alert( t4.currentTitle() );
    });

    $.extend(CreateTab.prototype,{   //插件扩展
        currentTitle : function(){
            return $(this.id).find(‘input‘).eq( this.iNow ).val();
        }
    });

});

function CreateTab(){  //组件开发
    this.id = null;             //构造函数设置属性
    this.aInput = null;
    this.aDiv = null;
    this.iNow = 0;
    this.defaults = {
        events : ‘click‘,
        delay : 0
    };
}
CreateTab.prototype = {             //原型方法定义可以继承的方法
    init : function(options){
        var This = this;                //将当前作用域的this(实例对象t1,t2...)赋予This,下面调用时在另一个函数内,this的值改变
        options = $.extend(this.defaults,options);      //extend使options对象的内容覆盖this.defaults的内容,events与delay有初始值
         //console.log(this);           输出id为null的对象t1,t2...
        this.id = ‘#‘ + options.id;
          //console.log(this);          id为对应的值
        $(this.id).find(‘input‘).on(options.events,function(){
            var obj = this;                                         //指代input元素
            if(options.events==‘mouseover‘ && options.delay){       //event事件为mouseover且有delay时
                obj.timer = setTimeout(function(){
                    This.change(obj);                   //相当于t1.change,t2.change....下面的change方法实现选项卡功能
                },options.delay);

                $(obj).mouseout(function(){
                    clearTimeout(obj.timer);
                });
            }
            else{
                This.change(obj);
            }

        });
    },
    change : function(obj){

        $(this).trigger(‘toBeforeChange‘);              //触发上面使用on绑定的event
        //console.log(this);            输出id有值
        $(this.id).find(‘input‘).attr(‘class‘,‘‘);
        $(this.id).find(‘div‘).css(‘display‘,‘none‘);

        $(obj).attr(‘class‘,‘active‘);
        $(this.id).find(‘div‘).eq( $(obj).index() ).css(‘display‘,‘block‘);    //index()返回dom或jqeury元素的序号

        this.iNow = $(obj).index();                 

        $(this).trigger(‘toChange‘);

    },
    select : function(index){
        $(this.id).find(‘input‘).attr(‘class‘,‘‘);
        $(this.id).find(‘div‘).css(‘display‘,‘none‘);

        $(this.id).find(‘input‘).eq(index).attr(‘class‘,‘active‘);
        $(this.id).find(‘div‘).eq(index).css(‘display‘,‘block‘);    

        this.iNow = index;

    },
    currentContent : function(){
        return $(this.id).find(‘div‘).eq( this.iNow ).html();
    }
};
</script>
</head>

<body>
<div id="div1" class="tabs">
    <input class="active" type="button" value="1" />
    <input type="button" value="2" />
    <input type="button" value="3" />
    <div style="display:block">111</div>
    <div>222</div>
    <div>333</div>
</div>
<div id="div2" class="tabs">
    <input class="active" type="button" value="1" />
    <input type="button" value="2" />
    <input type="button" value="3" />
    <div style="display:block">111</div>
    <div>222</div>
    <div>333</div>
</div>
<div id="div3" class="tabs">
    <input class="active" type="button" value="1" />
    <input type="button" value="2" />
    <input type="button" value="3" />
    <div style="display:block">111</div>
    <div>222</div>
    <div>333</div>
</div>

<input type="button" id="input1" value="方法测试" />

<div id="div4" class="tabs">
    <input class="active" type="button" value="1" />
    <input type="button" value="2" />
    <input type="button" value="3" />
    <div style="display:block">111</div>
    <div>222</div>
    <div>333</div>
</div>

</body>
</html>

有几个部分:

 1  init : function(options){
 2         var This = this;                //将当前作用域的this(实例对象t1,t2...)赋予This,下面调用时在另一个函数内,this的值改变
 3         options = $.extend(this.defaults,options);      //extend使options对象的内容覆盖this.defaults的内容,events与delay有初始值
 4          //console.log(this);           输出id为null的对象t1,t2...
 5         this.id = ‘#‘ + options.id;
 6           //console.log(this);          id为对应的值
 7         $(this.id).find(‘input‘).on(options.events,function(){
 8             var obj = this;                                         //指代input元素
 9             if(options.events==‘mouseover‘ && options.delay){       //event事件为mouseover且有delay时
10                 obj.timer = setTimeout(function(){
11                     This.change(obj);                   //相当于t1.change,t2.change....下面的change方法实现选项卡功能
12                 },options.delay);

init方法传递参数给对象

1、第2行中,将this的值赋予This,防止下面的函数中this的值改变,通过在该行添加console.log观察this的值,可知:

第5行给没有id的对象赋值,重新打印出结果,发现id不为null:

2、第8行,this的值为input元素,因为作用域的问题,This仍可以在其子函数中使用,且这里的This id不为空,调用方法change

1 change : function(obj){
2
3         $(this).trigger(‘toBeforeChange‘);              //触发上面使用on绑定的event
4         //console.log(this);            输出id有值
5         $(this.id).find(‘input‘).attr(‘class‘,‘‘);
6         $(this.id).find(‘div‘).css(‘display‘,‘none‘);

change方法中的this指向对象的实例,t1,t2....,init方法已经传递参数给对象,方法取得对象都是有id值的:

 $.extend(CreateTab.prototype,{   //插件扩展
        currentTitle : function(){
            return $(this.id).find(‘input‘).eq( this.iNow ).val();
        }
    });
    /*CreateTab.prototype.currentTitle= function(){
        return $(this.id).find("input").eq(this.iNow).val();
    }*/

插件扩展部分例子中采用了jquery的方法,也可以使用注释中的源生js添加原型方法

时间: 2024-11-05 10:28:52

js中组件的开发实例的相关文章

组件方式开发实例

/* 基本图文组件对象 */ var H5ComponentBase =function ( name, cfg ) { var cfg = cfg || {}; var id = ( 'h5_c_'+Math.random() ).replace('.','_') ; // 把当前的组建类型添加到样式中进行标记 var cls = ' h5_component_'+cfg.type; var component = $(' '); cfg.text && component.text(c

关于JS中变量的作用域-实例

先看问题,如下,自己运行一下吧! if (!('_qyzA' in window)) { var _qyzA = 1; } alert(_qyzA);//undefined 分析:首先,所有的全局变量都是window的属性,如var _qyzA = 1;等价于window._qyzA = 1;其次,所有的变量的声明都在作用域的顶部,如alert("_qyzA"); var _qyzA;相当于var _qyzA;alert("_qyzA");这是由于JavaScrip

Vue.js之组件嵌套

Vue.js中组件嵌套有两种方式 第一种:注册全局组件 例如在components文件夹下新建一个User.vue组件,然后在main.js文件中注册全局组件 1 //注册全局组件 2 Vue.component("users",Users); //前面的users是我们起的名字,后面的Users是我们对应的组件,想要识别这个组件,必须在上面通过import引入, 3 //引入组件 4 import Users from './components/Users' 有了全局组件的话,就可

[js开源组件开发]network异步请求ajax的扩展

network异步请求ajax的扩展 在日常的应用中,你可能直接调用$.ajax是会有些问题的,比如说用户的重复点击,比如说我只希望它成功提交一次后就不能再提交,比如说我希望有个正在提交的loading效果.所以我做network这个组件来扩展$.ajax,希望全中国的人民们喜欢. 这里使用到了上篇[js开源组件开发]loading加载效果 一个loading效果,但为了让它独立运行,所以没有进行引用,而是直接做了一个loading方法在里面.它的具体效果图如下: 它的实例DEMO地址请点击这里

vuex在组件化开发中的简单应用小例子

首先, 介绍一下vuex是个什么东西, 个人理解来说, vuex就是一个状态管理的东西, 它里面有且仅有一个Store仓库, 这个仓库里面存放着一些变量, 为什么要有这么一个变量呢, 用过vue的人肯定都清除, 父子组件之间的通讯传值是个比较麻烦的事情, 特别是, 嵌套组件特别多的时候, 这种情况下, 一级一级地传递下去十分麻烦, 还有就是兄弟组件之间的传值也一样麻烦. 而vuex中的Store这个仓库, 就能够为我们将放在这个仓库中的值, 分发给整个项目下的所有组件, 也就是说是, 不用一级一

微信小程序image组件binderror使用例子(对应html、js中的onerror)

官方文档  binderror HandleEvent 当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: 'something wrong'} 在微信小程序开发中,我们使用列表包含图片,如果这个图片链接404错误,那么我们应该给它提供一个默认的友好URL地址.html和js中使用onerror事件就可以了 <img src="image.gif" onerror="this.src='https:w.chesu

js架构设计模式——理解javascript中的MVVM开发模式

理解javascript中的MVVM开发模式 http://blog.csdn.net/slalx/article/details/7856769 MVVM的全称是Model View ViewModel,这种架构模式最初是由微软的MartinFowler作为微软软件的展现层设计模式的规范提出,它是MVC模式的衍生物,MVVM模式的关注点在能够支持事件驱动的UI开发平台,例如HTML5,[2][3] WindowsPresentation Foundation (WPF), Silverligh

[js开源组件开发]localStorage-cache本地存储的缓存管理

localStorage-cache本地存储的缓存管理 距离上次的组件开发有近三个月的时间了,最近一直在做一些杂事,无法静下心来写写代码,也是在学习emberjs,在emberjs中有一个很重要的东西 -- localstorage_adapter,本地存储适配器,利用它可以很方便的把数据保存在本地的localStorage中,但我今天要讲的,并不是ember,也不是适配器,我是个比较念旧的人,所以我对cookie很情有独钟,当然,cookie也会有各种问题,于是我就来改造下localStora

VUe.js 父组件向子组件中传值及方法

父组件向子组件中传值 1.  Vue实例可以看做是大的组件,那么在其内部定义的私有组件与这个实例之间就出现了父子组件的对应关系. 2. 父子组件在默认的情况下,子组件是无妨访问到父组件中的数据的,所以要想在子组件中使用父组件的数据的时候,就需要以属性绑定的形式,将父组件的数据传递到子组件中.     3. 通过属性绑定传递来的数据无法再子组件中直接使用,需要在props中重新定义以后才可以使用.例:props:['变量名'].props是一个数组.    4. 子组件中的data数据都是私有,子