Fixed #30507 -- Updated admin's jQuery to 3.4.1.

This commit is contained in:
Dulmandakh 2019-05-24 21:41:19 +08:00 committed by Mariusz Felisiak
parent 9386586f31
commit 06372a8d27
5 changed files with 425 additions and 192 deletions

View File

@ -1,10 +1,4 @@
Copyright jQuery Foundation and other contributors, https://jquery.org/ Copyright JS Foundation and other contributors, https://js.foundation/
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery
====
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the

View File

@ -1,5 +1,5 @@
/*! /*!
* jQuery JavaScript Library v3.3.1 * jQuery JavaScript Library v3.4.1
* https://jquery.com/ * https://jquery.com/
* *
* Includes Sizzle.js * Includes Sizzle.js
@ -9,7 +9,7 @@
* Released under the MIT license * Released under the MIT license
* https://jquery.org/license * https://jquery.org/license
* *
* Date: 2018-01-20T17:24Z * Date: 2019-05-01T21:04Z
*/ */
( function( global, factory ) { ( function( global, factory ) {
@ -91,20 +91,33 @@ var isWindow = function isWindow( obj ) {
var preservedScriptAttributes = { var preservedScriptAttributes = {
type: true, type: true,
src: true, src: true,
nonce: true,
noModule: true noModule: true
}; };
function DOMEval( code, doc, node ) { function DOMEval( code, node, doc ) {
doc = doc || document; doc = doc || document;
var i, var i, val,
script = doc.createElement( "script" ); script = doc.createElement( "script" );
script.text = code; script.text = code;
if ( node ) { if ( node ) {
for ( i in preservedScriptAttributes ) { for ( i in preservedScriptAttributes ) {
if ( node[ i ] ) {
script[ i ] = node[ i ]; // Support: Firefox 64+, Edge 18+
// Some browsers don't support the "nonce" property on scripts.
// On the other hand, just using `getAttribute` is not enough as
// the `nonce` attribute is reset to an empty string whenever it
// becomes browsing-context connected.
// See https://github.com/whatwg/html/issues/2369
// See https://html.spec.whatwg.org/#nonce-attributes
// The `node.getAttribute` check was added for the sake of
// `jQuery.globalEval` so that it can fake a nonce-containing node
// via an object.
val = node[ i ] || node.getAttribute && node.getAttribute( i );
if ( val ) {
script.setAttribute( i, val );
} }
} }
} }
@ -129,7 +142,7 @@ function toType( obj ) {
var var
version = "3.3.1", version = "3.4.1",
// Define a local copy of jQuery // Define a local copy of jQuery
jQuery = function( selector, context ) { jQuery = function( selector, context ) {
@ -258,7 +271,6 @@ jQuery.extend = jQuery.fn.extend = function() {
// Extend the base object // Extend the base object
for ( name in options ) { for ( name in options ) {
src = target[ name ];
copy = options[ name ]; copy = options[ name ];
// Prevent Object.prototype pollution // Prevent Object.prototype pollution
@ -270,14 +282,17 @@ jQuery.extend = jQuery.fn.extend = function() {
// Recurse if we're merging plain objects or arrays // Recurse if we're merging plain objects or arrays
if ( deep && copy && ( jQuery.isPlainObject( copy ) || if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
( copyIsArray = Array.isArray( copy ) ) ) ) { ( copyIsArray = Array.isArray( copy ) ) ) ) {
src = target[ name ];
if ( copyIsArray ) { // Ensure proper type for the source value
copyIsArray = false; if ( copyIsArray && !Array.isArray( src ) ) {
clone = src && Array.isArray( src ) ? src : []; clone = [];
} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
clone = {};
} else { } else {
clone = src && jQuery.isPlainObject( src ) ? src : {}; clone = src;
} }
copyIsArray = false;
// Never move original objects, clone them // Never move original objects, clone them
target[ name ] = jQuery.extend( deep, clone, copy ); target[ name ] = jQuery.extend( deep, clone, copy );
@ -330,9 +345,6 @@ jQuery.extend( {
}, },
isEmptyObject: function( obj ) { isEmptyObject: function( obj ) {
/* eslint-disable no-unused-vars */
// See https://github.com/eslint/eslint/issues/6125
var name; var name;
for ( name in obj ) { for ( name in obj ) {
@ -342,8 +354,8 @@ jQuery.extend( {
}, },
// Evaluates a script in a global context // Evaluates a script in a global context
globalEval: function( code ) { globalEval: function( code, options ) {
DOMEval( code ); DOMEval( code, { nonce: options && options.nonce } );
}, },
each: function( obj, callback ) { each: function( obj, callback ) {
@ -499,14 +511,14 @@ function isArrayLike( obj ) {
} }
var Sizzle = var Sizzle =
/*! /*!
* Sizzle CSS Selector Engine v2.3.3 * Sizzle CSS Selector Engine v2.3.4
* https://sizzlejs.com/ * https://sizzlejs.com/
* *
* Copyright jQuery Foundation and other contributors * Copyright JS Foundation and other contributors
* Released under the MIT license * Released under the MIT license
* http://jquery.org/license * https://js.foundation/
* *
* Date: 2016-08-08 * Date: 2019-04-08
*/ */
(function( window ) { (function( window ) {
@ -540,6 +552,7 @@ var i,
classCache = createCache(), classCache = createCache(),
tokenCache = createCache(), tokenCache = createCache(),
compilerCache = createCache(), compilerCache = createCache(),
nonnativeSelectorCache = createCache(),
sortOrder = function( a, b ) { sortOrder = function( a, b ) {
if ( a === b ) { if ( a === b ) {
hasDuplicate = true; hasDuplicate = true;
@ -601,8 +614,7 @@ var i,
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
rdescend = new RegExp( whitespace + "|>" ),
rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
rpseudo = new RegExp( pseudos ), rpseudo = new RegExp( pseudos ),
ridentifier = new RegExp( "^" + identifier + "$" ), ridentifier = new RegExp( "^" + identifier + "$" ),
@ -623,6 +635,7 @@ var i,
whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
}, },
rhtml = /HTML$/i,
rinputs = /^(?:input|select|textarea|button)$/i, rinputs = /^(?:input|select|textarea|button)$/i,
rheader = /^h\d$/i, rheader = /^h\d$/i,
@ -677,9 +690,9 @@ var i,
setDocument(); setDocument();
}, },
disabledAncestor = addCombinator( inDisabledFieldset = addCombinator(
function( elem ) { function( elem ) {
return elem.disabled === true && ("form" in elem || "label" in elem); return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
}, },
{ dir: "parentNode", next: "legend" } { dir: "parentNode", next: "legend" }
); );
@ -792,18 +805,22 @@ function Sizzle( selector, context, results, seed ) {
// Take advantage of querySelectorAll // Take advantage of querySelectorAll
if ( support.qsa && if ( support.qsa &&
!compilerCache[ selector + " " ] && !nonnativeSelectorCache[ selector + " " ] &&
(!rbuggyQSA || !rbuggyQSA.test( selector )) ) { (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
if ( nodeType !== 1 ) { // Support: IE 8 only
newContext = context;
newSelector = selector;
// qSA looks outside Element context, which is not what we want
// Thanks to Andrew Dupont for this workaround technique
// Support: IE <=8
// Exclude object elements // Exclude object elements
} else if ( context.nodeName.toLowerCase() !== "object" ) { (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
newSelector = selector;
newContext = context;
// qSA considers elements outside a scoping root when evaluating child or
// descendant combinators, which is not what we want.
// In such cases, we work around the behavior by prefixing every selector in the
// list with an ID selector referencing the scope context.
// Thanks to Andrew Dupont for this technique.
if ( nodeType === 1 && rdescend.test( selector ) ) {
// Capture the context ID, setting it first if necessary // Capture the context ID, setting it first if necessary
if ( (nid = context.getAttribute( "id" )) ) { if ( (nid = context.getAttribute( "id" )) ) {
@ -825,17 +842,16 @@ function Sizzle( selector, context, results, seed ) {
context; context;
} }
if ( newSelector ) { try {
try { push.apply( results,
push.apply( results, newContext.querySelectorAll( newSelector )
newContext.querySelectorAll( newSelector ) );
); return results;
return results; } catch ( qsaError ) {
} catch ( qsaError ) { nonnativeSelectorCache( selector, true );
} finally { } finally {
if ( nid === expando ) { if ( nid === expando ) {
context.removeAttribute( "id" ); context.removeAttribute( "id" );
}
} }
} }
} }
@ -999,7 +1015,7 @@ function createDisabledPseudo( disabled ) {
// Where there is no isDisabled, check manually // Where there is no isDisabled, check manually
/* jshint -W018 */ /* jshint -W018 */
elem.isDisabled !== !disabled && elem.isDisabled !== !disabled &&
disabledAncestor( elem ) === disabled; inDisabledFieldset( elem ) === disabled;
} }
return elem.disabled === disabled; return elem.disabled === disabled;
@ -1056,10 +1072,13 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node * @returns {Boolean} True iff elem is a non-HTML XML node
*/ */
isXML = Sizzle.isXML = function( elem ) { isXML = Sizzle.isXML = function( elem ) {
// documentElement is verified for cases where it doesn't yet exist var namespace = elem.namespaceURI,
// (such as loading iframes in IE - #4833) docElem = (elem.ownerDocument || elem).documentElement;
var documentElement = elem && (elem.ownerDocument || elem).documentElement;
return documentElement ? documentElement.nodeName !== "HTML" : false; // Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
// https://bugs.jquery.com/ticket/4833
return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
}; };
/** /**
@ -1481,11 +1500,8 @@ Sizzle.matchesSelector = function( elem, expr ) {
setDocument( elem ); setDocument( elem );
} }
// Make sure that attribute selectors are quoted
expr = expr.replace( rattributeQuotes, "='$1']" );
if ( support.matchesSelector && documentIsHTML && if ( support.matchesSelector && documentIsHTML &&
!compilerCache[ expr + " " ] && !nonnativeSelectorCache[ expr + " " ] &&
( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
@ -1499,7 +1515,9 @@ Sizzle.matchesSelector = function( elem, expr ) {
elem.document && elem.document.nodeType !== 11 ) { elem.document && elem.document.nodeType !== 11 ) {
return ret; return ret;
} }
} catch (e) {} } catch (e) {
nonnativeSelectorCache( expr, true );
}
} }
return Sizzle( expr, document, null, [ elem ] ).length > 0; return Sizzle( expr, document, null, [ elem ] ).length > 0;
@ -1958,7 +1976,7 @@ Expr = Sizzle.selectors = {
"contains": markFunction(function( text ) { "contains": markFunction(function( text ) {
text = text.replace( runescape, funescape ); text = text.replace( runescape, funescape );
return function( elem ) { return function( elem ) {
return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
}; };
}), }),
@ -2097,7 +2115,11 @@ Expr = Sizzle.selectors = {
}), }),
"lt": createPositionalPseudo(function( matchIndexes, length, argument ) { "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
var i = argument < 0 ? argument + length : argument; var i = argument < 0 ?
argument + length :
argument > length ?
length :
argument;
for ( ; --i >= 0; ) { for ( ; --i >= 0; ) {
matchIndexes.push( i ); matchIndexes.push( i );
} }
@ -3147,18 +3169,18 @@ jQuery.each( {
return siblings( elem.firstChild ); return siblings( elem.firstChild );
}, },
contents: function( elem ) { contents: function( elem ) {
if ( nodeName( elem, "iframe" ) ) { if ( typeof elem.contentDocument !== "undefined" ) {
return elem.contentDocument; return elem.contentDocument;
} }
// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
// Treat the template element as a regular one in browsers that // Treat the template element as a regular one in browsers that
// don't support it. // don't support it.
if ( nodeName( elem, "template" ) ) { if ( nodeName( elem, "template" ) ) {
elem = elem.content || elem; elem = elem.content || elem;
} }
return jQuery.merge( [], elem.childNodes ); return jQuery.merge( [], elem.childNodes );
} }
}, function( name, fn ) { }, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) { jQuery.fn[ name ] = function( until, selector ) {
@ -4467,6 +4489,26 @@ var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
var documentElement = document.documentElement;
var isAttached = function( elem ) {
return jQuery.contains( elem.ownerDocument, elem );
},
composed = { composed: true };
// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
// Check attachment across shadow DOM boundaries when possible (gh-3504)
// Support: iOS 10.0-10.2 only
// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
// leading to errors. We need to check for `getRootNode`.
if ( documentElement.getRootNode ) {
isAttached = function( elem ) {
return jQuery.contains( elem.ownerDocument, elem ) ||
elem.getRootNode( composed ) === elem.ownerDocument;
};
}
var isHiddenWithinTree = function( elem, el ) { var isHiddenWithinTree = function( elem, el ) {
// isHiddenWithinTree might be called from jQuery#filter function; // isHiddenWithinTree might be called from jQuery#filter function;
@ -4481,7 +4523,7 @@ var isHiddenWithinTree = function( elem, el ) {
// Support: Firefox <=43 - 45 // Support: Firefox <=43 - 45
// Disconnected elements can have computed display: none, so first confirm that elem is // Disconnected elements can have computed display: none, so first confirm that elem is
// in the document. // in the document.
jQuery.contains( elem.ownerDocument, elem ) && isAttached( elem ) &&
jQuery.css( elem, "display" ) === "none"; jQuery.css( elem, "display" ) === "none";
}; };
@ -4523,7 +4565,8 @@ function adjustCSS( elem, prop, valueParts, tween ) {
unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
// Starting value computation is required for potential unit mismatches // Starting value computation is required for potential unit mismatches
initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && initialInUnit = elem.nodeType &&
( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
rcssNum.exec( jQuery.css( elem, prop ) ); rcssNum.exec( jQuery.css( elem, prop ) );
if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
@ -4670,7 +4713,7 @@ jQuery.fn.extend( {
} ); } );
var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rcheckableType = ( /^(?:checkbox|radio)$/i );
var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
@ -4742,7 +4785,7 @@ function setGlobalEval( elems, refElements ) {
var rhtml = /<|&#?\w+;/; var rhtml = /<|&#?\w+;/;
function buildFragment( elems, context, scripts, selection, ignored ) { function buildFragment( elems, context, scripts, selection, ignored ) {
var elem, tmp, tag, wrap, contains, j, var elem, tmp, tag, wrap, attached, j,
fragment = context.createDocumentFragment(), fragment = context.createDocumentFragment(),
nodes = [], nodes = [],
i = 0, i = 0,
@ -4806,13 +4849,13 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
continue; continue;
} }
contains = jQuery.contains( elem.ownerDocument, elem ); attached = isAttached( elem );
// Append to fragment // Append to fragment
tmp = getAll( fragment.appendChild( elem ), "script" ); tmp = getAll( fragment.appendChild( elem ), "script" );
// Preserve script evaluation history // Preserve script evaluation history
if ( contains ) { if ( attached ) {
setGlobalEval( tmp ); setGlobalEval( tmp );
} }
@ -4855,8 +4898,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
div.innerHTML = "<textarea>x</textarea>"; div.innerHTML = "<textarea>x</textarea>";
support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
} )(); } )();
var documentElement = document.documentElement;
var var
@ -4872,8 +4913,19 @@ function returnFalse() {
return false; return false;
} }
// Support: IE <=9 - 11+
// focus() and blur() are asynchronous, except when they are no-op.
// So expect focus to be synchronous when the element is already active,
// and blur to be synchronous when the element is not already active.
// (focus and blur are always synchronous in other supported browsers,
// this just defines when we can count on it).
function expectSync( elem, type ) {
return ( elem === safeActiveElement() ) === ( type === "focus" );
}
// Support: IE <=9 only // Support: IE <=9 only
// See #13393 for more info // Accessing document.activeElement can throw unexpectedly
// https://bugs.jquery.com/ticket/13393
function safeActiveElement() { function safeActiveElement() {
try { try {
return document.activeElement; return document.activeElement;
@ -5173,9 +5225,10 @@ jQuery.event = {
while ( ( handleObj = matched.handlers[ j++ ] ) && while ( ( handleObj = matched.handlers[ j++ ] ) &&
!event.isImmediatePropagationStopped() ) { !event.isImmediatePropagationStopped() ) {
// Triggered event must either 1) have no namespace, or 2) have namespace(s) // If the event is namespaced, then each handler is only invoked if it is
// a subset or equal to those in the bound event (both can have no namespace). // specially universal or its namespaces are a superset of the event's.
if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { if ( !event.rnamespace || handleObj.namespace === false ||
event.rnamespace.test( handleObj.namespace ) ) {
event.handleObj = handleObj; event.handleObj = handleObj;
event.data = handleObj.data; event.data = handleObj.data;
@ -5299,39 +5352,51 @@ jQuery.event = {
// Prevent triggered image.load events from bubbling to window.load // Prevent triggered image.load events from bubbling to window.load
noBubble: true noBubble: true
}, },
focus: {
// Fire native event if possible so blur/focus sequence is correct
trigger: function() {
if ( this !== safeActiveElement() && this.focus ) {
this.focus();
return false;
}
},
delegateType: "focusin"
},
blur: {
trigger: function() {
if ( this === safeActiveElement() && this.blur ) {
this.blur();
return false;
}
},
delegateType: "focusout"
},
click: { click: {
// For checkbox, fire native event so checked state will be right // Utilize native event to ensure correct state for checkable inputs
trigger: function() { setup: function( data ) {
if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
this.click(); // For mutual compressibility with _default, replace `this` access with a local var.
return false; // `|| data` is dead code meant only to preserve the variable through minification.
var el = this || data;
// Claim the first handler
if ( rcheckableType.test( el.type ) &&
el.click && nodeName( el, "input" ) ) {
// dataPriv.set( el, "click", ... )
leverageNative( el, "click", returnTrue );
} }
// Return false to allow normal processing in the caller
return false;
},
trigger: function( data ) {
// For mutual compressibility with _default, replace `this` access with a local var.
// `|| data` is dead code meant only to preserve the variable through minification.
var el = this || data;
// Force setup before triggering a click
if ( rcheckableType.test( el.type ) &&
el.click && nodeName( el, "input" ) ) {
leverageNative( el, "click" );
}
// Return non-false to allow normal event-path propagation
return true;
}, },
// For cross-browser consistency, don't fire native .click() on links // For cross-browser consistency, suppress native .click() on links
// Also prevent it if we're currently inside a leveraged native-event stack
_default: function( event ) { _default: function( event ) {
return nodeName( event.target, "a" ); var target = event.target;
return rcheckableType.test( target.type ) &&
target.click && nodeName( target, "input" ) &&
dataPriv.get( target, "click" ) ||
nodeName( target, "a" );
} }
}, },
@ -5348,6 +5413,93 @@ jQuery.event = {
} }
}; };
// Ensure the presence of an event listener that handles manually-triggered
// synthetic events by interrupting progress until reinvoked in response to
// *native* events that it fires directly, ensuring that state changes have
// already occurred before other listeners are invoked.
function leverageNative( el, type, expectSync ) {
// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
if ( !expectSync ) {
if ( dataPriv.get( el, type ) === undefined ) {
jQuery.event.add( el, type, returnTrue );
}
return;
}
// Register the controller as a special universal handler for all event namespaces
dataPriv.set( el, type, false );
jQuery.event.add( el, type, {
namespace: false,
handler: function( event ) {
var notAsync, result,
saved = dataPriv.get( this, type );
if ( ( event.isTrigger & 1 ) && this[ type ] ) {
// Interrupt processing of the outer synthetic .trigger()ed event
// Saved data should be false in such cases, but might be a leftover capture object
// from an async native handler (gh-4350)
if ( !saved.length ) {
// Store arguments for use when handling the inner native event
// There will always be at least one argument (an event object), so this array
// will not be confused with a leftover capture object.
saved = slice.call( arguments );
dataPriv.set( this, type, saved );
// Trigger the native event and capture its result
// Support: IE <=9 - 11+
// focus() and blur() are asynchronous
notAsync = expectSync( this, type );
this[ type ]();
result = dataPriv.get( this, type );
if ( saved !== result || notAsync ) {
dataPriv.set( this, type, false );
} else {
result = {};
}
if ( saved !== result ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
return result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
// (focus or blur), assume that the surrogate already propagated from triggering the
// native event and prevent that from happening again here.
// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
// bubbling surrogate propagates *after* the non-bubbling base), but that seems
// less bad than duplication.
} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
event.stopPropagation();
}
// If this is a native event triggered above, everything is now in order
// Fire an inner synthetic event with the original arguments
} else if ( saved.length ) {
// ...and capture the result
dataPriv.set( this, type, {
value: jQuery.event.trigger(
// Support: IE <=9 - 11+
// Extend with the prototype to reset the above stopImmediatePropagation()
jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
saved.slice( 1 ),
this
)
} );
// Abort handling of the native event
event.stopImmediatePropagation();
}
}
} );
}
jQuery.removeEvent = function( elem, type, handle ) { jQuery.removeEvent = function( elem, type, handle ) {
// This "if" is needed for plain objects // This "if" is needed for plain objects
@ -5460,6 +5612,7 @@ jQuery.each( {
shiftKey: true, shiftKey: true,
view: true, view: true,
"char": true, "char": true,
code: true,
charCode: true, charCode: true,
key: true, key: true,
keyCode: true, keyCode: true,
@ -5506,6 +5659,33 @@ jQuery.each( {
} }
}, jQuery.event.addProp ); }, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
jQuery.event.special[ type ] = {
// Utilize native event if possible so blur/focus sequence is correct
setup: function() {
// Claim the first handler
// dataPriv.set( this, "focus", ... )
// dataPriv.set( this, "blur", ... )
leverageNative( this, type, expectSync );
// Return false to allow normal processing in the caller
return false;
},
trigger: function() {
// Force setup before trigger
leverageNative( this, type );
// Return non-false to allow normal event-path propagation
return true;
},
delegateType: delegateType
};
} );
// Create mouseenter/leave events using mouseover/out and event-time checks // Create mouseenter/leave events using mouseover/out and event-time checks
// so that event delegation works in jQuery. // so that event delegation works in jQuery.
// Do the same for pointerenter/pointerleave and pointerover/pointerout // Do the same for pointerenter/pointerleave and pointerover/pointerout
@ -5756,11 +5936,13 @@ function domManip( collection, args, callback, ignored ) {
if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
// Optional AJAX dependency, but won't run scripts if not present // Optional AJAX dependency, but won't run scripts if not present
if ( jQuery._evalUrl ) { if ( jQuery._evalUrl && !node.noModule ) {
jQuery._evalUrl( node.src ); jQuery._evalUrl( node.src, {
nonce: node.nonce || node.getAttribute( "nonce" )
} );
} }
} else { } else {
DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
} }
} }
} }
@ -5782,7 +5964,7 @@ function remove( elem, selector, keepData ) {
} }
if ( node.parentNode ) { if ( node.parentNode ) {
if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { if ( keepData && isAttached( node ) ) {
setGlobalEval( getAll( node, "script" ) ); setGlobalEval( getAll( node, "script" ) );
} }
node.parentNode.removeChild( node ); node.parentNode.removeChild( node );
@ -5800,7 +5982,7 @@ jQuery.extend( {
clone: function( elem, dataAndEvents, deepDataAndEvents ) { clone: function( elem, dataAndEvents, deepDataAndEvents ) {
var i, l, srcElements, destElements, var i, l, srcElements, destElements,
clone = elem.cloneNode( true ), clone = elem.cloneNode( true ),
inPage = jQuery.contains( elem.ownerDocument, elem ); inPage = isAttached( elem );
// Fix IE cloning issues // Fix IE cloning issues
if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
@ -6096,8 +6278,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// Support: IE 9 only // Support: IE 9 only
// Detect overflow:scroll screwiness (gh-3699) // Detect overflow:scroll screwiness (gh-3699)
// Support: Chrome <=64
// Don't get tricked when zoom affects offsetWidth (gh-4029)
div.style.position = "absolute"; div.style.position = "absolute";
scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
documentElement.removeChild( container ); documentElement.removeChild( container );
@ -6168,7 +6352,7 @@ function curCSS( elem, name, computed ) {
if ( computed ) { if ( computed ) {
ret = computed.getPropertyValue( name ) || computed[ name ]; ret = computed.getPropertyValue( name ) || computed[ name ];
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { if ( ret === "" && !isAttached( elem ) ) {
ret = jQuery.style( elem, name ); ret = jQuery.style( elem, name );
} }
@ -6224,30 +6408,13 @@ function addGetHookIf( conditionFn, hookFn ) {
} }
var var cssPrefixes = [ "Webkit", "Moz", "ms" ],
emptyStyle = document.createElement( "div" ).style,
vendorProps = {};
// Swappable if display is none or starts with table // Return a vendor-prefixed property or undefined
// except "table", "table-cell", or "table-caption"
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rcustomProp = /^--/,
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
letterSpacing: "0",
fontWeight: "400"
},
cssPrefixes = [ "Webkit", "Moz", "ms" ],
emptyStyle = document.createElement( "div" ).style;
// Return a css property mapped to a potentially vendor prefixed property
function vendorPropName( name ) { function vendorPropName( name ) {
// Shortcut for names that are not vendor prefixed
if ( name in emptyStyle ) {
return name;
}
// Check for vendor prefixed names // Check for vendor prefixed names
var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
i = cssPrefixes.length; i = cssPrefixes.length;
@ -6260,16 +6427,33 @@ function vendorPropName( name ) {
} }
} }
// Return a property mapped along what jQuery.cssProps suggests or to // Return a potentially-mapped jQuery.cssProps or vendor prefixed property
// a vendor prefixed property.
function finalPropName( name ) { function finalPropName( name ) {
var ret = jQuery.cssProps[ name ]; var final = jQuery.cssProps[ name ] || vendorProps[ name ];
if ( !ret ) {
ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; if ( final ) {
return final;
} }
return ret; if ( name in emptyStyle ) {
return name;
}
return vendorProps[ name ] = vendorPropName( name ) || name;
} }
var
// Swappable if display is none or starts with table
// except "table", "table-cell", or "table-caption"
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rcustomProp = /^--/,
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
letterSpacing: "0",
fontWeight: "400"
};
function setPositiveNumber( elem, value, subtract ) { function setPositiveNumber( elem, value, subtract ) {
// Any relative (+/-) values have already been // Any relative (+/-) values have already been
@ -6341,7 +6525,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
delta - delta -
extra - extra -
0.5 0.5
) );
// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
// Use an explicit zero to avoid NaN (gh-3964)
) ) || 0;
} }
return delta; return delta;
@ -6351,9 +6538,16 @@ function getWidthOrHeight( elem, dimension, extra ) {
// Start with computed style // Start with computed style
var styles = getStyles( elem ), var styles = getStyles( elem ),
// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
// Fake content-box until we know it's needed to know the true value.
boxSizingNeeded = !support.boxSizingReliable() || extra,
isBorderBox = boxSizingNeeded &&
jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
valueIsBorderBox = isBorderBox,
val = curCSS( elem, dimension, styles ), val = curCSS( elem, dimension, styles ),
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
valueIsBorderBox = isBorderBox;
// Support: Firefox <=54 // Support: Firefox <=54
// Return a confounding non-pixel value or feign ignorance, as appropriate. // Return a confounding non-pixel value or feign ignorance, as appropriate.
@ -6364,22 +6558,29 @@ function getWidthOrHeight( elem, dimension, extra ) {
val = "auto"; val = "auto";
} }
// Check for style in case a browser which returns unreliable values
// for getComputedStyle silently falls back to the reliable elem.style
valueIsBorderBox = valueIsBorderBox &&
( support.boxSizingReliable() || val === elem.style[ dimension ] );
// Fall back to offsetWidth/offsetHeight when value is "auto" // Fall back to offsetWidth/offsetHeight when value is "auto"
// This happens for inline elements with no explicit setting (gh-3571) // This happens for inline elements with no explicit setting (gh-3571)
// Support: Android <=4.1 - 4.3 only // Support: Android <=4.1 - 4.3 only
// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
if ( val === "auto" || // Support: IE 9-11 only
!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { // Also use offsetWidth/offsetHeight for when box sizing is unreliable
// We use getClientRects() to check for hidden/disconnected.
// In those cases, the computed value can be trusted to be border-box
if ( ( !support.boxSizingReliable() && isBorderBox ||
val === "auto" ||
!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
elem.getClientRects().length ) {
val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
// offsetWidth/offsetHeight provide border-box values // Where available, offsetWidth/offsetHeight approximate border box dimensions.
valueIsBorderBox = true; // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
// retrieved value as a content box dimension.
valueIsBorderBox = offsetProp in elem;
if ( valueIsBorderBox ) {
val = elem[ offsetProp ];
}
} }
// Normalize "" and auto // Normalize "" and auto
@ -6425,6 +6626,13 @@ jQuery.extend( {
"flexGrow": true, "flexGrow": true,
"flexShrink": true, "flexShrink": true,
"fontWeight": true, "fontWeight": true,
"gridArea": true,
"gridColumn": true,
"gridColumnEnd": true,
"gridColumnStart": true,
"gridRow": true,
"gridRowEnd": true,
"gridRowStart": true,
"lineHeight": true, "lineHeight": true,
"opacity": true, "opacity": true,
"order": true, "order": true,
@ -6480,7 +6688,9 @@ jQuery.extend( {
} }
// If a number was passed in, add the unit (except for certain CSS properties) // If a number was passed in, add the unit (except for certain CSS properties)
if ( type === "number" ) { // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
// "px" to a few hardcoded values.
if ( type === "number" && !isCustomProp ) {
value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
} }
@ -6580,18 +6790,29 @@ jQuery.each( [ "height", "width" ], function( i, dimension ) {
set: function( elem, value, extra ) { set: function( elem, value, extra ) {
var matches, var matches,
styles = getStyles( elem ), styles = getStyles( elem ),
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
subtract = extra && boxModelAdjustment( // Only read styles.position if the test has a chance to fail
elem, // to avoid forcing a reflow.
dimension, scrollboxSizeBuggy = !support.scrollboxSize() &&
extra, styles.position === "absolute",
isBorderBox,
styles // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
); boxSizingNeeded = scrollboxSizeBuggy || extra,
isBorderBox = boxSizingNeeded &&
jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
subtract = extra ?
boxModelAdjustment(
elem,
dimension,
extra,
isBorderBox,
styles
) :
0;
// Account for unreliable border-box dimensions by comparing offset* to computed and // Account for unreliable border-box dimensions by comparing offset* to computed and
// faking a content-box to get border and padding (gh-3699) // faking a content-box to get border and padding (gh-3699)
if ( isBorderBox && support.scrollboxSize() === styles.position ) { if ( isBorderBox && scrollboxSizeBuggy ) {
subtract -= Math.ceil( subtract -= Math.ceil(
elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
parseFloat( styles[ dimension ] ) - parseFloat( styles[ dimension ] ) -
@ -6759,9 +6980,9 @@ Tween.propHooks = {
// Use .style if available and use plain properties where available. // Use .style if available and use plain properties where available.
if ( jQuery.fx.step[ tween.prop ] ) { if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween ); jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && } else if ( tween.elem.nodeType === 1 && (
( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ||
jQuery.cssHooks[ tween.prop ] ) ) { tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else { } else {
tween.elem[ tween.prop ] = tween.now; tween.elem[ tween.prop ] = tween.now;
@ -8468,6 +8689,10 @@ jQuery.param = function( a, traditional ) {
encodeURIComponent( value == null ? "" : value ); encodeURIComponent( value == null ? "" : value );
}; };
if ( a == null ) {
return "";
}
// If an array was passed in, assume that it is an array of form elements. // If an array was passed in, assume that it is an array of form elements.
if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
@ -8970,12 +9195,14 @@ jQuery.extend( {
if ( !responseHeaders ) { if ( !responseHeaders ) {
responseHeaders = {}; responseHeaders = {};
while ( ( match = rheaders.exec( responseHeadersString ) ) ) { while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
.concat( match[ 2 ] );
} }
} }
match = responseHeaders[ key.toLowerCase() ]; match = responseHeaders[ key.toLowerCase() + " " ];
} }
return match == null ? null : match; return match == null ? null : match.join( ", " );
}, },
// Raw string // Raw string
@ -9364,7 +9591,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
} ); } );
jQuery._evalUrl = function( url ) { jQuery._evalUrl = function( url, options ) {
return jQuery.ajax( { return jQuery.ajax( {
url: url, url: url,
@ -9374,7 +9601,16 @@ jQuery._evalUrl = function( url ) {
cache: true, cache: true,
async: false, async: false,
global: false, global: false,
"throws": true
// Only evaluate the response if it is successful (gh-4126)
// dataFilter is not invoked for failure responses, so using it instead
// of the default converter is kludgy but it works.
converters: {
"text script": function() {}
},
dataFilter: function( response ) {
jQuery.globalEval( response, options );
}
} ); } );
}; };
@ -9657,24 +9893,21 @@ jQuery.ajaxPrefilter( "script", function( s ) {
// Bind script tag hack transport // Bind script tag hack transport
jQuery.ajaxTransport( "script", function( s ) { jQuery.ajaxTransport( "script", function( s ) {
// This transport only deals with cross domain requests // This transport only deals with cross domain or forced-by-attrs requests
if ( s.crossDomain ) { if ( s.crossDomain || s.scriptAttrs ) {
var script, callback; var script, callback;
return { return {
send: function( _, complete ) { send: function( _, complete ) {
script = jQuery( "<script>" ).prop( { script = jQuery( "<script>" )
charset: s.scriptCharset, .attr( s.scriptAttrs || {} )
src: s.url .prop( { charset: s.scriptCharset, src: s.url } )
} ).on( .on( "load error", callback = function( evt ) {
"load error",
callback = function( evt ) {
script.remove(); script.remove();
callback = null; callback = null;
if ( evt ) { if ( evt ) {
complete( evt.type === "error" ? 404 : 200, evt.type ); complete( evt.type === "error" ? 404 : 200, evt.type );
} }
} } );
);
// Use native DOM manipulation to avoid our domManip AJAX trickery // Use native DOM manipulation to avoid our domManip AJAX trickery
document.head.appendChild( script[ 0 ] ); document.head.appendChild( script[ 0 ] );

File diff suppressed because one or more lines are too long

View File

@ -2129,10 +2129,14 @@ jQuery
Django admin JavaScript makes use of the `jQuery`_ library. Django admin JavaScript makes use of the `jQuery`_ library.
To avoid conflicts with user-supplied scripts or libraries, Django's jQuery To avoid conflicts with user-supplied scripts or libraries, Django's jQuery
(version 3.3.1) is namespaced as ``django.jQuery``. If you want to use jQuery (version 3.4.1) is namespaced as ``django.jQuery``. If you want to use jQuery
in your own admin JavaScript without including a second copy, you can use the in your own admin JavaScript without including a second copy, you can use the
``django.jQuery`` object on changelist and add/edit views. ``django.jQuery`` object on changelist and add/edit views.
.. versionchanged:: 3.0
jQuery was upgraded from 3.3.1 to 3.4.1.
The :class:`ModelAdmin` class requires jQuery by default, so there is no need The :class:`ModelAdmin` class requires jQuery by default, so there is no need
to add jQuery to your ``ModelAdmin``s list of media resources unless you have to add jQuery to your ``ModelAdmin``s list of media resources unless you have
a specific need. For example, if you require the jQuery library to be in the a specific need. For example, if you require the jQuery library to be in the

View File

@ -89,6 +89,8 @@ Minor features
* Select2 library is upgraded from version 4.0.3 to 4.0.7. * Select2 library is upgraded from version 4.0.3 to 4.0.7.
* jQuery is upgraded from version 3.3.1 to 3.4.1.
:mod:`django.contrib.admindocs` :mod:`django.contrib.admindocs`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~