From c9e292af6e997022a32bffd667a09ff26b2c414d Mon Sep 17 00:00:00 2001 From: Behind The Math Date: Tue, 27 Feb 2018 13:24:19 -0500 Subject: [PATCH] Move the XHR callback to a separate file --- index.js | 63 ++-------------------------------- lib/proto/handle-response.js | 65 ++++++++++++++++++++++++++++++++++++ lib/send-request.js | 8 ++--- 3 files changed, 72 insertions(+), 64 deletions(-) create mode 100644 lib/proto/handle-response.js diff --git a/index.js b/index.js index 3e8e749..7594c29 100644 --- a/index.js +++ b/index.js @@ -142,6 +142,8 @@ Pjax.prototype = { doRequest: require("./lib/send-request.js"), + handleResponse: require("./lib/proto/handle-response.js"), + loadUrl: function(href, options) { options = typeof options === "object" ? extend({}, this.options, options) : @@ -155,66 +157,7 @@ Pjax.prototype = { trigger(document, "pjax:send", options) // Do the request - this.request = this.doRequest(href, options, function(html, request) { - // 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)) + this.request = this.doRequest(href, options, this.handleResponse.bind(this)) }, afterAllSwitches: function() { diff --git a/lib/proto/handle-response.js b/lib/proto/handle-response.js new file mode 100644 index 0000000..a4faa80 --- /dev/null +++ b/lib/proto/handle-response.js @@ -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 + } + } +} diff --git a/lib/send-request.js b/lib/send-request.js index 9e203aa..37a2fa6 100644 --- a/lib/send-request.js +++ b/lib/send-request.js @@ -13,21 +13,21 @@ module.exports = function(location, options, callback) { request.onreadystatechange = function() { if (request.readyState === 4) { if (request.status === 200) { - callback(request.responseText, request) + callback(request.responseText, request, location) } else { - callback(null, request) + callback(null, request, location) } } } request.onerror = function(e) { console.log(e) - callback(null, request) + callback(null, request, location) } request.ontimeout = function() { - callback(null, request) + callback(null, request, location) } // Prepare the request payload for forms, if available