Fix GET form submission

This commit is contained in:
Robin North
2018-02-21 18:27:26 +00:00
parent b7fc3457de
commit a5b51f34df
3 changed files with 45 additions and 16 deletions

View File

@@ -1,7 +1,10 @@
var updateQueryString = require("./util/update-query-string");
module.exports = function(location, options, callback) {
options = options || {}
var requestMethod = options.requestMethod || "GET"
var requestPayload = options.requestPayloadString || null
var requestMethod = (options.requestMethod || "GET").toUpperCase()
var requestParams = options.requestParams || null
var requestPayload = null
var request = new XMLHttpRequest()
request.onreadystatechange = function() {
@@ -24,19 +27,39 @@ module.exports = function(location, options, callback) {
callback(null, request)
}
// Add a timestamp as part of the query string if cache busting is enabled
if (this.options.cacheBust) {
location += (!/[?&]/.test(location) ? "?" : "&") + new Date().getTime()
// Prepare the request payload for forms, if available
if (requestParams && requestParams.length) {
switch (requestMethod) {
case "GET":
// Reset query string to avoid an issue with repeat submissions where checkboxes that were
// previously checked are incorrectly preserved
location = location.split("?")[0]
// Build new query string
requestParams.forEach(function(param) {
location = updateQueryString(location, param.name, param.value)
});
break;
case "POST":
// Build payload string
requestPayload = (requestParams.map(function(param) {return param.name + "=" + param.value})).join("&")
break;
}
}
request.open(requestMethod.toUpperCase(), location, true)
// Add a timestamp as part of the query string if cache busting is enabled
if (this.options.cacheBust) {
location = updateQueryString(location, "t", Date.now())
}
request.open(requestMethod, location, true)
request.timeout = options.timeout
request.setRequestHeader("X-Requested-With", "XMLHttpRequest")
request.setRequestHeader("X-PJAX", "true")
// Add the request payload if available
if (options.requestPayloadString !== undefined && options.requestPayloadString !== "") {
// Send the proper header information along with the request
// Send the proper header information for POST forms
if (requestPayload && requestMethod === "POST") {
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
}