1.9.1源码分析系列(十一)之DOM操作(3)

<div>   <p>     <div>       <p>         <input type="submit">       </p>     </div>   </p> </div> <div>   <p>     我是right   </p> </div>

jQuery.fn.wrap(在每个匹配元素外部包裹指定的HTML结构)

  对jQuery的每个元素分别使用wrapAll包裹一下

return this.each(function(i) { jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); });

行$('div').wrap('<p></p>')后结果DOM变成

<p>   <div>     <p>       <div>         <input type="submit">       </div>     </p>   </div> </p> <p>   <div>我是right</div> </p>

jQuery.fn.unwrap(移除每个匹配元素的父元素)

  使用replaceWith用匹配元素父节点的所有子节点替换匹配元素的父节点。当然了父节点是body/html/document肯定是移除不了的

return this.parent().each(function() { if ( !jQuery.nodeName( this, "body" ) ) { jQuery( this ).replaceWith( this.childNodes ); } }).end();   执行$('div').wrap()后结果DOM变成 <div>   <input type="submit"> </div> <div>我是right</div>   

jQuery.fn.remove(从文档中移除匹配的元素)

  你还可以使用选择器进一步缩小移除的范围,只移除当前匹配元素中符合指定选择器的部分元素。

  与detach()相比,remove()函数会同时移除与元素关联绑定的附加数据( data()函数 )和事件处理器等(detach()会保留)。

for ( ; (elem = this[i]) != null; i++ ) { if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) { // detach传入的参数keepData为true,不删除缓存 if ( !keepData && elem.nodeType === 1 ) { //清除缓存 jQuery.cleanData( getAll( elem ) ); } if ( elem.parentNode ) { if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { setGlobalEval( getAll( elem, "script" ) ); } elem.parentNode.removeChild( elem ); } } }

  可以看到其中有一个重要的函数cleanData,该方法是用来清除缓存:遍历每一个节点元素,对每一个节点元素做一下处理:

1.获取当前元素对应的缓存

id = elem[ internalKey ]; data = id && cache[ id ];

2.如果有绑定事件,则遍历解绑事件

if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); //这是一个快捷方式,以避免jQuery.event.remove的开销 } else { jQuery.removeEvent( elem, type, data.handle ); } } }

3.如果jQuery.event.remove没有移除cache,则手动移除cache。其中IE需要做一些兼容处理,而且最终会将删除历史保存如core_deletedIds中

//当jQuery.event.remove没有移除cache的时候,移除cache if ( cache[ id ] ) { delete cache[ id ]; //IE不允许从节点使用delete删除expando特征, //也能对文件节点使用removeAttribute函数; //我们必须处理所有这些情况下, if ( deleteExpando ) { delete elem[ internalKey ]; } else if ( typeof elem.removeAttribute !== core_strundefined ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } core_deletedIds.push( id ); }

jQuery.fn.detach

detach: function( selector ) { return this.remove( selector, true ); },

jQuery.fn.empty(清空每个匹配元素内的所有内容(所有子节点))

  函数将会移除每个匹配元素的所有子节点(包括文本节点、注释节点等所有类型的节点),会清空相应的缓存数据。

for ( ; (elem = this[i]) != null; i++ ) { //防止内存泄漏移除元素节点缓存 if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); } //移除所有子节点 while ( elem.firstChild ) { elem.removeChild( elem.firstChild ); } // IE<9,select节点需要将option置空 if ( elem.options && jQuery.nodeName( elem, "select" ) ) { elem.options.length = 0; } }

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgzdsg.html