2012-01-04 42 views
7
<div id="myDiv" class=" blueberry mango "></div> 

如果我們使用.addClass()jQuery的addClass()是不是正確的修剪?

$("#myDiv").addClass("carrot"); 

myDiv此類現在是"(no-space)blueberry mango(double-space)carrot"

有一個left-trim,但也有芒果和胡蘿蔔之間的雙空格,因爲沒有right-trim

  • 爲什麼jQuery的有一個特別的原因是不是 右側修剪?
  • 還是左邊的裝飾甚至沒有打算?
+1

我猜它與速度有關。這是否導致錯誤? – sissonb 2012-01-04 20:57:06

+3

這不應該導致任何錯誤,所以它真的很重要? – 2012-01-04 21:02:06

+0

這是一個有趣的問題。 – PeeHaa 2012-01-04 21:02:29

回答

7

似乎jQuery在添加類之後進行修剪。請參見下面的jQuery addclass代碼,

addClass: function(value) { 
    var classNames, i, l, elem, 
     setClass, c, cl; 

    if (jQuery.isFunction(value)) { 
     return this.each(function(j) { 
      jQuery(this).addClass(value.call(this, j, this.className)); 
     }); 
    } 

    if (value && typeof value === "string") { 
     classNames = value.split(rspace); 

     for (i = 0, l = this.length; i < l; i++) { 
      elem = this[ i ]; 

      if (elem.nodeType === 1) { 
       if (!elem.className && classNames.length === 1) { 
        elem.className = value; 

       } else { 
       //HERE IS APPENDS ALL CLASS IT NEEDS TO ADD 
        setClass = " " + elem.className + " "; 

        for (c = 0, cl = classNames.length; c < cl; c++) { 
         if (!~setClass.indexOf(" " + classNames[ c ] + " ")) { 
          setClass += classNames[ c ] + " "; 
         } 
        } 
        elem.className = jQuery.trim(setClass); 
       } 
      } 
     } 
    } 

    return this; 
} 

所以它就像下面,

jQuery.trim(" blueberry mango " + " " + "carrot")

2

發生這種情況是因爲jQuery將類追加到類的列表中,然後在整個字符串上運行trim

看看source for addClass看看發生了什麼。

0

查看源,我猜我們沒有理由爲:

setClass = " " + elem.className + " "; 

for (c = 0, cl = classNames.length; c < cl; c++) { 
    if (!~setClass.indexOf(" " + classNames[ c ] + " ")) { 
     setClass += classNames[ c ] + " "; 
    } 
} 
elem.className = jQuery.trim(setClass); 

真,在每節課之前和之後都有空格有助於發現新課程(已添加)是否已在那裏,但仍然可以用以下代碼替換第一行:

setClass = " " + jQuery.trim(elem.className) + " "; 

,它仍然會工作以同樣的方式...