封裝函數與調用


js中class多種函數的封裝方法

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>關於class的多種函數封裝</title>
<style>
body{
  margin: 0;
}
li{
  height: 20px;
}
</style>
</head>
<body>
<div class="box" id="box">
  <ul class="list">
    <li class="in abc ab "></li>
    <li class="in ac b "></li>
    <li class="in a "></li>
    <li class="in acb "></li>
    <li class="in ba "></li>
    <li class="abc"></li>
  </ul>
</div>
<script>
//數組的indexOf方法封裝
function indexOf(arr,value,start){
  //如果不設置start,則默認start爲0
  if(arguments.length == 2){
    start = 0;
  }
  //如果數組中存在indexOf方法,則用原生的indexOf方法
  if(arr.indexOf){
    return arr.indexOf(value,start);
  }
  for( var i = 0; i < arr.length; i++){
    if(arr[i] === value){
      return i;
    }
  }
  return -1;
}
//數組去重方法封裝
function noRepeat(arr){
  var result = [];
  for( var i = 0; i < arr.length; i++){
    if(indexOf(result,arr[i]) == -1){
      result.push(arr[i]);
    }
  }
  return result;
}
//inArray方法封裝
function inArray(arr,value){
  for(var i = 0; i < arr.length; i++){
    if(arr[i] === value){
      return true;
    }
  }
  return false;
}
//去除首尾空格函數封裝
function trim(arr){
  var result = arr.replace(/^\s+|\s+$/g,'');
  return result;
}
//getElementsByClassName函數封裝
function getElementsByClassName(parentObj,classStr){
  var result = [];
  var objs = parentObj.getElementsByTagName('*');
  
  //如果classStr用空格分隔,則表示class必須同時滿足纔有效
  var targetArr1 = noRepeat(trim(classStr).split(/\s+/));
  //如果classStr用逗號分隔,則表示class只要有一個滿足就有效
  var targetArr2 = noRepeat(trim(classStr).split(/\s*,\s*/));
    
  if(classStr.indexOf(',') == -1 ){
    //用空格分隔或者只有一個class
    label: for(var i = 0; i < objs.length; i++){
      var arr = noRepeat(trim(objs[i].className).split(/\s+/));
      for( var j = 0; j < targetArr1.length; j++){
        if(!inArray(arr,targetArr1[j])){
          continue label;
        }
      }
      result.push(objs[i]);
    }
    return result;
  }else{
    //用逗號分隔
    label: for(var i = 0; i < objs.length; i++){
        var arr = noRepeat(trim(objs[i].className).split(/\s+/));
        for( var j = 0; j < targetArr2.length; j++){
          if(inArray(arr,targetArr2[j])){
            result.push(objs[i]);
            continue label;
          }
        }
          
      }
      return result;   
    }
}
  
//addclass函數封裝
function addClass(obj,classStr){
  var array = noRepeat(trim(obj.className).split('\s+'));
  if(!inArray(array,classStr)){
    array.push(classStr);
  }
  obj.className = array.join(' ');
  return obj;
}
//removeclass函數封裝
function removeClass(obj,classStr){
  var array = noRepeat(trim(obj.className).split('\s+'));
  var index = indexOf(array,classStr);
  if(index != -1){
    classStr.splice(index,1);
    obj.className = classStr.join(' ');
  }
  return obj;
}
//toggleClass函數封裝
function toggleClass(obj,classStr){
  var array = noRepeat(trim(obj.className).split('\s+'));
  if(inArray(array,classStr)){
    removeClass(obj,classStr);
  }else{
    addClass(obj,classStr);
  }
}
</script>
</body>
</html>


js函數調用的四種方法

js的函數調用會免費奉送兩個而外的參數就是 this 和 arguments 。arguments是參數組,他並不是一個真實的數組,但是可以使用.length方法獲得長度。

書上有說4中調用方式:

  • 方法調用模式
  • 函數調用模式
  • 構造器調用模式
  • apply調用模式

下面我們來看看一些實例更好理解。

1:方法調用模式。

請注意this此時指向myobject。

/*方法調用模式*/
    var myobject={
            value:0,
            inc:function(){
                    alert(this.value)
                }
        }
    myobject.inc()

2:函數調用模式

請注意this此時指向window

/*函數調用模式*/
    
    var add=function(a,b){
        alert(this)//this被綁頂到window
            return a+b;
        }
    var sum=add(3,4);
    alert(sum)

3:構造器調用模式

javascript語言精粹一書建議摒棄這中方式。因爲有更好的方式。這裏先不介紹。下次發表博文的時候貼出來。

會在這裏加一個連接。

/*構造器調用模式  摒棄*/
    
    var quo=function(string){
            this.status=string;
        }
    quo.prototype.get_status=function(){
            return this.status;
        }
    var qq=new quo("aaa");
    alert(qq.get_status());


4:apply調用模式

==我們可以來看一個更有用的apply實例。看最下面的代碼。

/*apply*/
    //注意使用了上面的sum函數
    //與myobject
    //這中調用方式的優點在於可以指向this指向的對象。
    //apply的第一個參數就是this指針要指向的對象
    var arr=[10,20];
    var sum=add.apply(myobject,arr);
    alert(sum);

 

看這個apply真正應用。bind這是一個綁定時間的函數

var bind=function(object,type,fn){
            if(object.attachEvent){//IE瀏覽器
                    object.attachEvent("on"+type,(function(){
                                                           return function(event){
                                                               window.event.cancelBubble=true;//停止時間冒泡
                                                               object.attachEvent=[fn.apply(object)];//----這裏我要講的是這裏
                                                               //在IE裏用attachEvent添加一個時間綁定以後。
                                                               //this的指向不是到object對象本身所以。我們綁定的function裏的this.id是無法正常工作的。
                                                               //但是如果我們用fn.apply(object)
                                                               //這裏可以看出我們是把apply的第一個對象也就是this的指向變更給了object所以this.id就變成了
                                                               //object.id 可以正常工作了。
                                                               
                                                               }
                                                           })(object),false);
                }else if(object.addEventListener){//其他瀏覽器
                        object.addEventListener(type,function(event){
                                                              event.stopPropagation();//停止時間冒泡
                                                              fn.apply(this)
                                                              });
                    }
            
        }
    bind(document.getElementById("aaa"),"click",function(){alert(this.id)}); 

我喜歡的

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>  
			body{  
			  margin: 0;
			 
			} 
			.box{
				width: 400px;
				height: 200px;
				margin: 200px auto;
			} 
			li{ 
				float: left;
				margin-left: 10px; 
			    height: 20px;  
			    width: 50px;
			    background: green;
			    list-style: none;
			}  
		</style>
	</head>
	<body>
		<botton id="aa">點擊</botton>
		<div class="box" id="box">  
		  <ul class="list">  
		    <li>11</li>  
		    <li>22</li>  
		    <li33</li>  
		    <li>44</li>  
		    <li>55</li>  
		    <li>66</li>  
		  </ul>  
		</div>  
		<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
		<script>
            var myOpinion = myOpinion || {};
            myOpinion.prototype={
                 init:function(obj,i){
                           alert(obj+'hello');
                 },
                 closeWindow:function(obj,d){
                       obj.click(function(){
                            d.hide();
                        });
                 }
            }
            
            $(function(){
                var my = myOpinion.prototype;
                my.init($("#box"),$(".list"));             
                my.closeWindow($("#aa"),$(".list li"));

            });            

		</script>
	</body>
</html>



這裏寫的也不錯:http://blog.csdn.net/xi_2130/article/details/50276025#comments




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章