buildFragment.js 2.4 KB

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