Skip to content

Commit

Permalink
Ajax: Preserve URL hash on requests
Browse files Browse the repository at this point in the history
Fixes gh-1732
Closes gh-2721
  • Loading branch information
dmethvin committed Dec 1, 2015
1 parent eaa3e9f commit e077ffb
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 16 deletions.
28 changes: 16 additions & 12 deletions src/ajax.js
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,9 @@ jQuery.extend( {
// Loop variable
i,

// uncached part of the url
uncached,

// Create the final options object
s = jQuery.ajaxSetup( {}, options ),

Expand Down Expand Up @@ -516,11 +519,10 @@ jQuery.extend( {
// Attach deferreds
deferred.promise( jqXHR );

// Remove hash character (#7531: and string promotion)
// Add protocol if not provided (prefilters might expect it)
// Handle falsy url in the settings object (#10093: consistency with old signature)
// We also use the url parameter if available
s.url = ( ( url || s.url || location.href ) + "" ).replace( rhash, "" )
s.url = ( ( url || s.url || location.href ) + "" )
.replace( rprotocol, location.protocol + "//" );

// Alias method option to type as per ticket #12004
Expand Down Expand Up @@ -581,30 +583,32 @@ jQuery.extend( {

// Save the URL in case we're toying with the If-Modified-Since
// and/or If-None-Match header later on
cacheURL = s.url;
// Remove hash to simplify url manipulation
cacheURL = s.url.replace( rhash, "" );

// More options handling for requests with no content
if ( !s.hasContent ) {

// Remember the hash so we can put it back
uncached = s.url.slice( cacheURL.length );

// If data is available, append data to url
if ( s.data ) {
cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;

// #9682: remove data so that it's not used in an eventual retry
delete s.data;
}

// Add anti-cache in url if needed
// Add anti-cache in uncached url if needed
if ( s.cache === false ) {
s.url = rts.test( cacheURL ) ?

// If there is already a '_' parameter, set its value
cacheURL.replace( rts, "$1_=" + nonce++ ) :

// Otherwise add one to the end
cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
cacheURL = cacheURL.replace( rts, "" );
uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
}

// Put hash and anti-cache on the URL that will be requested (gh-1732)
s.url = cacheURL + uncached;

// Change '%20' to '+' if this is encoded form body content (gh-2658)
} else if ( s.data && s.processData &&
( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
Expand Down
22 changes: 18 additions & 4 deletions test/unit/ajax.js
Original file line number Diff line number Diff line change
Expand Up @@ -328,20 +328,20 @@ QUnit.module( "ajax", {
};
} );

ajaxTest( "jQuery.ajax() - hash", 3, function( assert ) {
ajaxTest( "jQuery.ajax() - hash", 4, function( assert ) {
return [
{
url: "data/name.html#foo",
beforeSend: function( xhr, settings ) {
assert.equal( settings.url, "data/name.html", "Make sure that the URL is trimmed." );
assert.equal( settings.url, "data/name.html#foo", "Make sure that the URL has its hash." );
return false;
},
error: true
},
{
url: "data/name.html?abc#foo",
beforeSend: function( xhr, settings ) {
assert.equal( settings.url, "data/name.html?abc", "Make sure that the URL is trimmed." );
assert.equal( settings.url, "data/name.html?abc#foo", "Make sure that the URL has its hash." );
return false;
},
error: true
Expand All @@ -352,7 +352,21 @@ QUnit.module( "ajax", {
"test": 123
},
beforeSend: function( xhr, settings ) {
assert.equal( settings.url, "data/name.html?abc&test=123", "Make sure that the URL is trimmed." );
assert.equal( settings.url, "data/name.html?abc&test=123#foo", "Make sure that the URL has its hash." );
return false;
},
error: true
},
{
url: "data/name.html?abc#brownies",
data: {
"devo": "hat"
},
cache: false,
beforeSend: function( xhr, settings ) {
// Remove the random number, but ensure the cashe-buster param is there
var url = settings.url.replace( /\d+/, "" );
assert.equal( url, "data/name.html?abc&devo=hat&_=#brownies", "Make sure that the URL has its hash." );
return false;
},
error: true
Expand Down

0 comments on commit e077ffb

Please sign in to comment.