在慕課網學習jQuery時,看到教程在講述wrapAll()時說道:css
.wrapAll( function ) :一個回調函數,返回用於包裹匹配元素的 HTML 內容或 jQuery 對象html
經過回調的方式能夠單獨處理每個元素。bash
簡單的看一段代碼:函數
<p>p元素</p>
<p>p元素</p>工具$('p').wrapAll(function() {
return '<div><div/>';
})學習以上的寫法的結果以下,等同於warp的處理了ui
<div>
<p>p元素</p>
</div>
<div>
<p>p元素</p>
</div>spa
這種說法讓我很疑惑,wrapAll()裏面傳入回調函數,效果不該該跟wrapAll()同樣用一個元素包裹全部匹配元素嗎?wrapAll的原意就是「包裹全部」,用它實現每一個匹配元素的單獨的包裹顯得有點古怪了。3d
順便總結一下code
wrap()將全部匹配的元素進行單獨的包裹,在原來的元素的外部實施包裹
最近翻閱了jQuery官方文檔後,發現jQuery3.0以上的版本已經修正了這個bug。
下面看個對比:
html結構
<div class="left">
<a>a元素</a>
<a>a元素</a>
</div>
<button id="btn">增長父容器div</button>
相關的css代碼:
.left div {
background: #bbffaa;
}
複製代碼
$(#btn).click(function() {
$("a").wrapAll( function() {
return "<div></div>"
})
})複製代碼
在jQuery 3.0如下版本,a元素會分別被兩個新加的<div>元素包裹
在開發者工具下是這樣顯示:
而在jQuery 3.0以上版本,兩個a元素會被以一個新的<div>元素包裹。
在開發者工具下是這樣顯示:
很顯然,這纔是咱們要的結果。
若是wrapAll()匹配的元素不在一個父元素下,會如何顯示呢?
<div class="right">
<p>p元素</p>
<p>p元素</p>
<p>p元素</p>
</div>
<div class="left">
<p>p元素</p>
<a>a元素</a>
<a>a元素</a>
</div>
<button id="btn">增長父容器div</button>
相關的css代碼:
.left div {
background: #bbffaa;
}
.right div {
background: yellow;
}
複製代碼
$(#btn).click(function() {
$("p").wrapAll("<div></div>");
$("a").wrapAll( function() {
return "<div></div>"
})
})複製代碼
結果:
開發者工具顯示:
能夠看到,wrapAll()方法會移動<p>p元素</p>的位置,強制<p>元素在一個<div>元素裏。