国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

jQuery源碼解析之addClass(),removeClass(),toggleClass()和

Aceyclee / 1131人閱讀

摘要:四作用檢查目標元素是否包含指定的類源碼源碼行關鍵代碼這個代碼還挺簡單的,就不解析了。

一、$().addClass()
作用:
向目標元素添加一個或多個類名

源碼:

    //向目標元素添加一個或多個類名
    //源碼8401行
    addClass: function( value ) {
      var classes, elem, cur, curValue, clazz, j, finalValue,
        i = 0;
      //如果addClass(value)的value是一個function
      //那么就通過call讓目標元素this調用該function
      if ( isFunction( value ) ) {
        return this.each( function( j ) {
          // function(index,currentclass)
          // index 對應 j,作用是獲取多個目標元素的下標;
          // currentClass 對應 getClass(this),作用是獲取當前元素的類名,方便加空格
          jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
        } );
      }
      //將(多個)類名轉為數組形式
      classes = classesToArray( value );
      if ( classes.length ) {
        //多個目標元素
        while ( ( elem = this[ i++ ] ) ) {
          //獲取當前值
          curValue = getClass( elem );
          //如果目標元素是元素節點并且用空格左右包起來 " "+value+" "
          cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );

          if ( cur ) {
            j = 0;
            //一個個類名
            while ( ( clazz = classes[ j++ ] ) ) {
              //當前元素沒有和要添加的類名重復的話就添加
              if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
                cur += clazz + " ";
              }
            }
            //最后,確認經過處理后的類名集合是否和處理前的類名集合相同
            //如果相同,就setAttribute,重新渲染,否則不重新渲染(性能優化)
            // Only assign if different to avoid unneeded rendering.
            finalValue = stripAndCollapse( cur );
            if ( curValue !== finalValue ) {
              //最后通過setAttribute,添加類名
              elem.setAttribute( "class", finalValue );
            }
          }
        }
      }
      return this;
    },

解析:
(1)getClass()
作用:
獲取目標元素的類名

源碼:

  //源碼8377行
  function getClass( elem ) {
    return elem.getAttribute && elem.getAttribute( "class" ) || "";
  }

(2)classesToArray
作用:
將(多個)類名轉為數組形式

源碼:

  //源碼8382行
  function classesToArray( value ) {
    //元素的className如果有多個類名的話,是以數組形式保存的,那就直接返回
    if ( Array.isArray( value ) ) {
      return value;
    }
    //如果元素類名是string類型的話
    if ( typeof value === "string" ) {
      return value.match( rnothtmlwhite ) || [];
    }
    return [];
  }

(3)stripAndCollapse
作用:
將vaues以空格分開,再以空格拼接

源碼:

  // 源碼8370行
  // Strip and collapse whitespace according to HTML spec
  // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
  function stripAndCollapse( value ) {
    var tokens = value.match( rnothtmlwhite ) || [];
    return tokens.join( " " );
  }

綜上:
可以看到 addClass() 的思路是:
① 獲取元素當前類名集合 a
② 如果要添加的類名 b 不重復,則將 b 添加進 a 里
③ 最后使用elem.setAttribute("class",a)完成

二、$().removeClass
作用:
移除類,如果沒有參數,則移除目標元素所有類名

源碼:

    //源碼8449行
    removeClass: function( value ) {
      var classes, elem, cur, curValue, clazz, j, finalValue,
        i = 0;
      //作用同上
      if ( isFunction( value ) ) {
        return this.each( function( j ) {
          jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
        } );
      }
      //如果沒有規定參數,則刪除所有類
      if ( !arguments.length ) {
        return this.attr( "class", "" );
      }
      //將(多個)類名轉為數組形式
      classes = classesToArray( value );

      if ( classes.length ) {
        while ( ( elem = this[ i++ ] ) ) {
          curValue = getClass( elem );

          // This expression is here for better compressibility (see addClass)
          cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );

          if ( cur ) {
            j = 0;
            while ( ( clazz = classes[ j++ ] ) ) {
              // 如果當前元素的類名里有要移除的類,
              // 就將該類替換成" "
              // Remove *all* instances
              while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
                cur = cur.replace( " " + clazz + " ", " " );
              }
            }
            //同上
            // Only assign if different to avoid unneeded rendering.
            finalValue = stripAndCollapse( cur );
            if ( curValue !== finalValue ) {
              elem.setAttribute( "class", finalValue );
            }
          }
        }
      }
      return this;
    },

可以看到 addClass() 的思路是:
① 獲取元素當前類名集合 a
② 如果要移除的類名 b 不重復,則將 a 里面的 b 替換成空格 " "
③ 最后使用elem.setAttribute("class",a)完成移除類名

三、$().toggleClass
作用:
切換類

