当我点击月视图中的某一天时,会弹出一个模态。
在该模态中是一个用于添加新事件的按钮。当我点击它时,将弹出另一个模态添加事件表单。
问题是当我经常打开/关闭第一个模态并尝试在不重新加载页面之后添加事件时,即使我单击提交一次,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>";
}
}
?>
答案 0 :(得分:1)
将$(document).on('click', '.add-me', function(){
移出dayClick
回调
每次点击某一天,您都会为add-me
所以点击3天会添加3个听众,然后点击add-me
将运行事件处理程序(和ajax)3次
答案 1 :(得分:1)
目前在dayClick事件处理程序中,您已经有了添加所有其他事件处理程序的代码,并且还定义了一些函数。这不是一件好事,因为这意味着每次用户点击一天时,此代码都会运行,并不断向页面添加越来越多的事件处理程序。添加事件处理程序不会覆盖以前添加的处理程序,它只是不断添加更多。然后,每次触发添加处理程序的事件时,它都会同时执行 all 附加到它的事件处理程序。
这就解释了为什么有时候你会看到你的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');
}
});
}