【问题标题】:Stop page refresh after form submit表单提交后停止页面刷新
【发布时间】:2017-08-17 12:57:04
【问题描述】:

我已经搜索了许多关于此的其他线程,但我看不出我做错了什么,我正在尝试将表单值发送到 php 文件以作为电子邮件发送,但是页面总是刷新。我曾尝试使用 event.preventDefault 并在我的 ajax 调用之前和之后都返回 false,但似乎都不起作用。我在这里缺少的是我的代码。

HTML

<form method="post" name="registerForm" class="form">
    <label for="fullName" class="form__fullname form__label">Full Name</label>

    <input type="text" name="fullName" placeholder="Richard Thomson" maxlength="40" tabindex="1" pattern="^[a-zA-Z\s]*$" class="form__input" id="name" required>

    <label for="email" class="form__email form__label">Email</label>

    <input type="email" name="email"  placeholder="richard.thomson45@gmail.com" tabindex="2" class="form__input" id="email" required>

    <label for="telephone" class="form__tel form__label">Phone</label>

    <input type="tel" name="telephone" placeholder="07915834998" tabindex="3" pattern="[0-9]{11}" maxlength="11" class="form__input" id="telephone" required>

    <input type="submit" value="Submit" name="submit" class="form__submit" id="submit">
</form>

JS

var fullName,
    telephone,
    email,
    submitButton = $("#submit"),        
    formData;

submitButton.submit(function (event) {
    // event.preventDefault();

    fullName = $("#name").val();
    telephone = $("#telephone").val();
    email = $("#email").val();
    formData = {
        'name': fullName,
        'email': email,
        'telephone': telephone
    };

    $.ajax({
            type: 'POST',
            url: 'email.php',
            data: formData,
            dataType: 'json'
        })
        .done(function (data) {
            console.log(data);
        })
        .fail(function () {
            console.log("not working");
        });

    return false;
});

PHP

<?php
    if($_SERVER['REQUEST_METHOD'] == 'POST') {
        if (isset($_POST['name']) && isset($_POST['email']) && isset($_POST['telephone'])) {

            if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
                $email = $_POST['email'];
            }

            if (preg_match("/^[a-zA-Z\s]*$/", $_POST['fullName'])) {
                $fullName = $_POST['fullName'];
            }

            if (preg_match("/[0-9]{11}/", $_POST['telephone'])) {
                $telephone = $_POST['telephone'];
            }

            $telephone = substr_replace(substr_replace($telephone," ",3,0)," ",8,0);

            $emailTo = "test@hotmail.co.uk";
            $emailFrom = "contact@test.co.uk";
            $subject = "I would like to know more about test";
            $message = "Name:" . " " . $fullName . "\r\n\r\n";
            $message .= "Email:" . " " . $email . "\r\n\r\n";
            $message .= "Telephone:" . " " . $telephone;

            $headers = "From: $emailFrom \r\n";
            $headers .= 'Content-Type: text/plain; charset=utf-8'; 
            $headers .= "Reply-To: $email \r\n";

            $success = mail($emailTo, $subject, $message, $headers);

        } else {
            echo("Please fill all necessary fields");
        }
    }
?>

【问题讨论】:

  • 必须在表单上调用提交事件和preventDefault()函数,而不是提交按钮
  • &lt;form method="post" name="registerForm" class="form" action="javascript::"&gt;
  • 使用按钮代替提交,
  • 可以使用按钮而不是提交,提交按钮总是刷新页面
  • @ishegg 是的,你是对的

标签: php jquery ajax forms preventdefault


【解决方案1】:

阻止提交按钮的默认设置理论上应该会停止表单提交——但是:

  1. 输入按钮没有submit 事件。如果你听click,那会奏效,但只是部分原因......
  2. 可能还有其他混杂因素会干扰此操作,即导致表单提交的其他击键或用户交互。

您应该听从表单触发的onsubmit 事件,而不是从提交按钮发出的事件。表单的提交事件是在提交表单时触发的明确事件:无论是由&lt;button&gt;&lt;input type="submit"&gt; 还是以编程方式触发,例如$form.trigger('submit')。你可以给你的表单一个ID,即:

<form method="post" name="registerForm" class="form" id="registrationForm">

然后在onsubmit 回调中执行完全相同的逻辑:

$('#registrationForm').on('submit', function(e) {
    // Prevent form submission by the browser
    e.preventDefault();

    // Rest of the logic
});

如果您不能修改 DOM 以便可以识别 &lt;form&gt; 元素,则使用 jQuery 的 DOM 遍历方法也可以,即:

var $form = submitButton.closest('form');
$form.on('submit', function(e) {
    // Prevent form submission by the browser
    e.preventDefault();

    // Rest of the logic
});

为了说明我的声明,即表单的提交事件充当“保护伞”,它捕获所有提交事件,无论它们是如何触发的,请参考我在下面附上的示例:

$(function() {
  $('#form').on('submit', function(e) {
    console.log('Form submission captured. It is triggered by: ', document.activeElement);
    //e.preventDefault();
  });
  
  $('#submitInput').on('submit', function(e) {
    console.log('Triggering submit event from <input>');
  });
  
  $('#submitButton').on('click', function() {
    console.log('Triggering submit event from <button type="submit" />');
  });

  $('#submitProgramatically').on('click', function() {
    console.log('Triggering submit event using JS only');
    $('#form').trigger('submit');
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form" action="#">
  <input type="text" placeholder="Just another text field" />
  <br />
  <input type="submit" value="Submit using an <input>" id="submitInput" />
  <br />
  <button id="submitButton">Submit using a &lt;button&gt;</button>
  <br />
  <a href="#" id="submitProgramatically">Submit programatically using JS</a>
</form>

注意:如果直接在 DOM 节点上调用 submit() 方法,则可以绕过 jQuery 的 onsubmit 事件处理程序:$('form')[0].submit()

【讨论】:

  • @charlietfl 感谢您的评论,我已更新我的答案以澄清它。可能还有其他事件正在触发表单提交,但不会触发按钮上的提交事件。
  • 感谢您的详细回答,虽然“ishegg”确实首先指出了这一点,但您也是正确的,这是我的一个愚蠢的错误
猜你喜欢
  • 2015-08-30
  • 2014-04-20
  • 2013-10-27
相关资源
最近更新 更多