Created
July 5, 2020 07:18
-
-
Save fredsiika/f02750fc3edd4ce18aa30548ea54a83e to your computer and use it in GitHub Desktop.
Submit a CTA Form to Google Sheets Using "AJAX"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function() { | |
// get all data in form and return object | |
function getFormData(form) { | |
var elements = form.elements; | |
var honeypot; | |
var fields = Object.keys(elements).filter(function(k) { | |
if (elements[k].name === "honeypot") { | |
honeypot = elements[k].value; | |
return false; | |
} | |
return true; | |
}).map(function(k) { | |
if(elements[k].name !== undefined) { | |
return elements[k].name; | |
// special case for Edge's html collection | |
}else if(elements[k].length > 0){ | |
return elements[k].item(0).name; | |
} | |
}).filter(function(item, pos, self) { | |
return self.indexOf(item) == pos && item; | |
}); | |
var formData = {}; | |
fields.forEach(function(name){ | |
var element = elements[name]; | |
// singular form elements just have one value | |
formData[name] = element.value; | |
// when our element has multiple items, get their values | |
if (element.length) { | |
var data = []; | |
for (var i = 0; i < element.length; i++) { | |
var item = element.item(i); | |
if (item.checked || item.selected) { | |
data.push(item.value); | |
} | |
} | |
formData[name] = data.join(', '); | |
} | |
}); | |
// add form-specific values into the data | |
formData.formDataNameOrder = JSON.stringify(fields); | |
formData.formGoogleSheetName = form.dataset.sheet || "responses"; // default sheet name | |
formData.formGoogleSendEmail = form.dataset.email || ""; // no email by default | |
return {data: formData, honeypot: honeypot}; | |
} | |
function handleFormSubmit(event) { // handles form submit without any jquery | |
event.preventDefault(); // we are submitting via xhr below | |
var form = event.target; | |
var formData = getFormData(form); | |
var data = formData.data; | |
// If a honeypot field is filled, assume it was done so by a spam bot. | |
if (formData.honeypot) { | |
return false; | |
} | |
disableAllButtons(form); | |
var url = form.action; | |
var xhr = new XMLHttpRequest(); | |
xhr.open('POST', url); | |
// xhr.withCredentials = true; | |
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); | |
xhr.onreadystatechange = function() { | |
if (xhr.readyState === 4 && xhr.status === 200) { | |
form.reset(); | |
var formElements = form.querySelector(".form-elements") | |
if (formElements) { | |
formElements.style.display = "none"; // hide form | |
} | |
var thankYouMessage = form.querySelector(".thankyou_message"); | |
if (thankYouMessage) { | |
thankYouMessage.style.display = "block"; | |
} | |
} | |
}; | |
// url encode form data for sending as post data | |
var encoded = Object.keys(data).map(function(k) { | |
return encodeURIComponent(k) + "=" + encodeURIComponent(data[k]); | |
}).join('&'); | |
xhr.send(encoded); | |
} | |
function loaded() { | |
// bind to the submit event of our form | |
var forms = document.querySelectorAll("form.gform"); | |
for (var i = 0; i < forms.length; i++) { | |
forms[i].addEventListener("submit", handleFormSubmit, false); | |
} | |
}; | |
document.addEventListener("DOMContentLoaded", loaded, false); | |
function disableAllButtons(form) { | |
var buttons = form.querySelectorAll("button"); | |
for (var i = 0; i < buttons.length; i++) { | |
buttons[i].disabled = true; | |
} | |
} | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment