Fix form submission #129

Merged
robinnorth merged 4 commits from fix/forms into master 2018-03-02 15:25:09 -05:00
3 changed files with 45 additions and 16 deletions
Showing only changes of commit a5b51f34df - Show all commits

View File

@@ -44,23 +44,19 @@ var formAction = function(el, event) {
event.preventDefault() event.preventDefault()
var paramObject = [] var params = []
for (var elementKey in el.elements) { for (var elementKey in el.elements) {
var element = el.elements[elementKey] var element = el.elements[elementKey]
// jscs:disable disallowImplicitTypeConversion // jscs:disable disallowImplicitTypeConversion
if (!!element.name && element.attributes !== undefined && element.tagName.toLowerCase() !== "button") { if (!!element.name && element.attributes !== undefined && element.tagName.toLowerCase() !== "button") {
// jscs:enable disallowImplicitTypeConversion // jscs:enable disallowImplicitTypeConversion
if ((!element.attributes.type || element.attributes.type.value !== "checkbox" && element.attributes.type.value !== "radio") || element.checked) { if ((!element.attributes.type || element.attributes.type.value !== "checkbox" && element.attributes.type.value !== "radio") || element.checked) {
paramObject.push({name: encodeURIComponent(element.name), value: encodeURIComponent(element.value)}) params.push({name: encodeURIComponent(element.name), value: encodeURIComponent(element.value)})
} }
} }
} }
// Creating a getString options.requestOptions.requestParams = params
var paramsString = (paramObject.map(function(value) {return value.name + "=" + value.value})).join("&")
options.requestOptions.requestPayload = paramObject
options.requestOptions.requestPayloadString = paramsString
el.setAttribute(attrClick, "submit") el.setAttribute(attrClick, "submit")

View File

@@ -1,7 +1,10 @@
var updateQueryString = require("./util/update-query-string");
module.exports = function(location, options, callback) { module.exports = function(location, options, callback) {
options = options || {} options = options || {}
var requestMethod = options.requestMethod || "GET" var requestMethod = (options.requestMethod || "GET").toUpperCase()
var requestPayload = options.requestPayloadString || null var requestParams = options.requestParams || null
var requestPayload = null
var request = new XMLHttpRequest() var request = new XMLHttpRequest()
request.onreadystatechange = function() { request.onreadystatechange = function() {
@@ -24,19 +27,39 @@ module.exports = function(location, options, callback) {
callback(null, request) callback(null, request)
} }
// Add a timestamp as part of the query string if cache busting is enabled // Prepare the request payload for forms, if available
if (this.options.cacheBust) { if (requestParams && requestParams.length) {
location += (!/[?&]/.test(location) ? "?" : "&") + new Date().getTime() 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.timeout = options.timeout
request.setRequestHeader("X-Requested-With", "XMLHttpRequest") request.setRequestHeader("X-Requested-With", "XMLHttpRequest")
request.setRequestHeader("X-PJAX", "true") request.setRequestHeader("X-PJAX", "true")
// Add the request payload if available // Send the proper header information for POST forms
if (options.requestPayloadString !== undefined && options.requestPayloadString !== "") { if (requestPayload && requestMethod === "POST") {
// Send the proper header information along with the request
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded") request.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
} }

View File

@@ -0,0 +1,10 @@
module.exports = function(uri, key, value) {
var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i")
var separator = uri.indexOf("?") !== -1 ? "&" : "?"
if (uri.match(re)) {
return uri.replace(re, "$1" + key + "=" + value + "$2")
}
else {
return uri + separator + key + "=" + value
}
}