javascript - Fullcalendar AJAX 调用多次触发,无需重新加载页面

标签 javascript jquery ajax fullcalendar

当我点击月 View 中的某一天时,会弹出一个模式。

该模式内部有一个用于添加新事件的按钮。当我单击该按钮时,将弹出“添加事件”表单的另一个模式。

问题是,当我频繁打开/关闭第一个模式并尝试在之后添加事件而不重新加载页面时,即使我仅单击提交一次,AJAX 调用也会多次触发。有时它会增加7倍。

我不知道问题出在哪里。

我的代码:

$(document).ready(function() {
      var calendar = $('#calendar').fullCalendar({
        header: {
          left: 'today',
          center: 'prev title next',
          right: 'month,basicWeek,basicDay'
        },
        eventOrder: 'start',
        editable: true,
        droppable: true,
        eventLimit: true,
        selectable: true,
        selectHelper: true,
        events: 'getEvents.php',
        eventRender: function(event, element, view) {
            var today = new Date();
            var startString = moment(event.start).format('YYYY-MM-DD');
            var endString = moment(event.end).format('YYYY-MM-DD');
            $(element).each(function () { 
              $(this).attr('date-num', event.start.format('YYYY-MM-DD')); 
            });
        },
        eventAfterAllRender: function(view){
          for( cDay = view.start.clone(); cDay.isBefore(view.end) ; cDay.add(1, 'day') ){
            var dateNum = cDay.format('YYYY-MM-DD');
            var dayEl = $('.fc-day[data-date="' + dateNum + '"]');
            var eventCount = $('.fc-event[date-num="' + dateNum + '"]').length;
            if(eventCount){
              var html = '<span class="event-count">' + 
                        '<i>' +
                        eventCount + 
                        '</i>' +
                        ' Events' +
                        '</span>';

              dayEl.append(html);
            }
          }
        },
        dayClick: function(start, end, event) {
          var st = start.format('YYYY-MM-DD HH:mm:ss');
          var en = start.format('YYYY-MM-DD HH:mm:ss');

          function fetch_data() {
            $.ajax({
              url: "view-data.php",
              data: 'action=view&start=' + st + '&end=' + en,
              method: "POST",
              success: function(data) {
                $('#view-me').html(data);
                $('#view-data').modal('show');
              }
            });
          }

          fetch_data();

          $(document).on('click', '.add-me', function() {
            $('#start').val(moment($(this).data('start')).format('YYYY-MM-DD[T]HH:mm:ss'));
            $('#end').val(moment($(this).data('end')).format('YYYY-MM-DD[T]HH:mm:ss'));
            $('#ModalAdd').modal('show');

            $('#myFormAdd').on('submit', function(e) { // add event submit
              e.preventDefault();
              doAdd(); // send to form submit function
            });

            function doAdd() { // add event
              var title = $('#title').val();
              var start = $('#start').val();
              var end = $('#end').val();

              $.ajax({
                url: 'addEvent.php',
                data: 'action=add&title=' + title + '&start=' + start + '&end=' + end,
                type: "POST",
                success: function(json) {
                  $('#ModalAdd').modal('hide');
                  fetch_data();
                  calendar.fullCalendar('refetchEvents');
                }
              });
            }
          });
        }
      );

我的 PHP 代码:view-data.php

 if($_POST['action'] == "view") // view event dayClick
{ 
 $start = $_POST['start'];
 $end = $_POST['end'];
 ?>

  //Add new button
  <button title="add new here" class="add-me" data-start="<?php echo $start; ?>" 
  data-end="<?php echo $end; ?>" rel="dialog" >ADD</button>

<?php 

 $sql = "SELECT * FROM events WHERE start BETWEEN '$start' AND '$end' OR end BETWEEN '$start' AND '$end'";  
 $result = mysqli_query($connect, $sql);  

 if(mysqli_num_rows($result) > 0)  
 {  
  while($row = mysqli_fetch_array($result))  
  {
  ?>

  <span style="overflow:hidden;text-overflow:ellipsis;white-space: nowrap;"><?php echo $row['title']; ?></span>

  <?php
  }
  } else {
     echo "<span>No event</span>";
  }
  }   
  ?>

最佳答案

目前,在 dayClick 事件处理程序中,您已经获得了用于添加所有其他事件处理程序的代码,并且还定义了一些函数。这不是一件好事,因为这意味着每次用户单击一天时,此代码都会运行并不断向您的页面添加越来越多的事件处理程序。添加事件处理程序不会覆盖以前添加的处理程序,它只是不断添加更多处理程序。然后,每次触发您添加处理程序的事件时,它都会同时执行附加到它的所有事件处理程序。

这解释了为什么有时您会看到 ajax 调用一次又一次地运行 - 在您已经多次点击某一天(或不同的日子)的情况下。

您需要确保您的事件处理代码仅运行一次,并且您的函数仅声明一次。为此,请将所有代码移至日历配置之外。然后,您还需要允许将一些参数传递给 fetch_data 函数,以便它知道要获取什么而不依赖于闭包范围:

因此,在您的完整日历代码中:

dayClick: function(start, end, event) {
  fetch_data(start, end);
}

就是这样,这就是日历配置中所需的全部内容。

然后,在日历配置之外:

function fetch_data(start, end) {
  var st = start.format('YYYY-MM-DD HH:mm:ss');
  var en = start.format('YYYY-MM-DD HH:mm:ss');
  $.ajax({
    url: "view-data.php",
    data: 'action=view&start=' + st + '&end=' + en,
    method: "POST",
    success: function(data) {
      $('#view-me').html(data);
      $('#view-data').modal('show');
    }
  });
}


$(document).on('click', '.add-me', function() {
  $('#start').val(moment($(this).data('start')).format('YYYY-MM-DD[T]HH:mm:ss'));
  $('#end').val(moment($(this).data('end')).format('YYYY-MM-DD[T]HH:mm:ss'));
  $('#ModalAdd').modal('show');
});

$(document).on("submit", '#myFormAdd', function(e) { // add event submit
  e.preventDefault();
  doAdd(); // send to form submit function
});

function doAdd() { // add event
  var title = $('#title').val();
  var start = $('#start').val();
  var end = $('#end').val();

  $.ajax({
    url: 'addEvent.php',
    data: 'action=add&title=' + title + '&start=' + start + '&end=' + end,
    type: "POST",
    success: function(json) {
      $('#ModalAdd').modal('hide');
      //fetch_data(); //it's not clear why you would need to do this here, since you've just hidden the modal which is populates! Pretty sure you don't need it, so I've commented it out
      calendar.fullCalendar('refetchEvents');
    }
  });
}

关于javascript - Fullcalendar AJAX 调用多次触发,无需重新加载页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50576674/

相关文章:

javascript - 如何防止Ajax GET刷新页面?

javascript - 我不断收到未终止的字符串文字错误

c# - 使用 NuGet 添加 jQuery UI

javascript - javascript变量存储在哪里

jquery - 在列表之间放置空格

jquery - 使用 jQuery ajax get 将 params 中的数据发送到 Rails 后端

javascript - 无法让ajax请求在jquery中使用json工作

php - 实时ajax评论

javascript - 单击不同的缩略图时应用不同的规则(jquery)

javascript - Angular4 - 如何使 CanDeactive 守卫使用 dialogService 确认与链接的可观察对象一起工作?