mirror of
https://github.com/jquery/jquery.git
synced 2026-02-02 05:04:59 -05:00
Manipulation: Detect sneaky no-content replaceWith input
Fixes gh-2204
Ref 642e9a4557
Closes gh-1752
Closes gh-2206
This commit is contained in:
@@ -201,7 +201,7 @@ jQuery.extend({
|
||||
return clone;
|
||||
},
|
||||
|
||||
buildFragment: function( elems, context, scripts, selection ) {
|
||||
buildFragment: function( elems, context, scripts, selection, ignored ) {
|
||||
var elem, tmp, tag, wrap, contains, j,
|
||||
fragment = context.createDocumentFragment(),
|
||||
nodes = [],
|
||||
@@ -257,9 +257,11 @@ jQuery.extend({
|
||||
i = 0;
|
||||
while ( (elem = nodes[ i++ ]) ) {
|
||||
|
||||
// #4087 - If origin and destination elements are the same, and this is
|
||||
// that element, do not do anything
|
||||
// Skip elements already in the context collection (trac-4087)
|
||||
if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
|
||||
if ( ignored ) {
|
||||
ignored.push( elem );
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -446,28 +448,28 @@ jQuery.fn.extend({
|
||||
},
|
||||
|
||||
replaceWith: function() {
|
||||
var arg = arguments[ 0 ];
|
||||
var ignored = [];
|
||||
|
||||
// Make the changes, replacing each context element with the new content
|
||||
this.domManip( arguments, function( elem ) {
|
||||
arg = this.parentNode;
|
||||
// Make the changes, replacing each non-ignored context element with the new content
|
||||
return this.domManip( arguments, function( elem ) {
|
||||
var parent = this.parentNode;
|
||||
|
||||
jQuery.cleanData( getAll( this ) );
|
||||
|
||||
if ( arg ) {
|
||||
arg.replaceChild( elem, this );
|
||||
if ( jQuery.inArray( this, ignored ) < 0 ) {
|
||||
jQuery.cleanData( getAll( this ) );
|
||||
if ( parent ) {
|
||||
parent.replaceChild( elem, this );
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Force removal if there was no new content (e.g., from empty arguments)
|
||||
return arg && (arg.length || arg.nodeType) ? this : this.remove();
|
||||
// Force callback invocation
|
||||
}, ignored );
|
||||
},
|
||||
|
||||
detach: function( selector ) {
|
||||
return this.remove( selector, true );
|
||||
},
|
||||
|
||||
domManip: function( args, callback ) {
|
||||
domManip: function( args, callback, ignored ) {
|
||||
|
||||
// Flatten any nested arrays
|
||||
args = concat.apply( [], args );
|
||||
@@ -489,19 +491,20 @@ jQuery.fn.extend({
|
||||
if ( isFunction ) {
|
||||
args[ 0 ] = value.call( this, index, self.html() );
|
||||
}
|
||||
self.domManip( args, callback );
|
||||
self.domManip( args, callback, ignored );
|
||||
});
|
||||
}
|
||||
|
||||
if ( l ) {
|
||||
fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
|
||||
fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this, ignored );
|
||||
first = fragment.firstChild;
|
||||
|
||||
if ( fragment.childNodes.length === 1 ) {
|
||||
fragment = first;
|
||||
}
|
||||
|
||||
if ( first ) {
|
||||
// Require either new content or an interest in ignored elements to invoke the callback
|
||||
if ( first || ignored ) {
|
||||
scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
|
||||
hasScripts = scripts.length;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user