【问题标题】:Form being submitted twice (AJAX)表单提交两次(AJAX)
【发布时间】:2019-02-05 10:28:16
【问题描述】:

由于某种原因,每次我提交表单时,AJAX 函数都会在网络选项卡中调用两次。我不知道为什么会发生这种情况我的网站上有另一个 ajax 函数没有这样做,所以我一定是在某个地方出错了。我看到许多其他人在这里问过这个问题,但他们的解决方案都没有帮助我。

这是我的完整 JS/AJAX 代码;

// submit form function
jQuery('#form').on('submit', function(e){
    e.preventDefault();

    var $ = jQuery; 
    var filter = $('#form');
    var form_data = $('#form').serializeArray();
    $('#load_more').data('page', 1);

    $.ajax({
        url: ajax_url,
        type: 'post',
        data: form_data,
        dataType: 'json',
        error : function(response){
            console.log(response);
        },
        success : function(response){
            $('#loop').empty();

            for( var i = 0; i < response.post_cont.length; i++ ){
                var html =''+
                    '<div class="col-4">'+
                        '<a href="'+ response.post_cont[i].permalink +'">'+
                            '<div class="card" style="width: 100%;">'+
                                '<div class="post_image" style="background-image: url('+ response.post_cont[i].image +');"></div>'+

                                '<div class="card-body">'+
                                    '<h5 class="card-title">'+ response.post_cont[i].title +'</h5>'+
                                '</div>'+
                            '</div>'+
                        '</a>'+
                    '</div>';

                $('#loop').append(html);
            }

            if( jQuery('#loop .card').length < response.max_posts[0].no_of_posts){
                $('#load_more').show();
            }else{
                $('#load_more').hide();
            }
        }
    });
});

// button function for form filters
jQuery('#form .option').click(function(){
    var $ = jQuery;
    $('#form .option').removeClass('active');

    var elem = $(this);
    var input = elem.children('input');
    input.click();
    elem.addClass('active');

    $('#form').submit();
});

这是我的html;

<div class="container">
    <form action="" method="POST" id="form">

        <div id="filters">
            <div class="option">
                <p>Assisted Needs/Residential</p>
                <input type="checkbox" name="type[]" value="Assisted Needs/Residential">
            </div>

            <div class="option">
                <p>Commercial</p>
                <input type="checkbox" name="type[]" value="Commercial">
            </div>

            <div class="option">
                <p>Private Housing</p>
                <input type="checkbox" name="type[]" value="Private Housing">
            </div>

            <div class="option">
                <p>Social Housing</p>
                <input type="checkbox" name="type[]" value="Social Housing">
            </div>
        </div>

        <input type="hidden" name="action" value="filter">
    </form>

    <div id="loop" class="row">

    </div>

    <div class="row justify-content-center">
        <div class="col-auto">  
            <a id="load_more" href="javascript:;" data-page="1"><p>More</p></a>
        </div>
    </div>
</div>

【问题讨论】:

  • 服务器是否进行了某种重定向?这个博客涵盖了你可能会寻找的东西:airbrake.io/blog/http-errors/302-found
  • @JGFMK 我对此表示怀疑,因为我有另一个 AJAX 函数不这样做
  • 你看我的更新了吗?

标签: jquery html ajax forms


【解决方案1】:

问题是由于您的input.click() 呼叫造成的。这会在每个复选框上引发一个单击事件,该事件被捕获并再次提交form。只需删除该行。

还请注意,您可以使用 document.ready 处理程序中的第一个参数为 jQuery 变量设置别名,这样您就可以删除重复的不必要的 var $ = jQuery 行。

jQuery(function($) {
  $('#form').on('submit', function(e) {
    e.preventDefault();

    var filter = $('#form');
    var form_data = $('#form').serializeArray();
    $('#load_more').data('page', 1);

    // your ajax call here...
    console.log('making an AJAX request...');
  });

  // button function for form filters
  $('#form .option').click(function() {
    $('#form .option').removeClass('active');
    $(this).addClass('active');
    $('#form').submit();
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
  <form action="" method="POST" id="form">
    <div id="filters">
      <div class="option">
        <p>Assisted Needs/Residential</p>
        <input type="checkbox" name="type[]" value="Assisted Needs/Residential">
      </div>
      <div class="option">
        <p>Commercial</p>
        <input type="checkbox" name="type[]" value="Commercial">
      </div>
      <div class="option">
        <p>Private Housing</p>
        <input type="checkbox" name="type[]" value="Private Housing">
      </div>
      <div class="option">
        <p>Social Housing</p>
        <input type="checkbox" name="type[]" value="Social Housing">
      </div>
    </div>
    <input type="hidden" name="action" value="filter">
  </form>
  <div id="loop" class="row"></div>
  <div class="row justify-content-center">
    <div class="col-auto">
      <a id="load_more" href="javascript:;" data-page="1">
        <p>More</p>
      </a>
    </div>
  </div>
</div>

【讨论】:

  • 我在你回答前 8 分钟写了那个答案,你得到 +2 :) 我会删除我的答案。您可以收集所有积分。
  • 您不必删除您的。当我开始写这个答案时,你的只是建议添加 onsubmit 属性。
  • 感谢这工作。但我以为我只是将点击事件应用于一个输入而不是全部。当我得到点击选项的子输入时。
猜你喜欢
  • 2011-06-17
  • 2015-04-04
  • 2013-12-10
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
相关资源
最近更新 更多