Manipulation: privatize buildFragment() function
[jquery.git] / src / manipulation / buildFragment.js
blobd5cb4062af2d4d82b91e9f18f92358f46b9c2a01
1 define([
2         "../core",
3         "./var/rtagName",
4         "./var/rscriptType",
5         "./wrapMap",
6         "./getAll",
7         "./setGlobalEval"
8 ], function( jQuery, rtagName, rscriptType, wrapMap, getAll, setGlobalEval ) {
10 var rhtml = /<|&#?\w+;/;
12 function buildFragment( elems, context, scripts, selection, ignored ) {
13         var elem, tmp, tag, wrap, contains, j,
14                 fragment = context.createDocumentFragment(),
15                 nodes = [],
16                 i = 0,
17                 l = elems.length;
19         for ( ; i < l; i++ ) {
20                 elem = elems[ i ];
22                 if ( elem || elem === 0 ) {
24                         // Add nodes directly
25                         if ( jQuery.type( elem ) === "object" ) {
26                                 // Support: Android<4.1, PhantomJS<2
27                                 // push.apply(_, arraylike) throws on ancient WebKit
28                                 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
30                         // Convert non-html into a text node
31                         } else if ( !rhtml.test( elem ) ) {
32                                 nodes.push( context.createTextNode( elem ) );
34                         // Convert html into DOM nodes
35                         } else {
36                                 tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
38                                 // Deserialize a standard representation
39                                 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
40                                 wrap = wrapMap[ tag ] || wrapMap._default;
41                                 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
43                                 // Descend through wrappers to the right content
44                                 j = wrap[ 0 ];
45                                 while ( j-- ) {
46                                         tmp = tmp.lastChild;
47                                 }
49                                 // Support: Android<4.1, PhantomJS<2
50                                 // push.apply(_, arraylike) throws on ancient WebKit
51                                 jQuery.merge( nodes, tmp.childNodes );
53                                 // Remember the top-level container
54                                 tmp = fragment.firstChild;
56                                 // Ensure the created nodes are orphaned (#12392)
57                                 tmp.textContent = "";
58                         }
59                 }
60         }
62         // Remove wrapper from fragment
63         fragment.textContent = "";
65         i = 0;
66         while ( ( elem = nodes[ i++ ] ) ) {
68                 // Skip elements already in the context collection (trac-4087)
69                 if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
70                         if ( ignored ) {
71                                 ignored.push( elem );
72                         }
73                         continue;
74                 }
76                 contains = jQuery.contains( elem.ownerDocument, elem );
78                 // Append to fragment
79                 tmp = getAll( fragment.appendChild( elem ), "script" );
81                 // Preserve script evaluation history
82                 if ( contains ) {
83                         setGlobalEval( tmp );
84                 }
86                 // Capture executables
87                 if ( scripts ) {
88                         j = 0;
89                         while ( ( elem = tmp[ j++ ] ) ) {
90                                 if ( rscriptType.test( elem.type || "" ) ) {
91                                         scripts.push( elem );
92                                 }
93                         }
94                 }
95         }
97         return fragment;
100 return buildFragment;