一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

javascript 包裹節(jié)點(diǎn) 提高效率

原理基本是這樣,如果傳入的是字符串,那么讓它們變成一個(gè)元素節(jié)點(diǎn),不過(guò)這元素節(jié)點(diǎn)也可以有許多層,在最內(nèi)層把要包裹的元素放進(jìn)。把字符串變成元素節(jié)點(diǎn)的方法有如下幾個(gè)。
1,createElement,IE可以連元素屬性也一起創(chuàng)建,但只能創(chuàng)建一層。
2,innerHTML,不過(guò)需要對(duì)原來(lái)的字符串進(jìn)行處理,IE與FF都有許多意想不到的默認(rèn)行為,可以為你多加一點(diǎn)東西或少加一點(diǎn)東西。
3,createContextualFragment,由于Opera的行為有點(diǎn)怪異,需要選中修改元素的位置。經(jīng)日本人的測(cè)試,它轉(zhuǎn)換字符串成節(jié)點(diǎn)的效率比innerHTML高多了,也安全多了,真是強(qiáng)者愈強(qiáng),弱者愈弱。如果是傳入元素節(jié)點(diǎn),需要克隆一下,要不都變成wrapAll。如果是函數(shù),把當(dāng)前元素傳進(jìn)去,利用它的某些屬性創(chuàng)建一個(gè)包裹元素。
最初的實(shí)驗(yàn)品(這里的wrapOuter相當(dāng)于jQuery的wrap):
復(fù)制代碼 代碼如下:
var parseHTML = function(str) {
if(document.createRange){
var range = document.createRange()
range.setStartAfter(document.body)
return range.createContextualFragment(str)
}else{
return document.createElement(str)
}
}
var wrapOuter = function(target,html){
var wrap = parseHTML(html) ;
target.parentNode.insertBefore(wrap,target);
target.previousSibling.appendChild(target)
}


[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]

發(fā)現(xiàn)在Opera中出了些問(wèn)題,range.setStartAfter(document.body)要改成我們的目標(biāo)元素才行。再者,將插入包裹元素的方式由insertBefore改為replaceChild,提高效率。
復(fù)制代碼 代碼如下:
var wrapOuter = function(target,html){
var wrap = html
if(Object.prototype.toString.call(html) === "[object String]"){
if(document.createRange){
var range=document.createRange();
range.selectNodeContents(target);
wrap = range.createContextualFragment(html).firstChild;
}else {
wrap = document.createElement(str);
}
}
target.parentNode.replaceChild(wrap,target);
wrap.appendChild(target)
}


