【问题标题】:Return false does not stop form submit返回 false 不会停止表单提交
【发布时间】:2015-01-20 12:44:47
【问题描述】:

我正在尝试提交一个验证表单,然后在 PHP 中登录用户。出现错误时我返回 false,但它不会阻止表单提交。如何防止表单仅在出现错误时提交?我在底部放了一个return false,但这会阻止整个表单提交,即使登录良好。

login.js

$('#login_form').submit(function(e) {
if (validate({required: "email, password"}) == true) {
    return attemptLogin();
} else {
    return false;
}
});

function attemptLogin() {
var email = $("#email").val();
var password = $("#password").val();
var json = "JSON";
$.ajax({
    url: "/login",
    type: "POST",
    data: {
        email: email,
        password: password,
        json: json
    },
    success: function (data) {
        data = JSON.parse(data);
        if (data['message'] != 'undefined') {
            if (data['message'] != 'success') {
                $('#errors').html(data['message']);
                return false;
            }
        }
    }
});

}

和我的 PHP

if ($validation === true) {
        $user->findByEmail($_POST['email'], array('first_name', 'password', 'id'));
        if (!$user->login($_POST['password'], $user->password, $user->id)) {
            if (isset($_POST['json'])) {
                echo json_encode(array('message' => 'Invalid email or password.'));
                die;
            } else {
                $redirect->to('/login', '<div class="message message-error">Invalid email or password.</div>');
            }
        } else {
            echo json_encode(array('message' => 'success'));
            //die;
            $redirect->to('/home', '<div class="message message-success">Hi ' . $user->first_name . ', you have been logged in!</div>');
        }

【问题讨论】:

  • 如果你想在 php 中停止执行循环或模块,那么你可以使用 break;这将中断 php 的当前执行并继续下一部分。

标签: javascript php jquery forms


【解决方案1】:

您可以使用e.preventDefault() - 它会阻止任何默认浏览器事件;

$('#login_form').submit(function(e) {

  e.preventDefault();

  if (validate({required: "email, password"}) == true) attemptLogin();
});

【讨论】:

  • 这对我有用,但是有什么方法可以继续 PHP 以便它重定向并闪烁消息?如果我在其中输入我的凭据,则不会这样做。
  • 我不知道如何使用您的代码执行此操作。您可以保持完全 ajax 并将成功消息附加到任何您想要的客户端,然后像 setTimeout(function() { window.location = '/home' }, 5000) 一样 - 它会向客户端显示成功消息并在 5 秒后重定向他到主页。或者您可以删除 ajax 内容并继续使用纯表单提交。不幸的是,我看不到其他选项。
  • 谢谢,感谢您的帮助。 @canvaskisa
【解决方案2】:

仅在 if 语句中返回 false。我想存储一个可以从成功函数(数据)返回的标志。试试这个,

success: function (data) {
    data = JSON.parse(data);
    var flag = true;
    if (data['message'] != 'undefined') {
        if (data['message'] != 'success') {
            $('#errors').html(data['message']);
            flag = false;
            return flag;
        }
    }
    return flag;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2016-02-12
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多