Files
pjax/lib/send-request.js

87 lines
2.5 KiB
JavaScript
Raw Normal View History

var updateQueryString = require("./util/update-query-string");
module.exports = function(location, options, callback) {
2019-02-11 23:17:28 -05:00
options = options || {};
var queryString;
var requestOptions = options.requestOptions || {};
var requestMethod = (requestOptions.requestMethod || "GET").toUpperCase();
var requestParams = requestOptions.requestParams || null;
var formData = requestOptions.formData || null;
2019-02-11 23:17:28 -05:00
var requestPayload = null;
var request = new XMLHttpRequest();
var timeout = options.timeout || 0;
2014-05-04 08:45:22 +02:00
request.onreadystatechange = function() {
if (request.readyState === 4) {
if (request.status === 200) {
2019-02-11 23:17:28 -05:00
callback(request.responseText, request, location, options);
} else if (request.status !== 0) {
callback(null, request, location, options);
2014-05-04 08:45:22 +02:00
}
}
2019-02-11 23:17:28 -05:00
};
2014-05-04 08:45:22 +02:00
request.onerror = function(e) {
2019-02-11 23:17:28 -05:00
console.log(e);
callback(null, request, location, options);
};
request.ontimeout = function() {
2019-02-11 23:17:28 -05:00
callback(null, request, location, options);
};
// Prepare the request payload for forms, if available
if (requestParams && requestParams.length) {
// Build query string
2019-02-11 23:17:28 -05:00
queryString = requestParams
.map(function(param) {
return param.name + "=" + param.value;
})
.join("&");
switch (requestMethod) {
case "GET":
// Reset query string to avoid an issue with repeat submissions where checkboxes that were
// previously checked are incorrectly preserved
2019-02-11 23:17:28 -05:00
location = location.split("?")[0];
// Append new query string
2019-02-11 23:17:28 -05:00
location += "?" + queryString;
break;
case "POST":
// Send query string as request payload
2019-02-11 23:17:28 -05:00
requestPayload = queryString;
break;
}
2019-02-11 23:17:28 -05:00
} else if (formData) {
requestPayload = formData;
}
// Add a timestamp as part of the query string if cache busting is enabled
if (options.cacheBust) {
2019-02-11 23:17:28 -05:00
location = updateQueryString(location, "t", Date.now());
}
2019-02-11 23:17:28 -05:00
request.open(requestMethod, location, true);
request.timeout = timeout;
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
request.setRequestHeader("X-PJAX", "true");
request.setRequestHeader(
"X-PJAX-Selectors",
JSON.stringify(options.selectors)
);
// Send the proper header information for POST forms
if (requestPayload && requestMethod === "POST" && !formData) {
2019-02-11 23:17:28 -05:00
request.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded"
);
}
2019-02-11 23:17:28 -05:00
request.send(requestPayload);
2019-02-11 23:17:28 -05:00
return request;
};