js写插件教程入门

原文地址:https://github.com/lianxiaozhuang/blog
转载请注明出处
 

1. 点击add能够添加个自input的内容到div里并实现变颜色javascript

 

 <div id="demo-1">
        <input  type="" name="" id="" value="好的" />     
        <button id="add-1">add</button>  
    </div>          
    <div id="demo-2">    
        <input  type="" name="" id="" value="11" />       
        <button id="add-2">add</button>   
    </div>  

 

整个插件写在一个当即执行函数里;就是 function(){ }(); 函数自执行;
保证里面的变量不会与外界互相影响,头部的win啊,doc啊 $ 啊
都是底部的window,document,jQuery的映射;方便内部直接调用;
固然你不引用jq的话头部的$和底部的jQuery干掉;你若引用了更过的依赖
能够依次添加;最后面的undefined可不写;最好写了,保证里面再出现
的undefined是未定义的意思;不被其余东西赋值。java

;(function(win,doc,$,undefined){

}(window,document,jQuery))


好了下面是时候展示真正的技术了
function前的 ;(分号) 这不是写错了,为了防止那个二货写的js结束没有分号;
而可能发生语法上的混淆报错;git

 

+function(){   }()
!function(){   }()
~function(){   }()
viod function(){   }()
(function(){   })()
(function(){   }())

function前的 +(加号或者 ! ~);能够把function 直接转换为可执行的;github

和用括号括起来同样的做用,由于!+-()这些符号的运算符是最高的,因此app

会把其后或者其中的当作表达式处理;故函数会自执行,而直接写function(){}() dom

会报错,function(){}只是匿名函数声明;而写 var b = function(){}; b()是能够的函数

;(function(win,doc,undefined){ 

var addHtml  = function(demo,btn){
    //插件名,调用的时候直接new一下插件名就好了并传参数或者传对象
    //(通常这个函数名手写字母大写比较好,构造函数嘛,其实也是函数)        
    //很明显我要传id名;这里传什么均可以的其实; 

        this.div = doc.getElementById(demo);
        //为何把获取的id传给this.div呢?this的指向为调用的实例;
        //咱们此时姑且认为this就指向这个函数;由于这样咱们以后再想获取这个
        //div就能够直接用this.div了好吗;而不是在document.getElementById(。。。。)  

        this.btn  = doc.getElementById(btn);       
        this.Input =  this.div.getElementsByTagName("input")[0];
        //既然找到了div咱们在找下div下面的input;固然你要不input用
        //获取id的形式传参数我没有意见      
        
        this.num = 0;
        //你也能够写一些其余的默认的东西;好比默认的变量啦;方便下面调用;
        //这里写了什么都不会报错;只是有用没用的问题这行能够忽略    

        this.author = "lianxiaozhuang";       
        this.init();
        //执行下你下面写的函数吧;你想一想;若是整个插件没有执行函数;
        //多很差;一堆方法function就不调用;对;这里是调用的时候最开始
        //执行的函数  
    }    
    
    //;给构造函数addHtml对象原型里添加属性(方法)   

    addHtml.prototype = {
        //给函数写方法;这里可能不止一个函数;你还记得你在全局里写一个个
        //的function吗;贼乱找也很差找;把一个个函数都写到对象的属性里;
        //调用函数就直接调用对象的属性; 

        constructor:addHtml,
        //构造器指向构造函数;这行其实不写没啥毛病;不过防止构造器
        //指向Object的状况;你仍是装逼写上吧; 由于当 addHtml.prototype = {}
        //的时候;把一个字面量的对象付给了他的原型上,而{}是由Object产生;
        //故此时addHtml的prototype指向了Object,因此要重新指向

        init:function(){
        //这里的init;你也能够写成  nimade:function(){ }都没有问题;
        //就是在addHtml函数里this.init();执行下;你明白了这里的this了吧;
        //整个插件里this都是只得这个函数(实例);除非你又引入了其余的函数里的
        //(其余函数里的可能指向就是window了)         

            var _self = this;
            ////把this保存下来防止在局部函数内部取不到(局部函数内部取得this可能
            //是别的)       
            this.btn.onclick = function(){             
                var _val = _self.Input.value;                 
                var tempdiv = doc.createElement("div");
                //建立临时div存放获取input的值              
                tempdiv.innerHTML = _val;                 //console.log(tempdiv);                 
                _self.div.appendChild(tempdiv);                                                
                _self.setColor();
                //你把全部方法都写在init里绝对没问题;仍是那句话;
                //说好的松耦合呢;说好的不写一堆堆的function一层层乱套呢         
            };                
        },    
        setColor:function(){            //console.log(this.div)    

            this.div.style.color= "red"      

        },
        /*        
        
        otherFun(){           
            
            //固然你还能够扩展其余方法;这些方法之间均可以互相调用;          
            //  只要用this.方法名就好了;若是在取不到this好比上面的click函数中的
            //this指向点击的button;只要在写var _self = this;就能够用_self 
            // 代替this(函数实例)了;固然_self  也能够写成别的 好比$this等自定义的   
            
        }
        
        */           
                                          }       
        win.addHtml = addHtml;
        //把这个对象附给window底下的 名字叫addHtml的对象;要不你调用的时候 
        // new addHtml() 怕在window的环境下找不到; 

}(window,document))
调用new addHtml("demo-1","add-1");//这里是实例1调用插件的代码
new addHtml("demo-2","add-2");    
//这里是实例2调用插件的代码    
//是否是明白为何要写插件了;要封装;两个相同组件即便有相同的class名在dom操做的时候
//也不会相互冲突;由于他们都new出来了个自的实例;有本身的this;有本身的一套方法了
//(其实方法都在原型里是公用的;操做各自的dom)
相关文章
相关标签/搜索