[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
復(fù)制代碼 代碼如下:
//給每個(gè)匹配元素都增加一個(gè)父元素(包裹元素),
wrap:function(html){//html可以是元素節(jié)點(diǎn),也可以是html片斷
var _wrap = function(target,html){
var wrap;
if(is(html,"String")){
if(document.createRange){
var range=document.createRange();
range.selectNodeContents(target);
wrap = range.createContextualFragment(html).firstChild;
}else {
wrap = document.createElement(html);
}
}else if(html.nodeType){
wrap = html.cloneNode(true)
}
target.parentNode.replaceChild(wrap,target);
wrap.appendChild(target)
}
if(is(html,"Function")){
return this.each(function(el,index){
_wrap(el, html.call(el,index));
});
}
return this.each(function(el){
_wrap(el,html)
});
},

把創(chuàng)建包裹元素的方法抽象出來(lái):
復(fù)制代碼 代碼如下:
var _parseHTML = function(el,html){
var wrap = html ;
if(doc.createRange){
var range=doc.createRange();
range.selectNodeContents(el);
var wrap = range.createContextualFragment(html).firstChild;
range.detach();
return wrap;
}else {
return dom.parseHTML(html);
}
}
//給每個(gè)匹配元素都增加一個(gè)父元素(包裹元素),
wrap:function(html){//html可以是元素節(jié)點(diǎn),也可以是html片斷
var _wrap = function(target,html){
var wrap = html ;
if(!wrap.nodeType){
wrap = dom._parseHTML(target,html);
}else{
wrap = html.cloneNode(true)
}
target.parentNode.replaceChild(wrap,target);
wrap.insertBefore(target,null)
}
if(is(html,"Function")){
return this.each(function(el,index){
_wrap(el, html.call(el,index));
});
}
return this.each(function(el){
_wrap(el,html)
});
},
wrapInner:function(html){
var _wrap = function(target,html){
var wrap = html ;
if(!wrap.nodeType){
wrap = dom._parseHTML(target,html);
}else{
wrap = html.cloneNode(true)
}
target.insertBefore(wrap,target.firstChild);
for(var i=1,n=target.childNodes.length;i<n;i++){
wrap.appendChild(target.childNodes[i],null)
}
}
if(is(html,"Function")){
return this.each(function(el,index){
_wrap(el, html.call(el,index));
});
}
return this.each(function(el){
_wrap(el,html)
});
},
//用一個(gè)標(biāo)簽包裹所有匹配元素
//做法:在第一個(gè)匹配元素上添加一個(gè)父元素(包裹),然后把其他匹配元素都轉(zhuǎn)移到此父元素中來(lái)
//wrapAll(html) wrapAll(elem)
wrapAll:function(html){
var wrap = html;
if(!wrap.nodeType)
wrap = dom._parseHTML(this[0],html);
this[0].parentNode.replaceChild(wrap,this[0]);
return this.each(function(el){
wrap.insertBefore(el,null);
});
},

到j(luò)Query官網(wǎng)看一下,發(fā)現(xiàn)它的包裹節(jié)點(diǎn)的方法升級(jí)了,每次可以包裹許多層了,而我的每次只能包一層。于是決定調(diào)用我原來(lái)的parseHTML方法,見(jiàn)這里。
復(fù)制代碼 代碼如下:
var wrap = function(html){//html可以是元素節(jié)點(diǎn),也可以是html片斷
var _wrap = function(target,html){
var wrap = html ;
if(!wrap.nodeType){
if(doc.createRange){
var range=doc.createRange();
range.selectNodeContents(target);
wrap = range.createContextualFragment(html).firstChild;
}else{
wrap = dom.parseHTML(html,null,true).firstChild
}
}else{
wrap = html.cloneNode(true)
}
target.parentNode.replaceChild(wrap,target);
while ( wrap.firstChild && wrap.firstChild.nodeType === 1 ) {
wrap = wrap.firstChild;
}
wrap.insertBefore(target,null)
}
if(is(html,"Function")){
return this.each(function(el,index){
_wrap(el, html.call(el,index));
});
}
return this.each(function(el){
_wrap(el,html)
});
}
//把每一個(gè)匹配元素的子節(jié)點(diǎn)都用東西包裹起來(lái)
var wrapInner = function(html){
var _wrap = function(target,html){
var wrap = html ;
if(!wrap.nodeType){
wrap = dom.parseHTML(html,null,true).firstChild
}else{
wrap = html.cloneNode(true)
}
target.insertBefore(wrap,target.firstChild);
while ( wrap.firstChild && wrap.firstChild.nodeType === 1 ) {
wrap = wrap.firstChild;
}
for(var i=1,n=target.childNodes.length;i<n;i++){
wrap.appendChild(target.childNodes[i],null)
}
}
if(is(html,"Function")){
return this.each(function(el,index){
_wrap(el, html.call(el,index));
});
}
return this.each(function(el){
_wrap(el,html)
});
}
//用一個(gè)標(biāo)簽包裹所有匹配元素
//做法:在第一個(gè)匹配元素上添加一個(gè)父元素(包裹),然后把其他匹配元素都轉(zhuǎn)移到此父元素中來(lái)
//wrapAll(html) wrapAll(elem)
var wrapAll = function(html){
var wrap = html;
if(!wrap.nodeType){
if(doc.createRange){
var range = doc.createRange();
range.selectNodeContents(this[0]);
wrap = range.createContextualFragment(html).firstChild;
}else{
wrap = dom.parseHTML(html,null,true).firstChild
}
} else{
wrap = html.cloneNode(true)
}
this[0].parentNode.replaceChild(wrap,this[0]);
while ( wrap.firstChild && wrap.firstChild.nodeType === 1 ) {
wrap = wrap.firstChild;
}
return this.each(function(el){
wrap.insertBefore(el,null);
});
}

發(fā)現(xiàn)有許多重復(fù)代碼,再抽象一下,對(duì)外人來(lái)說(shuō),徹底的不知所云,想必jQuery也是這樣一步步搞到晦澀難懂的。
復(fù)制代碼 代碼如下:
dom.mixin(dom[fn],(function(){
var wrapHelper = function(target,html ){
var wrap = html ;
if(!wrap.nodeType){
if(document.createRange){
var range=dom.doc.createRange();
range.selectNodeContents(target);
wrap = range.createContextualFragment(html).firstChild;
} else{
wrap = dom.parseHTML(html,null,true).firstChild
}
}else{
wrap = html.cloneNode(true)
}
var insertor = wrap;
while ( insertor.firstChild && insertor.firstChild.nodeType === 1 ) {
insertor = insertor.firstChild;
}
return [wrap,insertor]
}
//用一個(gè)標(biāo)簽包裹所有匹配元素
//做法:在第一個(gè)匹配元素上添加一個(gè)父元素(包裹),然后把其他匹配元素都轉(zhuǎn)移到此父元素中來(lái)
//wrapAll(html) wrapAll(elem)
var wrapAll = function(html){
if ( dom.isFunction( html ) ) {
return this.each(function(el,index) {
dom(this).wrapAll( html.call(this, index));
});
}
var arr = wrapHelper(this[0],html);
var wrap = arr[0],insertor =arr[1];
this[0].parentNode.replaceChild(wrap,this[0]);
return this.each(function(el){
insertor.insertBefore(el,null);
});
}
//給每個(gè)匹配元素都增加一個(gè)父元素(包裹元素),
var wrap= function( html ) {
return this.each(function() {
dom( this ).wrapAll( html );
});
}
//把每一個(gè)匹配元素的子節(jié)點(diǎn)都用東西包裹起來(lái)
var wrapInner = function(html){
var _wrap = function(target,html){
var arr = wrapHelper(target,html);
var wrap = arr[0],insertor =arr[1];
target.insertBefore(wrap,target.firstChild);
for(var i=1,n=target.childNodes.length;i<n;i++){
insertor.appendChild(target.childNodes[i],null)
}
}
if(is(html,"Function")){
return this.each(function(el,index){
_wrap(el, html.call(el,index));
});
}
return this.each(function(el){
_wrap(el,html)
});
}
return {
wrapAll:wrapAll,
wrap:wrap,
wrapInner:wrapInner
}
})());

unwrap方法以后再說(shuō)!

JavaScript技術(shù)javascript 包裹節(jié)點(diǎn) 提高效率,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 成人午夜视频网站 | 97在线视频精品 | 久久国产精品超级碰碰热 | 天堂资源在线官网资源 | 中日韩免费视频 | 国产精品美女久久久久 | 婷婷春色 | 一本色道久久99一综合 | 欧美怡红院免费全视频 | 欧美日韩一区妖精视频yjsp | 欧美色涩| 国产精品自在线拍 | 中文字幕在线视频一区 | 国产成人一区二区三区在线播放 | 国产成人亚洲综合无 | 国内免费高清视频在线观看 | 国产第一夜 | 91激情| 日本一区二区日本免费 | 久久伊人色 | 欧美一级特黄aaa大片 | 国产成人午夜片在线观看 | 91免费看国产 | 欧美在线网站 | 精品久久久中文字幕一区 | 久久国产精品国语对白 | 亚洲精品高清国产一久久 | 天天色天天综合 | 99国产精品免费观看视频 | 成人免费视频在线观看 | 97影院在线午夜 | 中文字幕 国产 | 青草碰人人澡人人澡 | 成人在线综合 | 日本久草视频 | 黄网址在线观看 | 激情www| 成年ssswww中国女人 | 国产福利在线观看精品 | 国产极品白嫩美女在线观看看 | 久久久久青草线蕉亚洲麻豆 |