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