Bootstrap 4 Contact Request Ajax Form

Contact form that doesn't require page refresh. jQuery >= v1.6 example.
<div class="container">
  <div class="row mx-0 justify-content-center">
    <div class="col-md-7 col-lg-5 px-lg-2 col-xl-4 px-xl-0">
      <form
        id="contact-form"
        method="POST"
        class="w-100 rounded p-4 border bg-white"
        action="https://herotofu.com/start"
      >
        <label class="d-block mb-4">
          <span class="d-block mb-2">Your name</span>
          <input
            name="name"
            type="text"
            class="form-control"
            placeholder="Joe Bloggs"
          />
        </label>

        <label class="d-block mb-4">
          <span class="d-block mb-2">Email address</span>
          <input
            name="email"
            type="email"
            class="form-control"
            placeholder="joe.bloggs@example.com"
          />
        </label>

        <label class="d-block mb-4">
          <span class="d-block mb-2">Message</span>
          <textarea
            name="message"
            class="form-control"
            rows="3"
            placeholder="Tell us what you're thinking about..."
          ></textarea>
        </label>

        <div class="mb-3">
          <button id="form-submit" type="submit" class="btn btn-primary px-3">
            Contact Us
          </button>
        </div>

        <div class="d-block text-right">
          <div class="small">
            by
            <a
              href="https://herotofu.com/start"
              class="text-dark"
              target="_blank"
              >HeroTofu</a
            >
          </div>
        </div>
      </form>
    </div>
  </div>
</div>
<script>
  $('#contact-form').submit(function (e) {
    e.preventDefault();

    var $form = $(this),
      $formSubmit = $('#form-submit'),
      formArray = $form.serializeArray(),
      data = {};

    $formSubmit.attr('disabled', 'disabled').text('Loading...');

    for (var i = 0; i < formArray.length; i++) {
      data[formArray[i].name] = formArray[i].value;
    }

    $.ajax({
      type: 'POST',
      contentType: 'application/json; charset=utf-8',
      dataType: 'json',
      url: $form.attr('action'),
      data: JSON.stringify(data),
    }).always(function (data) {
      if (data.status === 422) {
        alert('Ajax requests do not support captcha. Please turn it off.');
        $formSubmit
          .parent()
          .html('<strong>Error, failed to send the message!</strong>');
      }

      if (data.status !== 200) {
        alert('Error: ' + data.statusText + ' (' + data.status + ')');
        $formSubmit
          .parent()
          .html('<strong>Error, failed to send the message!</strong>');
      }

      $formSubmit.parent().html('Thank you for contacting us!');
    });
  });
</script>
/* The following CSS is used only for the preview,
   please don't copy it to your production code */
body { padding: 2rem 0; }

Frequently Asked Questions

Can I use it freely in a commercial project?

Yes! Attribution is welcomed but not required. The only caveat is that you can't re-sell this code directly as a standalone component.

Why is it free?

It's free because HeroTofu gets revenue from form submissions handling rather than forms themselves.

I've copied the form code. What are the next steps?

You should connect your form to the backend to store submissions. Subjectively the best way to do so is to navigate to https://herotofu.com/start 🙂

Who's behind HeroTofu?

Munero Company operates HeroTofu. It's incorporated in the EU 🇪🇺

HeroTofu is a set of tools and APIs designed to help you in your marketing campaigns.

© 2021 HeroTofu by Munero