You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

buildFragment.js 2.4KB

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