【问题标题】:Why ajax keeps redirecting to other page after success or error为什么ajax在成功或错误后不断重定向到其他页面
【发布时间】:2018-04-24 20:12:53
【问题描述】:

我是 ajax 新手,现在我想使用 ajax,这样我的页面在添加数据时不会重新加载并显示错误或成功消息。但在实现中,当我提交表单时,它会将我重定向到另一个页面,其中包含表单验证错误/成功消息。我试图解决这个问题,但我找不到错误。我正在使用 Jquery 1.8.3 和 codeigniter。这是我的代码。

自定义.js

function tambahBuku() {
$('#form_tambah')[0].reset();
$('#form_tambah').unbind('submit').bind('submit',function() {
var form = $(this);

  $.ajax({
    url: "http://localhost:8000/prjperpus-ci/Table/tambah",
    type: "POST",
    data : form.serialize(), //converting the form data into array and sending it to server
    dataType : "json",
    success:function(response, xhr, ajaxOptions, thrownError){
        alert("OKAY"); alert(xhr.status);
      if(response.success == true){
            alert("OK");
        $(".messages").html('<div class="alert alert-success alert-dismissible" role="alert">' +
        '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
        '<strong><span class="glyphicon glyphicon-ok-sign"> </span></strong>' + response.messages + '</div>')
      } else{
        if(response.messages instanceof Array){
          $.each(response.messages, function(index,value) {
            alert(index);
          });
        } else {
          alert("OK else");
          $(".messages").html('<div class="alert alert-warning alert-dismissible" role="alert">' +
          '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
          '<strong><span class="glyphicon glyphicon-exclamination-sign"> </span></strong>' + response.messages + '</div>')
        }
      }
    },   error: function(xhr, ajaxOptions, thrownError){
        alert("ERROR");
            alert(xhr.readyState);
        }
  })
});

}

查看

 <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#tambah" onclick="tambahBuku()">Tambah Buku</button>
 <div class="messages"></div>

<div class="modal fade" id="tambah" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
    <div class="modal-content">
       <div class="modal-header">
           <h3 class="modal-title" id="exampleModalLabel">Input Buku</h3>
             <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">&times;</span>
             </button>
       </div>
             <?php $attributes = array('id' => 'form_tambah','method' => 'POST');
                 echo form_open('Table/tambah', $attributes); ?>
                   <div class="modal-body">
                      <div class="form-group">
                          <label>ISBN</label>
                          <input type="text" class="form-control" id="" placeholder="ISBN" name="isbn">
                      </div>
                      <div class="form-group">
                          <label>Judul Buku</label>
                          <input type="text" class="form-control" id="" placeholder="Judul Buku" name="judul">
                      </div>
                  </div>
                  <div class="modal-footer">
                     <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                     <button type="submit" class="btn btn-primary" onclick="">Save changes</button>
                  </div>
             <?php echo form_close(); ?>
     </div> 
</div> 
</div>

控制器(Table.php)

  public function tambah()
  {
        $data = array(
          'ISBN' => $this->input->post('isbn'),
          'Judul_Buku' => $this->input->post('judul'),
        );

        $config = array(
          array(
            'field' => 'isbn',
            'label' => 'ISBN',
            'rules' => 'trim|required'
          ),
          array(
            'field' => 'judul',
            'label' => 'Judul buku',
            'rules' => 'trim|required|is_unique[buku.Judul_Buku]'
          )
       };
         $this->form_validation->set_rules($config);

   $validator = array('success' => false , 'messages' => array());
   if($this->form_validation->run() === TRUE){
     $insert_Book = $this->action->insert_record("buku",$data);

     if($insert_Book == true){
        $validator['success'] = true;
        $validator['messages'] = "Data sukses ditambahkan";
        var_dump($validator);
     } else{
       $validator['success'] = false;
       $validator['messages'] = "Data gagal ditambahkan";
     }    
   }else{
     $validator['success'] = false;
     foreach ($_POST as $key => $value) {
      $validator['messages'][$key] = form_error($key);
     }
   }
   echo json_encode($validator);
}

模型(action.php)

public function get_data($table){
      return $this->db->get($table);
}

public function insert_record($table,$data){
  $sql = $this->db->insert($table, $data);
  if($sql === true){
    return true;
  } else{
    return false;
  }
}

【问题讨论】:

  • 成功的正确语法是success: function(data, status, xhr) { ... xhr 是第三个参数
  • 我改了还是一样
  • 请具体说明,它是未定义的?您是否尝试过控制台记录 xhr 参数?

标签: php jquery ajax codeigniter


【解决方案1】:

如果您使用 ajax 提交数据,则必须阻止 HTML 提交(这是导致重定向的原因)。
您可以使用提交处理程序中事件对象的 preventDefault 方法来完成此操作。

$('#form_tambah').unbind('submit').bind('submit',function(event) {
    event.preventDefault();

【讨论】:

  • 为什么它一直显示表单验证错误以及为什么 xhr.status 在成功条件下未定义。
  • {"success":false,"messages":{"isbn":" ISBN 字段为必填项。\/p>","judul":" Judul buku 字段为必填项。 ", 它返回 echo json_encode($validator);在控制器中
  • xhr.status 在标头中返回 200,但是当我尝试在成功条件下警告(xhr.status)时它返回未定义
  • 这可能是一个愚蠢的问题,但您提交时是否填写了这些字段?另外我不确定您是否注意到了,但您在提交之前正在重置表单......因此没有值
  • 如果我没有填写表单中的任何字段,如果我填写了添加的数据,但它重定向到另一个页面并回显 json_encode($validator)。有时返回 judul buku 必须包含唯一值,但数据添加到数据库中。对于像我这样的初学者来说,这是非常复杂的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多