14 - 프레임 캡슐화

7500 단어
1. 프레임 구조 = = > 난점
  • 1 jQuery 대상의 본질
  • 2 프레임 코어 패브릭
  • 3 입구 함수(구조 함수)
  • 1. jQuery의 본질
    jquery         :jQuery $,
                 ,
             ,      jQuery    。
    
  • jQuery 실례 대상은 위조 그룹 대상
  • jQuery와 $는 사실상 공장 함수
  • 공장 함수를 직접 호출하면 하나의 실례를 얻을 수 있다
  • 2. jQuery의 기본 구조
    2.2.0 버전
    (function(w,factory){
        console.log('       ');
        factory();
     }(window,function(){
        return jQuery;
     }));
    

    1.7 버전
    (function(w){
       //          
       function jQuery(){
           return new jQuery.fn.init();
       }
       //            
       jQuery.fn = jQuery.prototype ={
       };
       // init jQuery        
       var init = jQuery.fn.init = function(){
       };
       //           jQuery     
       init.prototype = jQuery.fn;
       //              
       w.jQuery = w.$ = jQuery;
    }(window));
    

    3. jQuery 플러그인 구현 메커니즘
    jQuery.fn.alert = function(msg){
       alert(msg);
    };
    

    fn에 추가
    4. 입구 함수 init
    $공장을 통해 최종적으로 init구조 함수에 도달하였습니다. 모든 초기화 실례 과정이 이곳에서 이루어졌기 때문에 이곳을 입구함수라고 부릅니다.
    5. 입구 함수 실현 사고방식
    ==jq 입구가 서로 다른 매개 변수에 대한 처리 법칙:==
  • null,undefined,0,NaN,'빈 대상 되돌리기
  • 입력 문자열은 html 세션인지 아니면 기타인지 판단해야 한다
  • 세션이면 해당하는 DOM을 만들고 실례에 추가한다.
  • 그렇지 않으면 선택기에 따라 페이지의 DOM을 가져오고 가져온 DOM을 실례에 추가합니다.
  • 만약에 수조가 위조수조일 수 있다면 각 항목을 각각 실례에 추가한다.
  • 위의 데이터 유형을 제외하고 나머지는 실례에 통일적으로 추가한다.

  • ==입구 함수 논리 구현:==
    funciton init(selector){
        //   null、undefined、0、NaN、''      (    )
        if(!selector){
            return this;
        }
        //      ,       html      
        else if(typeof selector == 'string'){
            //     ,      DOM,         。            ,  length>=3,      html  
            if( html  ){
                /*
                1、        div  
                2、    div innerHTML html  
                3、    div         this  ,       length   
                4、       push      ,      apply      
                */
            }
            //              DOM,       DOM       
            else {
    
                    /*
                    *      :
                    * 1、  querySelectorAll        
                    * 2、               this  ,       length   ,
                    *        push      ,      apply      。
                    * */
                }
        }
        /*
        *             :
        * 1、     window   ,
        * 2、    toString         
        * 3、           
        *   :                ,               ,
        *         :[ 0:1, , , ]        ,    false,        。
        * 3.1、           length  ,
        * 3.2、    ,  length      0,   0,OK    ,
        * 3.3、   length    0,          length - 1    ,   ,OK    。
        *                       ,     。
        * */
        else if (  ) {
    
                    /*
                    *      :
                    *                     ,       length   ,
                    *        push      ,      apply      。
                    * */
                }else {
                    /*
                    *      :
                    *               ,length 1  。
                    * */
                }
    }
    

    6. 코드 블록
       :     
                   ,      ,       
         
      :
        ({}).toString()    
        {}.toString();     
    

    7. window의length 속성은 페이지의 iframe 수량을 나타낸다
    window에는 자신을 가리키는 window 속성이 있습니다
    8. 수조를 봉인하는 trim 방법
    function trim(str){
        if(typeof str!== 'string'){
            return str;
        }
        if(str.trim){
            return str.trim();
        }
        return str.replace(/^\s+|\s+$/g,'');
    }
    

    다음 날 핵심 방법==> 중간 수준
  • 1 입구 함수 대함수 처리
  • 2 원형의 핵심 방법
  • 3 맵과 each
  • 1. 정적과 실례적 방법의 차이
  • 정적 방법
  • jQuery.extend({
           isFunction: function( fn ) {
               return typeof fn === 'function';
           }
        });
    
  • 실례 방법
  • jQuery.prototype.extend({
                alert: function( msg ) {
                    alert( msg );
                }
            });
    
  • 정적 방법의 사용
  • jQuery.isFunction([])
    
  • 실례적인 방법의 사용
  • var $$ = new jQuery();
    $$.alert( '    ' );
    

    ==구조 함수는 자신의 원형에서 방법을 사용할 수 없습니다(Function 예외)==
    ==실례는 구조 함수에 있는 정적 방법을 직접 사용할 수 없다==
    2, IE8 중 apply 문제
    apply       this  ,                  ,
      IE8,apply               ,            。
    

    IE8에서 사용자 정의 위조 그룹을 진수 그룹으로 변환해야 apply를 빌릴 수 있습니다.수조의 슬라이스 방법을 빌려 위조수조를 통해 진수조를 얻다
    //           
    [].splce.call(   ) 
    //    
    [].push.apply(   ,[].splice.call(   ));
    

    3. 입구 함수
                 ,         jQuery,
                  。          DOM        。
    
    $(function(){
        //    
    })
    
  • html5에 DOMContentLoaded 이벤트가 추가되었습니다. IE9과 호환됩니다
  • 이 사건은 DOM 해석이 끝난 후에 터치됩니다
  • 통상적으로 이 사건은 onload보다 훨씬 빠르다.
  • 하지만 예외도 드물다.
  • =비고=: 예외가 발생하면 DOMContentLoaded 이벤트와 onload 이벤트가 촉발하는 간격의 차이가 크지 않습니다
  • 그래서 DOMContentLoaded가 onload보다 빠르다고 볼 수 있고 DOMContentLoaded만 감청하면 된다.

  • ==IE9+==
    document.addEventListener( 'DOMContentLoaded', function() {
        var spans = document.querySelectorAll( 'span' );
        console.log( spans, 'DOMContentLoaded');
    } );
    

    ==IE8 호환 ==
    document.attachEvent( 'onreadystatechange', function() {
        if ( document.readyState === 'complete' ) {
            /*var spans = document.querySelectorAll( 'span' );
            console.log( spans, 'DOMContentLoaded');*/
            /*    */
        }
    

    4, jQ 원형 핵심 방법
  • 1, jquery 버전 번호 가져오기
  • 2, selector는 모든 실례의 기본 선택기를 대표하고 실례가 jQuery 형식의 대상임을 나타낸다
  • 3,length는 모든 실례의 기본 길이를 대표한다
  • 4, toArray는 실례를 그룹으로 변환하여 되돌려줍니다
  • 5、get은 지정한 아래에 표시된 요소를 가져오고 원생DOM
  • 을 가져옵니다
  • 6, each 스트리밍 실례, 스트리밍된 데이터를 각각 리셋에 전송하여 사용
  • 7,map 스트리밍 실례, 스트리밍된 데이터를 각각 리셋에 전송하여 사용한 다음에 리셋된 리셋 값을 수집하여 하나의 수조로 리셋
  • 8,slice는 실례의 일부 요소를 캡처하여 새로운 jQuery 실례를 구성한다.
  • 9,first 획득 실례 중의 첫 번째 요소는 jQuery 형식의 실례 대상입니다.
  • 10,last는 실례 중의 마지막 요소를 가져오고 jQuery 형식의 실례 대상입니다.
  • 11,eq는 지정한 아래에 표시된 요소를 가져오고 jQuery 형식의 실례 대상을 가져옵니다.
  • 12,push는 실례에 새로운 요소를 추가
  • 13,sort는 실례 중의 원소를 정렬
  • 14. splice는 지정한 아래 표시된 수량에 따라 원소를 삭제하고 삭제된 원소를 대체할 수 있다.

  • 5.each 방법
    function each(obj,fn){
        var i,len,key;
        if('length' in obj){
            for(i = 0,len=obj.length;i

    6、맵 구현
    function map( obj, fn ) {
        /*
         * 1、   obj          ,
         * 2、   ,   i         
         * 3、    ,   for in         
         * 4、       ,       key val      。
         * 5、         ,          ,                。
         * */
        var i, len, key, result = [];
    
        if( 'length' in obj ) {
            for ( i = 0, len = obj.length; i < len; i++ ) {
                result.push( fn.call( obj[ i ], obj[ i ], i ) );
            }
        }else {
            for ( key in obj ) {
                result.push( fn.call( obj[ key ], obj[ key ], key ) );
            }
        }
    
        return result;
    }
    console.log(map(obj, function (val, key) {
        console.log(val, key, this);
    }));
    

    3일차 DOM 작업 ==> 중간
  • 1 DOM 생성
  • 2 DOM 삭제
  • 3 추가 DOM
  • 4일차 속성 스타일 작업 ==>간단
  • 1 class 속성 조작
  • 2 공통 속성 조작
  • 3 스타일 조작
  • 5일차 이벤트 ==> 과제
  • 1 이벤트 바인딩
  • 2사건 해제
  • 6일째ajax와 플러그인==>난점
  • 1 ajax
  • 2 플러그인 실현 원리
  • 3 접선 도면을 프레임 플러그인으로 만들기
  • 4 스크래치 플러그인
  • 좋은 웹페이지 즐겨찾기