【问题标题】:Ajax not redirecting after a successful response from php来自php的成功响应后Ajax没有重定向
【发布时间】:2020-08-23 21:26:15
【问题描述】:

在验证用户凭据后,我尝试从登录页面重定向到主页。响应运行良好。在获得成功响应后,我想重定向到主页。我在客户端使用 Javascript,在服务器端使用 PHP。但成功响应没有到达 ajax。

Ajax 调用

$('#login-btn').click(function(e) {
if ($('#login-form')[0].checkValidity()) {
    e.preventDefault();

    $("#login-btn").html('<img src="images/tra.gif" /> Please Wailt..');
    if ($('#Lemail').val() == '') {
        $('#error-message').fadeIn().html('* Email is Required!');
        setTimeout(function() {
            $('#error-message').fadeOut('slow');
        }, 5000);
    } else if ($('#Lpassword').val() == '') {
        $('#error-message').fadeIn().html('* Please enter password!');
        setTimeout(function() {
            $('#error-message').fadeOut('slow');
        }, 5000);
    } else {
        $('#error-message').text('');
        $.ajax({
            url: 'actionlog.php',
            method: 'POST',
            data: $('#login-form').serialize() + '&action=login',
            success: function(response) {
                if (response === 'true') {
                    window.location = '../';
                } else {
                    $('#logAlert').html(response);
                }
            }

        });
    }
}
});

});

PHP 代码:

<?php
//Login Request
if (isset($_POST['action']) && $_POST['action'] == 'login') {
    if (Input::exists()) {
      $validate = new Validate();
      $validation = $validate->check($_POST, array(
        'email' => array('required' => true),
        'password' => array('required' => true)

      ));
      if ($validation->passed()) {
        $user = new User();
        //create Remember
        $remember = (Input::get('remember') === 'on') ? true : false;
        $login = $user->login(Input::get('email'), Input::get('password'), $remember);
        if ($login) {
          echo 'true';
        }
      }else{
        foreach ($validation->errors() as $error) {
          $user = new User();
          echo  $user->showMessage('danger',$error);

        }
        }
    }
      
}

我需要帮助

【问题讨论】:

  • 需要更多调试细节。是否正在提出请求?您是否尝试过使用 ajax 错误处理程序?如果没有更多细节,我们只能猜测并问你很多问题

标签: php jquery ajax action


【解决方案1】:

您必须修剪您的响应......有时从服务器收到的字符串包含空格......这会导致问题无法重定向到其他页面。

$.ajax({
            url: 'actionlog.php',
            method: 'POST',
            data: $('#login-form').serialize() + '&action=login',
            success: function(response) {
                if ($.trim(response) === 'true') {
                    window.location = '../';
                } else {
                    $('#logAlert').html(response);
                }
            }

        });

【讨论】:

    【解决方案2】:

    尝试这样做:

    $.ajax({
                type: "POST",
                url: 'actionlog.php',
                data: $('#login-form').serialize()+'&action=login',
                dataType: 'json',
                beforeSend: function(){},
                success: function(response){
                    window.location.href = '/';
                },
                error: function(){
                    console.log('You got an error');
                }
            });
    

    如果您从服务器获得成功的响应,这应该可以工作。此示例暗示服务器将返回 json,但您可以指定任何您喜欢的内容。

    UPD:我的错。您可以同时使用 window.locationwindow.location.href。另外,在上面的示例中,我删除了选项

    processData: false,
    contentType: false,
    

    因为如果您发送 FormData,就会使用它们。您可能需要考虑使用 FormData 并将其传递给 data :) 这在发送带有文件的表单时非常有用

    使用 FormData 将如下所示:

    $(document).on('submit','.your-form-selector', function(e){
        e.preventDefault();
    
        var data = new FormData(this); // "this" is your form and includes all the form fields
    
        $.ajax({
                    type: "POST",
                    url: 'actionlog.php',
                    data: data, // FormData goes here
                    dataType: 'json',
                    processData: false,
                    contentType: false,
                    beforeSend: function(){},
                    success: function(response){
                        window.location.href = '/';
                    },
                    error: function(){
                        console.log('You got an error');
                    }
                });
    
    });
    

    【讨论】:

    • 设置window.location ='/somepath'实际上与设置window.location.href ='/somepath'相同。两种方法都有效
    • 确实如此。两者都是可能的。我只是从不将它用作window.location。 href 变体更加明确。但这并没有改变重点。问题是让 ajax 工作,我写的 :)
    • 好吧,我也不明白您为什么要删除 contentType 并禁用 processData。无法发送没有内容类型的帖子
    • 谢谢,但我希望服务器端出现错误,例如密码错误,或者找不到用户在页面上显示以供用户查看。然后如果没有错误它应该重定向到索引
    • @UCodeTech,那么这取决于您从服务器获得的响应。例如如果你得到一个像{"success": true, "data": ["some data"]}这样的json,你可以写if (response.success) window.location.href = '/';然后如果成功,它会将用户重定向到主页
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2021-01-06
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多