源碼:

    //stateVal為true,則添加類,false則移除類
    //源碼8497行
    toggleClass: function( value, stateVal ) {
      var type = typeof value,
        //如果value是string類型或者是數組類型的話,為true,反之為false
        isValidValue = type === "string" || Array.isArray( value );
      //true添加類,false移除類
      if ( typeof stateVal === "boolean" && isValidValue ) {
        return stateVal ? this.addClass( value ) : this.removeClass( value );
      }
      //同上
      if ( isFunction( value ) ) {
        return this.each( function( i ) {
          jQuery( this ).toggleClass(
            value.call( this, i, getClass( this ), stateVal ),
            stateVal
          );
        } );
      }

      return this.each( function() {
        var className, i, self, classNames;

        if ( isValidValue ) {

          // Toggle individual class names
          i = 0;
          self = jQuery( this );
          classNames = classesToArray( value );

          while ( ( className = classNames[ i++ ] ) ) {
            //如果目標元素已經有要toggle的className,那么就移除它
            // Check each className given, space separated list
            if ( self.hasClass( className ) ) {
              self.removeClass( className );
            } else {
              //否則就添加類
              self.addClass( className );
            }
          }

          // Toggle whole class name
        }
        //如果$.toggleClass()沒有值或者該值為布爾值
        else if ( value === undefined || type === "boolean" ) {
          className = getClass( this );
          //如果目標元素有類的話,就先用__className__屬性保存類名
          if ( className ) {

            // Store className if set
            dataPriv.set( this, "__className__", className );
          }

          // If the element has a class name or if we"re passed `false`,
          // then remove the whole classname (if there was one, the above saved it).
          // Otherwise bring back whatever was previously saved (if anything),
          // falling back to the empty string if nothing was stored.
          //如果目標元素存在setAttribute的方法話
          if ( this.setAttribute ) {
            //如果已有類名/value=false,則移除所有類名
            //如果沒有類名并且value=true,
            //則從dataPriv中重新獲取之前保存過的__className__當做目標元素的類名
            this.setAttribute( "class",
              className || value === false ?
                "" :
                dataPriv.get( this, "__className__" ) || ""
            );
          }
        }
      } );
    },

解析:
主要是兩個 if
(1) if ( typeof stateVal === "boolean" && isValidValue )
這個就是$().toggleClass(value,truefalse) 的第二個參數的作用了,
true 即 addClass(),false 即 removeClass()

(2)if(isValidValue )
這個是只有一個參數的情況
利用 hasClass 判斷是否 add/removeClass

(3)如果$.toggleClass()沒有值或者第一個值為 true 的話
如果目標元素有類名的話,就使用dataPriv來保存類名,
如果目標元素有setAttribute的話,則將 className 設置為dataPriv里保存的值。

四、$().hasClass
作用:
檢查目標元素是否包含指定的類

源碼:

    //源碼8568行
    hasClass: function( selector ) {
      var className, elem,
        i = 0;

      className = " " + selector + " ";
      while ( ( elem = this[ i++ ] ) ) {
        if ( elem.nodeType === 1 &&
          //關鍵代碼
          ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
          return true;
        }
      }

      return false;
    }

這個代碼還挺簡單的,就不解析了。

(完)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/109807.html

相關文章

  • jQuery 源碼系列(十八)class 相關操作

    摘要:眼看的源碼就快到頭了,后面還有幾個重要的內容,包括和動畫操作,加油把它們看完,百度前端學院的新一批課程也開始了。,當第二個參數為的情況,就是,為時,,從源碼來看,就是直接調用的這兩個函數。參考源碼分析樣式操作本文在上的源碼地址,歡迎來。 歡迎來我的專欄查看系列文章。 眼看 jQuery 的源碼就快到頭了,后面還有幾個重要的內容,包括 ajax 和動畫操作,加油把它們看完,百度前端學院的...

    BingqiChen 評論0 收藏0
  • jquery梳理屬性操作

    摘要:與元素屬性原生對于元素的屬性有三種方法來操作為元素添加屬性名和屬性值獲取元素屬性值刪除元素屬性而則將以上三個操作簡化為和對應對應對應上述的為屬性名,為屬性值對于需要設置多個屬性時,采用的方式是在方法傳入屬性配置對象元素值屬性三個方法都 attr與removeAttr - 元素屬性 JS原生對于元素的屬性有三種方法來操作 dom.setAttribute(name , value) //...

    silencezwm 評論0 收藏0
  • jQuery 屬性與樣式

    摘要:與中用方法來獲取和設置元素屬性是屬性的縮寫,在操作中會經常用到有個表達式傳入屬性名獲取屬性的值屬性名屬性值設置屬性的值屬性名函數值設置屬性的函數值給指定元素設置多個屬性值,即屬性名一屬性值一屬性名二屬性值二刪除方法為匹配的元素集合中的每個元 .attr()與.removeAttr() jQuery中用attr()方法來獲取和設置元素屬性,attr是attribute(屬性)的縮寫,在j...

    yibinnn 評論0 收藏0
  • jQuery入門筆記(二)文檔對象模型

    摘要:刪除指定的屬性,這個方法就不可以使用匿名函數,傳遞和均無效。遍歷對象數組索引,鍵,屬性名屬性值,值相當于遍歷原生對象數組時,為元素。在使用使用時,可以使用傳入匿名函數的方法,實現由默認到幾個之間的切換。 轉自個人博客 基礎 DOM 和 和 CSS 一. 設置元素及內容 我們通過前面所學習的各種選擇器、過濾器來得到我們想要操作的元素。這個時候,我們就可以對這些元素進行 DOM 的操作。...

    FleyX 評論0 收藏0
  • jQuery基礎(一) :樣式篇

    摘要:如下就是對象或是如下以下兩者的修改都是等價的但是使用不能很好的操作,所以可以將其轉換成對象把元素轉化成的對象總體,表示當前的上下文對象是一個對象,可以調用對象所擁有的屬性和方法。代表的上下文對象是一個的上下文對象,可以調用的方法和屬性值。 一:初識 jquery: 1、 jQuery 只是一個庫,不需要特別的安裝,只需要我們在頁面 標簽內中通過 script 標簽腳本引入 jQuer...

    SegmentFault 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<