Move the XHR callback to a separate file
This commit is contained in:
63
index.js
63
index.js
@@ -142,6 +142,8 @@ Pjax.prototype = {
|
|||||||
|
|
||||||
doRequest: require("./lib/send-request.js"),
|
doRequest: require("./lib/send-request.js"),
|
||||||
|
|
||||||
|
handleResponse: require("./lib/proto/handle-response.js"),
|
||||||
|
|
||||||
loadUrl: function(href, options) {
|
loadUrl: function(href, options) {
|
||||||
options = typeof options === "object" ?
|
options = typeof options === "object" ?
|
||||||
extend({}, this.options, options) :
|
extend({}, this.options, options) :
|
||||||
@@ -155,66 +157,7 @@ Pjax.prototype = {
|
|||||||
trigger(document, "pjax:send", options)
|
trigger(document, "pjax:send", options)
|
||||||
|
|
||||||
// Do the request
|
// Do the request
|
||||||
this.request = this.doRequest(href, options, function(html, request) {
|
this.request = this.doRequest(href, options, this.handleResponse.bind(this))
|
||||||
// Fail if unable to load HTML via AJAX
|
|
||||||
if (html === false) {
|
|
||||||
trigger(document, "pjax:complete pjax:error", options)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// push scroll position to history
|
|
||||||
var currentState = window.history.state || {}
|
|
||||||
window.history.replaceState({
|
|
||||||
url: currentState.url || window.location.href,
|
|
||||||
title: currentState.title || document.title,
|
|
||||||
uid: currentState.uid || newUid(),
|
|
||||||
scrollPos: [document.documentElement.scrollLeft || document.body.scrollLeft,
|
|
||||||
document.documentElement.scrollTop || document.body.scrollTop]
|
|
||||||
},
|
|
||||||
document.title, window.location)
|
|
||||||
|
|
||||||
var oldHref = href
|
|
||||||
if (request.responseURL) {
|
|
||||||
if (href !== request.responseURL) {
|
|
||||||
href = request.responseURL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (request.getResponseHeader("X-PJAX-URL")) {
|
|
||||||
href = request.getResponseHeader("X-PJAX-URL")
|
|
||||||
}
|
|
||||||
else if (request.getResponseHeader("X-XHR-Redirected-To")) {
|
|
||||||
href = request.getResponseHeader("X-XHR-Redirected-To")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add back the hash if it was removed
|
|
||||||
var a = document.createElement("a")
|
|
||||||
a.href = oldHref
|
|
||||||
var oldHash = a.hash
|
|
||||||
a.href = href
|
|
||||||
if (oldHash && !a.hash) {
|
|
||||||
a.hash = oldHash
|
|
||||||
href = a.href
|
|
||||||
}
|
|
||||||
|
|
||||||
this.state.href = href
|
|
||||||
this.state.options = clone(options)
|
|
||||||
|
|
||||||
try {
|
|
||||||
this.loadContent(html, options)
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
if (!this.options.debug) {
|
|
||||||
if (console && console.error) {
|
|
||||||
console.error("Pjax switch fail: ", e)
|
|
||||||
}
|
|
||||||
return this.latestChance(href)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.bind(this))
|
|
||||||
},
|
},
|
||||||
|
|
||||||
afterAllSwitches: function() {
|
afterAllSwitches: function() {
|
||||||
|
|||||||
65
lib/proto/handle-response.js
Normal file
65
lib/proto/handle-response.js
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
var clone = require("./lib/clone.js")
|
||||||
|
var newUid = require("./lib/uniqueid.js")
|
||||||
|
var trigger = require("./lib/events/trigger.js")
|
||||||
|
|
||||||
|
module.export = function(responseText, request, href) {
|
||||||
|
// Fail if unable to load HTML via AJAX
|
||||||
|
if (responseText === false) {
|
||||||
|
trigger(document, "pjax:complete pjax:error", this.options)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// push scroll position to history
|
||||||
|
var currentState = window.history.state || {}
|
||||||
|
window.history.replaceState({
|
||||||
|
url: currentState.url || window.location.href,
|
||||||
|
title: currentState.title || document.title,
|
||||||
|
uid: currentState.uid || newUid(),
|
||||||
|
scrollPos: [document.documentElement.scrollLeft || document.body.scrollLeft,
|
||||||
|
document.documentElement.scrollTop || document.body.scrollTop]
|
||||||
|
},
|
||||||
|
document.title, window.location)
|
||||||
|
|
||||||
|
// Check for redirects
|
||||||
|
var oldHref = href
|
||||||
|
if (request.responseURL) {
|
||||||
|
if (href !== request.responseURL) {
|
||||||
|
href = request.responseURL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (request.getResponseHeader("X-PJAX-URL")) {
|
||||||
|
href = request.getResponseHeader("X-PJAX-URL")
|
||||||
|
}
|
||||||
|
else if (request.getResponseHeader("X-XHR-Redirected-To")) {
|
||||||
|
href = request.getResponseHeader("X-XHR-Redirected-To")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add back the hash if it was removed
|
||||||
|
var a = document.createElement("a")
|
||||||
|
a.href = oldHref
|
||||||
|
var oldHash = a.hash
|
||||||
|
a.href = href
|
||||||
|
if (oldHash && !a.hash) {
|
||||||
|
a.hash = oldHash
|
||||||
|
href = a.href
|
||||||
|
}
|
||||||
|
|
||||||
|
this.state.href = href
|
||||||
|
this.state.options = clone(this.options)
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.loadContent(responseText, this.options)
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
if (!this.options.debug) {
|
||||||
|
if (console && console.error) {
|
||||||
|
console.error("Pjax switch fail: ", e)
|
||||||
|
}
|
||||||
|
return this.latestChance(href)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,21 +13,21 @@ module.exports = function(location, options, callback) {
|
|||||||
request.onreadystatechange = function() {
|
request.onreadystatechange = function() {
|
||||||
if (request.readyState === 4) {
|
if (request.readyState === 4) {
|
||||||
if (request.status === 200) {
|
if (request.status === 200) {
|
||||||
callback(request.responseText, request)
|
callback(request.responseText, request, location)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
callback(null, request)
|
callback(null, request, location)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
request.onerror = function(e) {
|
request.onerror = function(e) {
|
||||||
console.log(e)
|
console.log(e)
|
||||||
callback(null, request)
|
callback(null, request, location)
|
||||||
}
|
}
|
||||||
|
|
||||||
request.ontimeout = function() {
|
request.ontimeout = function() {
|
||||||
callback(null, request)
|
callback(null, request, location)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare the request payload for forms, if available
|
// Prepare the request payload for forms, if available
|
||||||
|
|||||||
Reference in New Issue
Block a user