針對節(jié)點的操作有幾個重點的細節(jié):
我們知道jQuery的的接口是支持多種參數(shù)傳遞的,那么就需要有一個過濾器的中介來處理各種參數(shù)類型。
這個任務(wù)就交給了domManip,除此之外domManip在設(shè)計上需要做的處理:
1:解析參數(shù),字符串,函數(shù),對象 2:針對大數(shù)據(jù)引入文檔碎片處理 3:如果參數(shù)中包含script的處理
其中還有很多細節(jié)的問題:
1:IE下面innerHTML會忽略沒作用域元素,no-scope element(script,link,style,meta,noscript)等,所以這類通過innerHTML創(chuàng)建需要加前綴
2:innerHTML在IE下面會對字符串進行trimLeft操作,去掉空白
3: innerHTML不會執(zhí)行腳本的代碼,如果支持defer除外
4:很多標簽不能作為div的子元素、td、tr, tbody等等
5:jQuery是合集對象,文檔碎片的與事件的復(fù)制問題
針對innerHTML不會執(zhí)行腳本的代碼,如果支持defer除外的解釋:
div.innerHTML = "<script>alert(1)</srcript>" 這個代碼不會執(zhí)行
例外的情況:IE9之前滿足幾個條件
1:script設(shè)定defer屬性
2: script元素必須位于有作用域元素之后,因為script被認為是無作用域的(頁面中不可見)
換句話說,這樣設(shè)置
div.innerHTML = "<div><script defer>alert(1)</srcript></div>" 可以執(zhí)行
jQuery在內(nèi)部通過會有一個domManip方法,把這些問題都方方面面處理掉了
綜合上面一系列的問題,jQuery引入了domManip方法
原因清楚了,我們再來看jQuery是如何處理tbody問題,jQuery是兼容IE 6瀏覽器的。append、prepend、before和after都是操作Dom元素的函數(shù),如果被插入的對象是table,那就要在table中加入tbody標簽啊
所以domManip,主要是處理這個問題的,他還處理插入元素的順序等等
在結(jié)構(gòu)上首先用extend在原型上拓展了一堆方法,其實每一個的實現(xiàn)都很簡單,重點就是要看懂domManip的使用。可以重點挑兩個方法的實現(xiàn)看一看,不用每個都看。
然后就是appendTo和append之類的處理,大同小異,因為實現(xiàn)差不多,所以就放在一起了
jQuery.fn.extend({
text: function() {},
append: function() {},
prepend: function() {},
before: function() {},
after: function() {},
clone: function() {},
html: function() {},
replaceWith: function() {},
domManip: function() {},
})
其中append方法:
append: function() {
return this.domManip(arguments, function(elem) {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
var target = manipulationTarget(this, elem);
target.appendChild(elem);
}
});
}
1:函數(shù)調(diào)用了domManip函數(shù),傳進去的參數(shù)第一個是arguments,這個大家都知道arguments是函數(shù)參數(shù)對象,是一個類數(shù)組對象。這里arguments可能是包含dom元素的數(shù)組,或者html字符串
2:第二參數(shù)是一個回調(diào)函數(shù),target.appendChild(elem);看到這個代碼就很明了,在回調(diào)函數(shù)中分離各自的處理方法,通過domManip抽象出公共的處理,其余的prepend 、before 、after等接口也是類似的處理
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報