Fullcalendar AJAX调用多次激活,无需重新加载页面

当我点击月视图中的某一天时,会弹出一个模态。

在该模态内部是用于添加新事件的按钮。 当我单击它时,将弹出另一个模式以添加事件表单。

问题是当我经常打开/关闭第一个模态并尝试在不重新加载页面之后添加事件时,即使我单击提交一次,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 = '' + '' + eventCount + '' + ' Events' + ''; 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="" data-end="" rel="dialog" >ADD  0) { while($row = mysqli_fetch_array($result)) { ?>  <?php } } else { echo "No event"; } } ?> 

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

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

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

所以,在你的fullCalendar代码中:

 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'); } }); } 

移动$(document).on('click', '.add-me', function(){ out dayClick回调

每次点击一天,您都会为添加我添加一个新的点击事件监听器

所以点击3天会添加3个听众,然后点击add-me将运行事件处理程序(和ajax)3次