2011-09-28 15:39:05 +00:00
|
|
|
function createSafeFragment( document ) {
|
2011-11-08 02:22:04 +00:00
|
|
|
var list = nodeNames.split( "|" ),
|
2011-09-28 15:39:05 +00:00
|
|
|
safeFrag = document.createDocumentFragment();
|
|
|
|
|
|
|
|
if ( safeFrag.createElement ) {
|
2011-10-23 20:07:07 +00:00
|
|
|
while ( list.length ) {
|
2011-09-28 15:39:05 +00:00
|
|
|
safeFrag.createElement(
|
2011-10-23 20:07:07 +00:00
|
|
|
list.pop()
|
2011-09-28 15:39:05 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return safeFrag;
|
|
|
|
}
|
|
|
|
|
2011-12-18 15:54:30 +00:00
|
|
|
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
|
2011-11-08 02:22:04 +00:00
|
|
|
"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
|
2011-10-23 20:07:07 +00:00
|
|
|
rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
|
2009-07-19 15:48:30 +00:00
|
|
|
rleadingWhitespace = /^\s+/,
|
2012-06-16 01:01:44 +00:00
|
|
|
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
|
2009-10-12 16:26:01 +00:00
|
|
|
rtagName = /<([\w:]+)/,
|
2009-07-19 15:57:43 +00:00
|
|
|
rtbody = /<tbody/i,
|
2010-02-06 00:58:08 +00:00
|
|
|
rhtml = /<|&#?\w+;/,
|
2012-04-05 16:12:38 +00:00
|
|
|
rnoInnerhtml = /<(?:script|style|link)/i,
|
2010-09-22 13:16:28 +00:00
|
|
|
rnocache = /<(?:script|object|embed|option|style)/i,
|
2012-02-10 21:17:12 +00:00
|
|
|
rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
|
2012-04-05 03:00:58 +00:00
|
|
|
rcheckableType = /^(?:checkbox|radio)$/,
|
2011-01-24 10:18:57 +00:00
|
|
|
// checked="checked" or checked
|
2010-11-09 15:34:32 +00:00
|
|
|
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
|
2011-04-12 20:39:30 +00:00
|
|
|
rscriptType = /\/(java|ecma)script/i,
|
2012-05-05 23:27:01 +00:00
|
|
|
rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
|
2009-09-07 20:55:36 +00:00
|
|
|
wrapMap = {
|
|
|
|
option: [ 1, "<select multiple='multiple'>", "</select>" ],
|
|
|
|
legend: [ 1, "<fieldset>", "</fieldset>" ],
|
|
|
|
thead: [ 1, "<table>", "</table>" ],
|
|
|
|
tr: [ 2, "<table><tbody>", "</tbody></table>" ],
|
|
|
|
td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
|
|
|
|
col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
|
2009-12-07 01:26:39 +00:00
|
|
|
area: [ 1, "<map>", "</map>" ],
|
2009-09-07 20:55:36 +00:00
|
|
|
_default: [ 0, "", "" ]
|
2011-09-19 20:42:36 +00:00
|
|
|
},
|
2012-04-17 01:57:41 +00:00
|
|
|
safeFragment = createSafeFragment( document ),
|
|
|
|
fragmentDiv = safeFragment.appendChild( document.createElement("div") );
|
2009-07-19 15:48:30 +00:00
|
|
|
|
2009-09-07 20:55:36 +00:00
|
|
|
wrapMap.optgroup = wrapMap.option;
|
|
|
|
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
|
|
|
|
wrapMap.th = wrapMap.td;
|
|
|
|
|
2012-03-30 15:56:11 +00:00
|
|
|
// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
|
2012-04-05 16:12:38 +00:00
|
|
|
// unless wrapped in a div with non-breaking characters in front of it.
|
2009-09-07 20:55:36 +00:00
|
|
|
if ( !jQuery.support.htmlSerialize ) {
|
2012-04-05 16:12:38 +00:00
|
|
|
wrapMap._default = [ 1, "X<div>", "</div>" ];
|
2009-09-07 20:55:36 +00:00
|
|
|
}
|
|
|
|
|
2009-03-18 21:15:38 +00:00
|
|
|
jQuery.fn.extend({
|
2011-12-06 20:25:38 +00:00
|
|
|
text: function( value ) {
|
|
|
|
return jQuery.access( this, function( value ) {
|
|
|
|
return value === undefined ?
|
|
|
|
jQuery.text( this ) :
|
|
|
|
this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
|
|
|
|
}, null, value, arguments.length );
|
2009-03-18 21:15:38 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
wrapAll: function( html ) {
|
2009-07-19 15:29:03 +00:00
|
|
|
if ( jQuery.isFunction( html ) ) {
|
2010-01-06 20:08:07 +00:00
|
|
|
return this.each(function(i) {
|
|
|
|
jQuery(this).wrapAll( html.call(this, i) );
|
2009-07-19 15:29:03 +00:00
|
|
|
});
|
2009-07-12 21:08:54 +00:00
|
|
|
}
|
2009-07-21 09:17:33 +00:00
|
|
|
|
2009-03-18 21:15:38 +00:00
|
|
|
if ( this[0] ) {
|
|
|
|
// The elements to wrap the target around
|
2009-12-08 19:21:24 +00:00
|
|
|
var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2009-07-19 15:29:03 +00:00
|
|
|
if ( this[0].parentNode ) {
|
2009-03-18 21:15:38 +00:00
|
|
|
wrap.insertBefore( this[0] );
|
2009-07-19 15:29:03 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2009-12-22 00:58:13 +00:00
|
|
|
wrap.map(function() {
|
2009-03-18 21:15:38 +00:00
|
|
|
var elem = this;
|
|
|
|
|
2009-07-19 15:29:03 +00:00
|
|
|
while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
|
2009-03-18 21:15:38 +00:00
|
|
|
elem = elem.firstChild;
|
2009-07-19 15:29:03 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
|
|
|
|
return elem;
|
2011-04-22 01:51:23 +00:00
|
|
|
}).append( this );
|
2009-03-18 21:15:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
wrapInner: function( html ) {
|
2010-01-26 00:16:23 +00:00
|
|
|
if ( jQuery.isFunction( html ) ) {
|
|
|
|
return this.each(function(i) {
|
|
|
|
jQuery(this).wrapInner( html.call(this, i) );
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2009-12-22 00:58:13 +00:00
|
|
|
return this.each(function() {
|
2010-11-09 16:09:07 +00:00
|
|
|
var self = jQuery( this ),
|
|
|
|
contents = self.contents();
|
2010-01-11 21:31:31 +00:00
|
|
|
|
|
|
|
if ( contents.length ) {
|
|
|
|
contents.wrapAll( html );
|
|
|
|
|
|
|
|
} else {
|
|
|
|
self.append( html );
|
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
wrap: function( html ) {
|
2011-11-06 21:59:41 +00:00
|
|
|
var isFunction = jQuery.isFunction( html );
|
|
|
|
|
|
|
|
return this.each(function(i) {
|
|
|
|
jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
|
2009-03-18 21:15:38 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2009-09-25 21:41:21 +00:00
|
|
|
unwrap: function() {
|
2009-12-22 00:58:13 +00:00
|
|
|
return this.parent().each(function() {
|
2009-09-25 21:41:21 +00:00
|
|
|
if ( !jQuery.nodeName( this, "body" ) ) {
|
|
|
|
jQuery( this ).replaceWith( this.childNodes );
|
|
|
|
}
|
|
|
|
}).end();
|
|
|
|
},
|
2009-12-10 04:57:19 +00:00
|
|
|
|
2009-03-18 21:15:38 +00:00
|
|
|
append: function() {
|
2009-12-22 00:58:13 +00:00
|
|
|
return this.domManip(arguments, true, function( elem ) {
|
2012-06-16 01:37:01 +00:00
|
|
|
if ( this.nodeType === 1 || this.nodeType === 11 ) {
|
2009-03-18 21:15:38 +00:00
|
|
|
this.appendChild( elem );
|
2009-07-19 15:29:03 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
prepend: function() {
|
2009-12-22 00:58:13 +00:00
|
|
|
return this.domManip(arguments, true, function( elem ) {
|
2012-06-16 01:37:01 +00:00
|
|
|
if ( this.nodeType === 1 || this.nodeType === 11 ) {
|
2009-03-18 21:15:38 +00:00
|
|
|
this.insertBefore( elem, this.firstChild );
|
2009-07-19 15:29:03 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
before: function() {
|
2009-09-14 22:09:42 +00:00
|
|
|
if ( this[0] && this[0].parentNode ) {
|
2009-12-22 00:58:13 +00:00
|
|
|
return this.domManip(arguments, false, function( elem ) {
|
2009-09-14 22:09:42 +00:00
|
|
|
this.parentNode.insertBefore( elem, this );
|
|
|
|
});
|
A follow-up to [6578] (which stopped adding expandos to elements that didn't have data). That broke jQuery.unique() (so we're now using the unique from Sizzle). Using Sizzle's unique (which also sorts in document order) changed how add, andSelf, parents, nextAll, prevAll, and siblings work. after and before were changed to not use .add() (in order to guarantee their position in the jQuery set). Also, jQuery.data(elem) was updated to return that element's data object (instead of its ID).
$("<div/>").after("<span/>")
=> [ div, span ]
(calling after on a disconnected DOM node adds the nodes to the end of the jQuery set)
$("<div/>").before("<span/>")
=> [ span, div ]
(calling before on a disconnected DOM node adds the nodes to the beginning of the jQuery set)
$("div").add("span")
=> [ div, span, span, div, span ]
(results now come out in document order)
$("div").find("code").andSelf();
=> [ div, code, code ]
(results now come out in document order)
Same goes for .parents(), .nextAll(), .prevAll(), and .siblings().
Exception: .parents() will still return the results in reverse document order.
jQuery.data(elem)
=> { object of data }
(no longer returns the unique ID assigned to the node)
2009-09-25 17:55:20 +00:00
|
|
|
} else if ( arguments.length ) {
|
2011-11-17 16:47:56 +00:00
|
|
|
var set = jQuery.clean( arguments );
|
A follow-up to [6578] (which stopped adding expandos to elements that didn't have data). That broke jQuery.unique() (so we're now using the unique from Sizzle). Using Sizzle's unique (which also sorts in document order) changed how add, andSelf, parents, nextAll, prevAll, and siblings work. after and before were changed to not use .add() (in order to guarantee their position in the jQuery set). Also, jQuery.data(elem) was updated to return that element's data object (instead of its ID).
$("<div/>").after("<span/>")
=> [ div, span ]
(calling after on a disconnected DOM node adds the nodes to the end of the jQuery set)
$("<div/>").before("<span/>")
=> [ span, div ]
(calling before on a disconnected DOM node adds the nodes to the beginning of the jQuery set)
$("div").add("span")
=> [ div, span, span, div, span ]
(results now come out in document order)
$("div").find("code").andSelf();
=> [ div, code, code ]
(results now come out in document order)
Same goes for .parents(), .nextAll(), .prevAll(), and .siblings().
Exception: .parents() will still return the results in reverse document order.
jQuery.data(elem)
=> { object of data }
(no longer returns the unique ID assigned to the node)
2009-09-25 17:55:20 +00:00
|
|
|
set.push.apply( set, this.toArray() );
|
|
|
|
return this.pushStack( set, "before", arguments );
|
2009-09-14 22:09:42 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
after: function() {
|
2009-09-14 22:09:42 +00:00
|
|
|
if ( this[0] && this[0].parentNode ) {
|
2009-12-22 00:58:13 +00:00
|
|
|
return this.domManip(arguments, false, function( elem ) {
|
2009-09-14 22:09:42 +00:00
|
|
|
this.parentNode.insertBefore( elem, this.nextSibling );
|
|
|
|
});
|
A follow-up to [6578] (which stopped adding expandos to elements that didn't have data). That broke jQuery.unique() (so we're now using the unique from Sizzle). Using Sizzle's unique (which also sorts in document order) changed how add, andSelf, parents, nextAll, prevAll, and siblings work. after and before were changed to not use .add() (in order to guarantee their position in the jQuery set). Also, jQuery.data(elem) was updated to return that element's data object (instead of its ID).
$("<div/>").after("<span/>")
=> [ div, span ]
(calling after on a disconnected DOM node adds the nodes to the end of the jQuery set)
$("<div/>").before("<span/>")
=> [ span, div ]
(calling before on a disconnected DOM node adds the nodes to the beginning of the jQuery set)
$("div").add("span")
=> [ div, span, span, div, span ]
(results now come out in document order)
$("div").find("code").andSelf();
=> [ div, code, code ]
(results now come out in document order)
Same goes for .parents(), .nextAll(), .prevAll(), and .siblings().
Exception: .parents() will still return the results in reverse document order.
jQuery.data(elem)
=> { object of data }
(no longer returns the unique ID assigned to the node)
2009-09-25 17:55:20 +00:00
|
|
|
} else if ( arguments.length ) {
|
|
|
|
var set = this.pushStack( this, "after", arguments );
|
2011-11-17 16:47:56 +00:00
|
|
|
set.push.apply( set, jQuery.clean(arguments) );
|
A follow-up to [6578] (which stopped adding expandos to elements that didn't have data). That broke jQuery.unique() (so we're now using the unique from Sizzle). Using Sizzle's unique (which also sorts in document order) changed how add, andSelf, parents, nextAll, prevAll, and siblings work. after and before were changed to not use .add() (in order to guarantee their position in the jQuery set). Also, jQuery.data(elem) was updated to return that element's data object (instead of its ID).
$("<div/>").after("<span/>")
=> [ div, span ]
(calling after on a disconnected DOM node adds the nodes to the end of the jQuery set)
$("<div/>").before("<span/>")
=> [ span, div ]
(calling before on a disconnected DOM node adds the nodes to the beginning of the jQuery set)
$("div").add("span")
=> [ div, span, span, div, span ]
(results now come out in document order)
$("div").find("code").andSelf();
=> [ div, code, code ]
(results now come out in document order)
Same goes for .parents(), .nextAll(), .prevAll(), and .siblings().
Exception: .parents() will still return the results in reverse document order.
jQuery.data(elem)
=> { object of data }
(no longer returns the unique ID assigned to the node)
2009-09-25 17:55:20 +00:00
|
|
|
return set;
|
2009-09-14 22:09:42 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
},
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2010-01-28 20:25:52 +00:00
|
|
|
// keepData is for internal use only--do not document
|
|
|
|
remove: function( selector, keepData ) {
|
|
|
|
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
|
|
|
|
if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
|
|
|
|
if ( !keepData && elem.nodeType === 1 ) {
|
|
|
|
jQuery.cleanData( elem.getElementsByTagName("*") );
|
|
|
|
jQuery.cleanData( [ elem ] );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( elem.parentNode ) {
|
2011-02-10 02:15:32 +00:00
|
|
|
elem.parentNode.removeChild( elem );
|
2010-01-28 20:25:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2010-01-28 20:25:52 +00:00
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
empty: function() {
|
|
|
|
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
|
|
|
|
// Remove element nodes and prevent memory leaks
|
|
|
|
if ( elem.nodeType === 1 ) {
|
|
|
|
jQuery.cleanData( elem.getElementsByTagName("*") );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove any remaining nodes
|
|
|
|
while ( elem.firstChild ) {
|
|
|
|
elem.removeChild( elem.firstChild );
|
|
|
|
}
|
|
|
|
}
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2010-01-28 20:25:52 +00:00
|
|
|
return this;
|
|
|
|
},
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2011-01-20 20:25:04 +00:00
|
|
|
clone: function( dataAndEvents, deepDataAndEvents ) {
|
2011-02-01 13:57:18 +00:00
|
|
|
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
|
2011-01-20 20:25:04 +00:00
|
|
|
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
|
2011-01-28 16:55:39 +00:00
|
|
|
|
2011-01-20 19:25:56 +00:00
|
|
|
return this.map( function () {
|
2011-01-20 20:25:04 +00:00
|
|
|
return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
|
2009-03-18 21:15:38 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
html: function( value ) {
|
2011-12-06 20:25:38 +00:00
|
|
|
return jQuery.access( this, function( value ) {
|
|
|
|
var elem = this[0] || {},
|
|
|
|
i = 0,
|
|
|
|
l = this.length;
|
|
|
|
|
|
|
|
if ( value === undefined ) {
|
|
|
|
return elem.nodeType === 1 ?
|
|
|
|
elem.innerHTML.replace( rinlinejQuery, "" ) :
|
|
|
|
null;
|
2009-09-07 20:55:36 +00:00
|
|
|
}
|
|
|
|
|
2012-04-05 16:12:38 +00:00
|
|
|
// See if we can take a shortcut and just use innerHTML
|
2012-03-30 15:56:11 +00:00
|
|
|
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
|
2012-04-05 16:12:38 +00:00
|
|
|
( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
|
2011-12-06 20:25:38 +00:00
|
|
|
( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
|
|
|
|
!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
|
2010-01-07 18:33:30 +00:00
|
|
|
|
2011-12-06 20:25:38 +00:00
|
|
|
value = value.replace( rxhtmlTag, "<$1></$2>" );
|
2009-09-07 20:55:36 +00:00
|
|
|
|
2011-12-06 20:25:38 +00:00
|
|
|
try {
|
|
|
|
for (; i < l; i++ ) {
|
|
|
|
// Remove element nodes and prevent memory leaks
|
|
|
|
elem = this[i] || {};
|
|
|
|
if ( elem.nodeType === 1 ) {
|
|
|
|
jQuery.cleanData( elem.getElementsByTagName( "*" ) );
|
|
|
|
elem.innerHTML = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
elem = 0;
|
|
|
|
|
|
|
|
// If using innerHTML throws an exception, use the fallback method
|
|
|
|
} catch(e) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( elem ) {
|
|
|
|
this.empty().append( value );
|
|
|
|
}
|
|
|
|
}, null, value, arguments.length );
|
2009-03-18 21:15:38 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
replaceWith: function( value ) {
|
2012-03-30 15:56:11 +00:00
|
|
|
if ( this[0] && this[0].parentNode && this[0].parentNode.nodeType != 11 ) {
|
2010-01-11 21:25:01 +00:00
|
|
|
// Make sure that the elements are removed from the DOM before they are inserted
|
|
|
|
// this can help fix replacing a parent with child elements
|
2010-02-02 02:48:05 +00:00
|
|
|
if ( jQuery.isFunction( value ) ) {
|
2010-01-26 00:22:28 +00:00
|
|
|
return this.each(function(i) {
|
|
|
|
var self = jQuery(this), old = self.html();
|
|
|
|
self.replaceWith( value.call( this, i, old ) );
|
|
|
|
});
|
2010-01-11 21:25:01 +00:00
|
|
|
}
|
|
|
|
|
2010-02-02 02:48:05 +00:00
|
|
|
if ( typeof value !== "string" ) {
|
2010-11-09 16:09:07 +00:00
|
|
|
value = jQuery( value ).detach();
|
2010-02-02 02:48:05 +00:00
|
|
|
}
|
|
|
|
|
2009-12-22 00:58:13 +00:00
|
|
|
return this.each(function() {
|
2010-11-09 16:09:07 +00:00
|
|
|
var next = this.nextSibling,
|
|
|
|
parent = this.parentNode;
|
2009-12-05 20:30:36 +00:00
|
|
|
|
2010-11-09 16:09:07 +00:00
|
|
|
jQuery( this ).remove();
|
2009-12-05 20:30:36 +00:00
|
|
|
|
|
|
|
if ( next ) {
|
|
|
|
jQuery(next).before( value );
|
|
|
|
} else {
|
|
|
|
jQuery(parent).append( value );
|
|
|
|
}
|
|
|
|
});
|
2009-09-14 22:09:42 +00:00
|
|
|
}
|
2012-03-30 15:56:11 +00:00
|
|
|
|
|
|
|
return this.length ?
|
|
|
|
this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
|
|
|
|
this;
|
2009-03-18 21:15:38 +00:00
|
|
|
},
|
|
|
|
|
2009-07-21 15:57:51 +00:00
|
|
|
detach: function( selector ) {
|
|
|
|
return this.remove( selector, true );
|
|
|
|
},
|
|
|
|
|
2009-03-18 21:15:38 +00:00
|
|
|
domManip: function( args, table, callback ) {
|
2012-06-16 02:17:05 +00:00
|
|
|
|
|
|
|
// Flatten any nested arrays
|
|
|
|
args = [].concat.apply( [], args );
|
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
var results, first, fragment, iNoClone,
|
|
|
|
i = 0,
|
2010-11-09 16:09:07 +00:00
|
|
|
value = args[0],
|
2012-04-05 03:00:58 +00:00
|
|
|
scripts = [],
|
|
|
|
l = this.length;
|
2009-07-12 20:19:43 +00:00
|
|
|
|
2010-01-25 23:43:33 +00:00
|
|
|
// We can't cloneNode fragments that contain checked, in WebKit
|
2012-04-05 03:00:58 +00:00
|
|
|
if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
|
2010-01-25 23:43:33 +00:00
|
|
|
return this.each(function() {
|
2012-04-05 03:00:58 +00:00
|
|
|
jQuery(this).domManip( args, table, callback );
|
2010-01-25 23:43:33 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2009-07-12 20:19:43 +00:00
|
|
|
if ( jQuery.isFunction(value) ) {
|
2010-01-06 20:08:07 +00:00
|
|
|
return this.each(function(i) {
|
|
|
|
var self = jQuery(this);
|
2012-04-05 03:00:58 +00:00
|
|
|
args[0] = value.call( this, i, table ? self.html() : undefined );
|
2010-01-25 23:43:33 +00:00
|
|
|
self.domManip( args, table, callback );
|
2009-07-12 20:19:43 +00:00
|
|
|
});
|
2009-07-19 15:48:30 +00:00
|
|
|
}
|
2009-07-11 13:49:46 +00:00
|
|
|
|
2009-03-18 21:15:38 +00:00
|
|
|
if ( this[0] ) {
|
2012-03-05 21:57:34 +00:00
|
|
|
results = jQuery.buildFragment( args, this, scripts );
|
2010-01-28 22:18:27 +00:00
|
|
|
fragment = results.fragment;
|
2012-04-16 02:54:18 +00:00
|
|
|
first = fragment.firstChild;
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
if ( fragment.childNodes.length === 1 ) {
|
|
|
|
fragment = first;
|
2010-01-28 22:18:27 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2009-07-11 13:49:46 +00:00
|
|
|
if ( first ) {
|
|
|
|
table = table && jQuery.nodeName( first, "tr" );
|
2009-03-23 01:55:17 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
// Use the original fragment for the last item instead of the first because it can end up
|
|
|
|
// being emptied incorrectly in certain situations (#8070).
|
|
|
|
// Fragments from the fragment cache must always be cloned and never used in place.
|
|
|
|
for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
|
2009-07-11 13:49:46 +00:00
|
|
|
callback.call(
|
2012-04-05 03:00:58 +00:00
|
|
|
table && jQuery.nodeName( this[i], "table" ) ?
|
|
|
|
findOrAppend( this[i], "tbody" ) :
|
2009-07-11 13:49:46 +00:00
|
|
|
this[i],
|
2012-04-05 03:00:58 +00:00
|
|
|
i === iNoClone ?
|
|
|
|
fragment :
|
|
|
|
jQuery.clone( fragment, true, true )
|
2009-07-11 13:49:46 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-06-26 18:49:56 +00:00
|
|
|
// Fix #11809: Avoid leaking memory
|
|
|
|
fragment = first = null;
|
|
|
|
|
2010-01-28 22:18:27 +00:00
|
|
|
if ( scripts.length ) {
|
2011-12-09 02:27:05 +00:00
|
|
|
jQuery.each( scripts, function( i, elem ) {
|
|
|
|
if ( elem.src ) {
|
2012-07-06 13:22:44 +00:00
|
|
|
if ( jQuery.ajax ) {
|
|
|
|
jQuery.ajax({
|
|
|
|
url: elem.src,
|
|
|
|
type: "GET",
|
|
|
|
dataType: "script",
|
|
|
|
async: false,
|
|
|
|
global: false,
|
|
|
|
throws: true
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
jQuery.error("no ajax");
|
|
|
|
}
|
2011-12-09 02:27:05 +00:00
|
|
|
} else {
|
2012-05-12 21:26:39 +00:00
|
|
|
jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
|
2011-12-09 02:27:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( elem.parentNode ) {
|
|
|
|
elem.parentNode.removeChild( elem );
|
|
|
|
}
|
|
|
|
});
|
2009-07-11 13:49:46 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
function findOrAppend( elem, tag ) {
|
|
|
|
return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
|
2010-03-02 02:24:49 +00:00
|
|
|
}
|
|
|
|
|
2011-01-20 19:25:56 +00:00
|
|
|
function cloneCopyEvent( src, dest ) {
|
2009-12-02 22:15:09 +00:00
|
|
|
|
2011-01-20 19:25:56 +00:00
|
|
|
if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
|
|
|
|
return;
|
|
|
|
}
|
2010-12-22 15:13:28 +00:00
|
|
|
|
2011-09-19 20:13:14 +00:00
|
|
|
var type, i, l,
|
|
|
|
oldData = jQuery._data( src ),
|
|
|
|
curData = jQuery._data( dest, oldData ),
|
|
|
|
events = oldData.events;
|
|
|
|
|
|
|
|
if ( events ) {
|
|
|
|
delete curData.handle;
|
|
|
|
curData.events = {};
|
|
|
|
|
|
|
|
for ( type in events ) {
|
|
|
|
for ( i = 0, l = events[ type ].length; i < l; i++ ) {
|
2012-01-28 19:58:00 +00:00
|
|
|
jQuery.event.add( dest, type, events[ type ][ i ] );
|
2009-12-22 17:04:17 +00:00
|
|
|
}
|
|
|
|
}
|
2011-01-20 19:25:56 +00:00
|
|
|
}
|
2011-09-19 20:13:14 +00:00
|
|
|
|
|
|
|
// make the cloned public data object a copy from the original
|
|
|
|
if ( curData.data ) {
|
|
|
|
curData.data = jQuery.extend( {}, curData.data );
|
|
|
|
}
|
2009-12-02 22:15:09 +00:00
|
|
|
}
|
|
|
|
|
2011-03-08 17:07:05 +00:00
|
|
|
function cloneFixAttributes( src, dest ) {
|
2011-04-22 01:51:23 +00:00
|
|
|
var nodeName;
|
|
|
|
|
2010-12-13 01:23:22 +00:00
|
|
|
// We do not need to do anything for non-Elements
|
|
|
|
if ( dest.nodeType !== 1 ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// clearAttributes removes the attributes, which we don't want,
|
|
|
|
// but also removes the attachEvent events, which we *do* want
|
2011-04-14 03:45:58 +00:00
|
|
|
if ( dest.clearAttributes ) {
|
|
|
|
dest.clearAttributes();
|
|
|
|
}
|
2010-12-13 01:23:22 +00:00
|
|
|
|
|
|
|
// mergeAttributes, in contrast, only merges back on the
|
|
|
|
// original attributes, not the events
|
2011-04-14 03:45:58 +00:00
|
|
|
if ( dest.mergeAttributes ) {
|
|
|
|
dest.mergeAttributes( src );
|
|
|
|
}
|
2010-12-13 01:23:22 +00:00
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
nodeName = dest.nodeName.toLowerCase();
|
|
|
|
|
2010-12-13 01:23:22 +00:00
|
|
|
// IE6-8 fail to clone children inside object elements that use
|
|
|
|
// the proprietary classid attribute value (rather than the type
|
|
|
|
// attribute) to identify the type of content to display
|
|
|
|
if ( nodeName === "object" ) {
|
|
|
|
dest.outerHTML = src.outerHTML;
|
|
|
|
|
2012-03-23 15:31:53 +00:00
|
|
|
// This path appears unavoidable for IE9. When cloning an object
|
|
|
|
// element in IE9, the outerHTML strategy above is not sufficient.
|
|
|
|
// If the src has innerHTML and the destination does not,
|
|
|
|
// copy the src.innerHTML into the dest.innerHTML. #10324
|
|
|
|
if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
|
|
|
|
dest.innerHTML = src.innerHTML;
|
|
|
|
}
|
2012-04-11 01:38:11 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
|
2011-01-10 00:38:44 +00:00
|
|
|
// IE6-8 fails to persist the checked state of a cloned checkbox
|
|
|
|
// or radio button. Worse, IE6-7 fail to give the cloned element
|
|
|
|
// a checked appearance if the defaultChecked value isn't also set
|
|
|
|
if ( src.checked ) {
|
|
|
|
dest.defaultChecked = dest.checked = src.checked;
|
|
|
|
}
|
|
|
|
|
|
|
|
// IE6-7 get confused and end up setting the value of a cloned
|
|
|
|
// checkbox/radio button to an empty string instead of "on"
|
|
|
|
if ( dest.value !== src.value ) {
|
|
|
|
dest.value = src.value;
|
|
|
|
}
|
2010-12-13 01:23:22 +00:00
|
|
|
|
2010-12-13 02:01:47 +00:00
|
|
|
// IE6-8 fails to return the selected option to the default selected
|
2010-12-13 01:23:22 +00:00
|
|
|
// state when cloning options
|
2010-12-16 07:29:06 +00:00
|
|
|
} else if ( nodeName === "option" ) {
|
2010-12-13 01:23:22 +00:00
|
|
|
dest.selected = src.defaultSelected;
|
2011-01-10 00:38:44 +00:00
|
|
|
|
|
|
|
// IE6-8 fails to set the defaultValue to the correct value when
|
|
|
|
// cloning other types of input fields
|
|
|
|
} else if ( nodeName === "input" || nodeName === "textarea" ) {
|
|
|
|
dest.defaultValue = src.defaultValue;
|
2012-02-17 19:17:20 +00:00
|
|
|
|
|
|
|
// IE blanks contents when cloning scripts
|
|
|
|
} else if ( nodeName === "script" && dest.text !== src.text ) {
|
|
|
|
dest.text = src.text;
|
2010-12-13 01:23:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Event data gets referenced instead of copied if the expando
|
|
|
|
// gets copied too
|
|
|
|
dest.removeAttribute( jQuery.expando );
|
|
|
|
}
|
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
jQuery.buildFragment = function( args, context, scripts ) {
|
|
|
|
var fragment, cacheable, cachehit,
|
2011-10-23 20:07:07 +00:00
|
|
|
first = args[ 0 ];
|
2011-04-30 14:42:36 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
// Set context from what may come in as undefined or a jQuery collection or a node
|
|
|
|
context = context || document;
|
|
|
|
context = (context[0] || context).ownerDocument || context[0] || context;
|
2011-04-30 14:42:36 +00:00
|
|
|
|
2011-11-08 02:22:04 +00:00
|
|
|
// Ensure that an attr object doesn't incorrectly stand in as a document object
|
2011-04-30 14:42:36 +00:00
|
|
|
// Chrome and Firefox seem to allow this to occur and will throw exception
|
|
|
|
// Fixes #8950
|
2012-04-05 03:00:58 +00:00
|
|
|
if ( typeof context.createDocumentFragment === "undefined" ) {
|
|
|
|
context = document;
|
2011-04-30 14:42:36 +00:00
|
|
|
}
|
2010-01-29 05:22:20 +00:00
|
|
|
|
2010-12-27 19:43:52 +00:00
|
|
|
// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
|
2010-01-29 05:22:20 +00:00
|
|
|
// Cloning options loses the selected state, so don't cache them
|
2010-02-01 23:52:12 +00:00
|
|
|
// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
|
2010-01-29 05:22:20 +00:00
|
|
|
// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
|
2011-10-23 20:07:07 +00:00
|
|
|
// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
|
2012-04-05 03:00:58 +00:00
|
|
|
if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
|
2011-10-23 20:07:07 +00:00
|
|
|
first.charAt(0) === "<" && !rnocache.test( first ) &&
|
|
|
|
(jQuery.support.checkClone || !rchecked.test( first )) &&
|
2011-11-08 05:05:33 +00:00
|
|
|
(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
|
2009-09-07 18:58:01 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
// Mark cacheable and look for a hit
|
2009-09-07 18:58:01 +00:00
|
|
|
cacheable = true;
|
2012-04-05 03:00:58 +00:00
|
|
|
fragment = jQuery.fragments[ first ];
|
|
|
|
cachehit = fragment !== undefined;
|
2012-04-16 01:59:25 +00:00
|
|
|
}
|
2009-09-07 18:58:01 +00:00
|
|
|
|
|
|
|
if ( !fragment ) {
|
2012-04-05 03:00:58 +00:00
|
|
|
fragment = context.createDocumentFragment();
|
|
|
|
jQuery.clean( args, context, fragment, scripts );
|
2012-04-16 01:59:25 +00:00
|
|
|
|
|
|
|
// Update the cache, but only store false
|
|
|
|
// unless this is a second parsing of the same content
|
|
|
|
if ( cacheable ) {
|
2012-04-05 03:00:58 +00:00
|
|
|
jQuery.fragments[ first ] = cachehit && fragment;
|
2012-04-16 01:59:25 +00:00
|
|
|
}
|
2009-09-07 18:58:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return { fragment: fragment, cacheable: cacheable };
|
2010-09-08 22:13:35 +00:00
|
|
|
};
|
2009-09-07 18:58:01 +00:00
|
|
|
|
2009-07-11 13:49:46 +00:00
|
|
|
jQuery.fragments = {};
|
|
|
|
|
2009-03-18 21:15:38 +00:00
|
|
|
jQuery.each({
|
|
|
|
appendTo: "append",
|
|
|
|
prependTo: "prepend",
|
|
|
|
insertBefore: "before",
|
|
|
|
insertAfter: "after",
|
|
|
|
replaceAll: "replaceWith"
|
2009-12-22 00:58:13 +00:00
|
|
|
}, function( name, original ) {
|
2009-03-18 21:15:38 +00:00
|
|
|
jQuery.fn[ name ] = function( selector ) {
|
2010-11-09 16:09:07 +00:00
|
|
|
var ret = [],
|
|
|
|
insert = jQuery( selector ),
|
2010-02-13 07:49:04 +00:00
|
|
|
parent = this.length === 1 && this[0].parentNode;
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2012-04-17 01:57:41 +00:00
|
|
|
if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && insert.length === 1 ) {
|
2010-01-28 21:30:37 +00:00
|
|
|
insert[ original ]( this[0] );
|
|
|
|
return this;
|
|
|
|
} else {
|
|
|
|
for ( var i = 0, l = insert.length; i < l; i++ ) {
|
2011-10-27 19:32:49 +00:00
|
|
|
var elems = ( i > 0 ? this.clone(true) : this ).get();
|
2010-03-05 14:59:58 +00:00
|
|
|
jQuery( insert[i] )[ original ]( elems );
|
2010-01-28 21:30:37 +00:00
|
|
|
ret = ret.concat( elems );
|
|
|
|
}
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2010-01-28 21:30:37 +00:00
|
|
|
return this.pushStack( ret, name, insert.selector );
|
2009-03-18 21:15:38 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
2011-02-23 18:18:44 +00:00
|
|
|
function getAll( elem ) {
|
2011-10-12 04:06:30 +00:00
|
|
|
if ( typeof elem.getElementsByTagName !== "undefined" ) {
|
2011-02-23 18:18:44 +00:00
|
|
|
return elem.getElementsByTagName( "*" );
|
2011-05-11 12:12:19 +00:00
|
|
|
|
2011-10-12 04:06:30 +00:00
|
|
|
} else if ( typeof elem.querySelectorAll !== "undefined" ) {
|
2011-02-23 18:18:44 +00:00
|
|
|
return elem.querySelectorAll( "*" );
|
|
|
|
|
|
|
|
} else {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
// Used in clean, fixes the defaultChecked property
|
|
|
|
function fixDefaultChecked( elem ) {
|
2012-04-05 03:00:58 +00:00
|
|
|
if ( rcheckableType.test( elem.type ) ) {
|
2011-04-22 01:51:23 +00:00
|
|
|
elem.defaultChecked = elem.checked;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-03-18 21:15:38 +00:00
|
|
|
jQuery.extend({
|
2011-01-20 20:25:04 +00:00
|
|
|
clone: function( elem, dataAndEvents, deepDataAndEvents ) {
|
2011-11-08 02:22:04 +00:00
|
|
|
var srcElements,
|
|
|
|
destElements,
|
|
|
|
i,
|
2012-04-17 01:57:41 +00:00
|
|
|
clone;
|
|
|
|
|
|
|
|
if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
|
|
|
|
clone = elem.cloneNode( true );
|
|
|
|
|
|
|
|
// IE<=8 does not properly clone detached, unknown element nodes
|
|
|
|
} else {
|
|
|
|
fragmentDiv.innerHTML = elem.outerHTML;
|
|
|
|
fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
|
|
|
|
}
|
2011-01-20 19:25:56 +00:00
|
|
|
|
2011-02-23 18:18:44 +00:00
|
|
|
if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
|
|
|
|
(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
|
2011-01-20 19:25:56 +00:00
|
|
|
// IE copies events bound via attachEvent when using cloneNode.
|
|
|
|
// Calling detachEvent on the clone will also remove the events
|
|
|
|
// from the original. In order to get around this, we use some
|
|
|
|
// proprietary methods to clear the events. Thanks to MooTools
|
|
|
|
// guys for this hotness.
|
|
|
|
|
2011-02-01 22:54:02 +00:00
|
|
|
cloneFixAttributes( elem, clone );
|
|
|
|
|
2011-11-08 02:22:04 +00:00
|
|
|
// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
|
2011-02-23 18:18:44 +00:00
|
|
|
srcElements = getAll( elem );
|
|
|
|
destElements = getAll( clone );
|
2011-01-20 19:25:56 +00:00
|
|
|
|
|
|
|
// Weird iteration because IE will replace the length property
|
|
|
|
// with an element if you are cloning the body and one of the
|
|
|
|
// elements on the page has a name or id of "length"
|
2011-01-21 23:41:42 +00:00
|
|
|
for ( i = 0; srcElements[i]; ++i ) {
|
2011-06-15 15:14:52 +00:00
|
|
|
// Ensure that the destination node is not null; Fixes #9587
|
|
|
|
if ( destElements[i] ) {
|
|
|
|
cloneFixAttributes( srcElements[i], destElements[i] );
|
|
|
|
}
|
2011-01-20 19:25:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Copy the events from the original to the clone
|
2011-01-20 20:25:04 +00:00
|
|
|
if ( dataAndEvents ) {
|
|
|
|
cloneCopyEvent( elem, clone );
|
2011-01-20 19:25:56 +00:00
|
|
|
|
2011-02-23 18:18:44 +00:00
|
|
|
if ( deepDataAndEvents ) {
|
|
|
|
srcElements = getAll( elem );
|
|
|
|
destElements = getAll( clone );
|
2011-01-20 19:25:56 +00:00
|
|
|
|
2011-02-23 18:18:44 +00:00
|
|
|
for ( i = 0; srcElements[i]; ++i ) {
|
|
|
|
cloneCopyEvent( srcElements[i], destElements[i] );
|
2011-01-20 19:25:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-02-23 18:18:44 +00:00
|
|
|
|
2011-05-25 19:18:13 +00:00
|
|
|
srcElements = destElements = null;
|
|
|
|
|
2011-01-20 19:25:56 +00:00
|
|
|
// Return the cloned set
|
|
|
|
return clone;
|
2011-04-02 01:13:01 +00:00
|
|
|
},
|
|
|
|
|
2009-09-07 18:58:01 +00:00
|
|
|
clean: function( elems, context, fragment, scripts ) {
|
2012-04-05 03:00:58 +00:00
|
|
|
var j, safe, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
|
|
|
|
i = 0,
|
2012-04-16 02:54:18 +00:00
|
|
|
ret = [];
|
2011-04-12 22:30:21 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
// Ensure that context is a document
|
|
|
|
if ( !context || typeof context.createDocumentFragment === "undefined" ) {
|
|
|
|
context = document;
|
2009-07-19 15:29:03 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
// Use the already-created safe fragment if context permits
|
|
|
|
for ( safe = context === document && safeFragment; (elem = elems[i]) != null; i++ ) {
|
2009-07-19 15:29:03 +00:00
|
|
|
if ( typeof elem === "number" ) {
|
2009-12-22 01:13:16 +00:00
|
|
|
elem += "";
|
2009-07-19 15:29:03 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2009-12-22 00:58:13 +00:00
|
|
|
if ( !elem ) {
|
2010-01-28 21:30:37 +00:00
|
|
|
continue;
|
2009-12-22 00:58:13 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
|
|
|
|
// Convert html string into DOM nodes
|
2011-04-22 01:51:23 +00:00
|
|
|
if ( typeof elem === "string" ) {
|
|
|
|
if ( !rhtml.test( elem ) ) {
|
|
|
|
elem = context.createTextNode( elem );
|
|
|
|
} else {
|
2012-04-05 03:00:58 +00:00
|
|
|
// Ensure a safe container in which to render the html
|
|
|
|
safe = safe || createSafeFragment( context );
|
|
|
|
div = div || safe.appendChild( context.createElement("div") );
|
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
// Fix "XHTML"-style tags in all browsers
|
|
|
|
elem = elem.replace(rxhtmlTag, "<$1></$2>");
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
// Go to html and back, then peel off extra wrappers
|
2012-04-05 03:00:58 +00:00
|
|
|
tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
|
|
|
|
wrap = wrapMap[ tag ] || wrapMap._default;
|
|
|
|
depth = wrap[0];
|
2011-04-22 01:51:23 +00:00
|
|
|
div.innerHTML = wrap[1] + elem + wrap[2];
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
// Move to the right depth
|
|
|
|
while ( depth-- ) {
|
|
|
|
div = div.lastChild;
|
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
// Remove IE's autoinserted <tbody> from table fragments
|
|
|
|
if ( !jQuery.support.tbody ) {
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
// String was a <table>, *may* have spurious <tbody>
|
2012-04-05 03:00:58 +00:00
|
|
|
hasBody = rtbody.test(elem);
|
2011-04-22 01:51:23 +00:00
|
|
|
tbody = tag === "table" && !hasBody ?
|
|
|
|
div.firstChild && div.firstChild.childNodes :
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
// String was a bare <thead> or <tfoot>
|
|
|
|
wrap[1] === "<table>" && !hasBody ?
|
|
|
|
div.childNodes :
|
|
|
|
[];
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2011-05-03 19:02:26 +00:00
|
|
|
for ( j = tbody.length - 1; j >= 0 ; --j ) {
|
2011-04-22 01:51:23 +00:00
|
|
|
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
|
|
|
|
tbody[ j ].parentNode.removeChild( tbody[ j ] );
|
|
|
|
}
|
2009-07-19 15:29:03 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
}
|
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
// IE completely kills leading whitespace when innerHTML is used
|
|
|
|
if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
|
|
|
|
div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
|
|
|
|
}
|
2009-07-19 15:29:03 +00:00
|
|
|
|
2011-04-22 01:51:23 +00:00
|
|
|
elem = div.childNodes;
|
2012-03-02 17:03:32 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
// Remember the top-level container for proper cleanup
|
|
|
|
div = safe.lastChild;
|
2012-04-16 02:54:18 +00:00
|
|
|
}
|
|
|
|
}
|
2012-04-05 03:00:58 +00:00
|
|
|
|
|
|
|
if ( elem.nodeType ) {
|
|
|
|
ret.push( elem );
|
|
|
|
} else {
|
|
|
|
ret = jQuery.merge( ret, elem );
|
2012-04-16 02:54:18 +00:00
|
|
|
}
|
|
|
|
}
|
2012-04-05 03:00:58 +00:00
|
|
|
|
|
|
|
// Fix #11356: Clear elements from safeFragment
|
|
|
|
if ( div ) {
|
|
|
|
safe.removeChild( div );
|
2012-06-26 18:49:56 +00:00
|
|
|
elem = div = safe = null;
|
2012-04-16 02:54:18 +00:00
|
|
|
}
|
2009-03-23 01:55:17 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
// Reset defaultChecked for any radios and checkboxes
|
2012-04-16 02:54:18 +00:00
|
|
|
// about to be appended to the DOM in IE 6/7 (#8060)
|
|
|
|
if ( !jQuery.support.appendChecked ) {
|
2012-04-05 03:00:58 +00:00
|
|
|
for ( i = 0; (elem = ret[i]) != null; i++ ) {
|
|
|
|
if ( jQuery.nodeName( elem, "input" ) ) {
|
|
|
|
fixDefaultChecked( elem );
|
|
|
|
} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
|
|
|
|
jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
|
2011-04-22 01:51:23 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
}
|
2012-04-16 02:54:18 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
// Append elements to a provided document fragment
|
2009-03-18 21:15:38 +00:00
|
|
|
if ( fragment ) {
|
2012-04-05 03:00:58 +00:00
|
|
|
// Special handling of each script element
|
|
|
|
handleScript = function( elem ) {
|
|
|
|
// Check if we consider it executable
|
|
|
|
if ( !elem.type || rscriptType.test( elem.type ) ) {
|
|
|
|
// Detach the script and store it in the scripts array (if provided) or the fragment
|
|
|
|
// Return truthy to indicate that it has been handled
|
|
|
|
return scripts ?
|
|
|
|
scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
|
|
|
|
fragment.appendChild( elem );
|
|
|
|
}
|
2011-04-12 22:30:21 +00:00
|
|
|
};
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
for ( i = 0; (elem = ret[i]) != null; i++ ) {
|
|
|
|
// Check if we're done after handling an executable script
|
|
|
|
if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
|
|
|
|
// Append to fragment and handle embedded scripts
|
|
|
|
fragment.appendChild( elem );
|
|
|
|
if ( typeof elem.getElementsByTagName !== "undefined" ) {
|
|
|
|
// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
|
|
|
|
jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
|
2011-04-12 20:39:30 +00:00
|
|
|
|
2012-04-05 03:00:58 +00:00
|
|
|
// Splice the scripts into ret after their former ancestor and advance our index beyond them
|
2011-04-12 20:39:30 +00:00
|
|
|
ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
|
2012-04-05 03:00:58 +00:00
|
|
|
i += jsTags.length;
|
2009-07-19 15:48:30 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
2010-01-24 02:20:19 +00:00
|
|
|
},
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2012-07-06 13:22:44 +00:00
|
|
|
cleanData: function( elems, /* internal */ acceptData ) {
|
|
|
|
var data, id, elem, type,
|
|
|
|
i = 0,
|
|
|
|
internalKey = jQuery.expando,
|
2011-09-19 20:13:14 +00:00
|
|
|
cache = jQuery.cache,
|
2012-07-06 13:22:44 +00:00
|
|
|
deleteExpando = jQuery.support.deleteExpando,
|
|
|
|
special = jQuery.event.special;
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2012-07-06 13:22:44 +00:00
|
|
|
for ( ; (elem = elems[i]) != null; i++ ) {
|
2010-03-02 18:56:15 +00:00
|
|
|
|
2012-07-06 13:22:44 +00:00
|
|
|
if ( acceptData || jQuery.acceptData( elem ) ) {
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2012-07-06 13:22:44 +00:00
|
|
|
id = elem[ internalKey ];
|
|
|
|
data = id && cache[ id ];
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2012-07-06 13:22:44 +00:00
|
|
|
if ( data ) {
|
|
|
|
if ( data.events ) {
|
|
|
|
for ( type in data.events ) {
|
|
|
|
if ( special[ type ] ) {
|
|
|
|
jQuery.event.remove( elem, type );
|
2010-02-13 11:10:43 +00:00
|
|
|
|
2012-07-06 13:22:44 +00:00
|
|
|
// This is a shortcut to avoid jQuery.event.remove's overhead
|
|
|
|
} else {
|
|
|
|
jQuery.removeEvent( elem, type, data.handle );
|
|
|
|
}
|
2010-02-13 11:10:43 +00:00
|
|
|
}
|
2010-01-28 20:25:52 +00:00
|
|
|
}
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2012-07-06 13:22:44 +00:00
|
|
|
// Remove cache only if it was not already removed by jQuery.event.remove
|
|
|
|
if ( cache[ id ] ) {
|
2010-02-13 11:57:58 +00:00
|
|
|
|
2012-07-06 13:22:44 +00:00
|
|
|
delete cache[ id ];
|
|
|
|
|
|
|
|
// IE does not allow us to delete expando properties from nodes,
|
|
|
|
// nor does it have a removeAttribute function on Document nodes;
|
|
|
|
// we must handle all of these cases
|
|
|
|
if ( deleteExpando ) {
|
|
|
|
delete elem[ internalKey ];
|
2010-12-07 01:36:42 +00:00
|
|
|
|
2012-07-06 13:22:44 +00:00
|
|
|
} else if ( elem.removeAttribute ) {
|
|
|
|
elem.removeAttribute( internalKey );
|
|
|
|
|
|
|
|
} else {
|
|
|
|
elem[ internalKey ] = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
jQuery.deletedIds.push( id );
|
|
|
|
}
|
2012-04-05 01:17:01 +00:00
|
|
|
}
|
2010-01-28 20:25:52 +00:00
|
|
|
}
|
2009-03-18 21:15:38 +00:00
|
|
|
}
|
|
|
|
}
|
2010-01-25 02:37:05 +00:00
|
|
|
});
|