2010-03-25 45 views
11

在FullCalendar dayClick事件中,我可以獲取點擊日期中已存在的事件嗎?在FullCalendar dayClick事件中,我可以獲取點擊日期中已存在的事件嗎?

http://arshaw.com/fullcalendar/docs/mouse/dayClick/

讓我解釋一下我的項目 我正在寫一個簡單的PHP的網站,允許用戶對日曆添加/編輯事件一點。

  • 只有單個事件可以添加到日期。
  • 如果用戶點擊空白日期,新的事件彈出窗口會顯示(我使用dayclick事件)。
  • 如果用戶點擊現有事件的日期,編輯事件彈出窗口將顯示(我使用eventclick事件)。

問題是當用戶點擊具有現有事件的日期的事件區域(上部區域或底部區域)以外時,它會提高dayclick而不是eventclick。 如何在日期中存在事件時觸發eventclick事件並跳過dayclick事件?

回答

17

您的事件是存儲在客戶端還是服務器端?

$('#calendar').fullCalendar({ 
    dayClick: function(date, allDay, jsEvent, view) { 
      $('#calendar').fullCalendar('clientEvents', function(event) { 
       if(event.start <= date && event.end >= date) { 
        return true; 
       } 
       return false; 
      }); 
    } 
}); 

這會給重疊點擊的時間,並存儲在客戶端的事件:如果在客戶端,這應該,如果你想在單擊的時間事件具體工作。對於全天時段,它將使當天所有事件重疊。

如果您希望自己在該日期的所有事件,無論是否點擊allDay插槽或時間段。

$('#calendar').fullCalendar({ 
    dayClick: function(date, allDay, jsEvent, view) { 
      if(!allDay) { 
       // strip time information 
       date = new Date(date.getFullYear(), date.getMonth(), date.getDay()); 
      } 
      $('#calendar').fullCalendar('clientEvents', function(event) { 
       if(event.start <= date && event.end >= date) { 
        return true; 
       } 
       return false; 
      }); 
    } 
}); 

如果事件被存儲在服務器上,你會想在你的dayClick回調提供的日期,並用它來構建你的服務器調用獲得的任何格式,你需要的信息。

編輯如果做一個往返或試圖獲得信息的其他方式

$('#calendar').fullCalendar({ 
    dayClick: function(date, allDay, jsEvent, view) { 
      var startDate = new Date(date.getFullYear(), date.getMonth(), date.getDay(), 0, 0, 0).getTime(); 
      var endDate = new Date(date.getFullYear(), date.getMonth(), date.getDay(), 23, 59, 59).getTime(); 
      var cache = new Date().getTime(); 
      $.getJSON("/json-events.php?start="+startDate+"&end="+endDate+"&_="+cache, 
       function(data) { 
        // do stuff with the JSOn data 
       } 
    } 
}); 

如果你不想來回,你也可以看看會發生什麼,說,在fullCalendar.js中refetchEvents。如果你不介意與fullCalendar樹幹不同,你可以在某處保存獲取的事件,這樣你就不會執行一堆DOM操作(取決於事件的數量,因爲它們會變大而變得笨重)。

+0

感謝您的回覆 我的事件用 事件來自服務器端:「JSON-events.php」 那麼,我需要AJAX調用來檢索事件? 是否可以編寫一個接受日期作爲參數並返回給定日期的事件列表而不返回服務器端的JavaScript函數? 因爲我可以在客戶端瀏覽器上看到日期的事件。是不是可以從日曆dom查詢事件? – zawmn83 2010-03-25 14:43:27

+0

如果您嘗試通過DOM完成工作,查看fullcalendar.js文件中的代碼將有助於您做出明顯的選擇。你會注意到創作者亞當·肖(Adam Shaw)對tds進行計數以瞭解將要舉辦各種活動的日期。所以是的,這絕對有可能。這會變得更加痛苦並且需要大量的DOM操作 - 或許足夠讓往返服務器的速度更快。此外,DOM操作不會爲您提供事件的JSON,而是放置在內部的div來描述事件,只顯示顯示的信息。可能夠了,可能不行。 – justkt 2010-03-25 15:06:59

+0

我可以看到代表日曆dom中每個日期的td。 但事件在日曆表後存儲爲獨立的div。 我沒有看到這個事件的div和td關係。 那麼我在哪裏可以得到事件div和日期td之間的關係? 謝謝 – zawmn83 2010-03-26 04:03:59

0

Exested答案並沒有爲我工作,所以工作代碼:

dayClick: function (date, jsEvent, view) { 
    var count = 0; 

    date = date.toDate(); 
    var startDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); 
    var endDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59); 

    $('#calendar').fullCalendar('clientEvents', function (event) { 
      if (event.start.toDate() >= startDate && event.start.toDate() <= endDate 
       || event.end.toDate() >= startDate && event.end.toDate() <= endDate) { 
         count++; 
        } 
       }); 
    //count - number of events on this day 
} 
0

這就是你所需要的所有活動當天在另一功能:

  var date = $('.js-calendar').fullCalendar('getDate'); 
      date = date.toDate(); 
      var startDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); 
      var endDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59); 
      var todaysEvents = $('.js-calendar').fullCalendar('clientEvents', function(event) { 
       if (event.start.toDate() >= startDate && event.start.toDate() <= endDate 
        || event.end.toDate() >= startDate && event.end.toDate() <= endDate) { 
        return true 
       } 
      }); 
6

我剛剛遇到這個問題,自己找到解決方案f或將公共假期輸入到日曆中。我發現這是一個很好的全天活動解決方案。我希望這可以幫助其他人進一步走下坡路。

$('#calendar').fullCalendar({     
    eventClick: function (event) { 
     ShowEditScreen(event.id); 
    }, 
    dayClick: function (date) { 
     var events = $('#calendar').fullCalendar('clientEvents'); 
     for (var i = 0; i < events.length; i++) { 
      if (moment(date).isSame(moment(events[i].start))) { 
       ShowEditScreen(events[i].id); 
       break; 
      } 
      else if (i == events.length - 1) { 
       ShowCreateNew(date); 
      } 
     } 
    } 
}); 
+0

與'''moment'''比較日期是對我有用的。 – 0x1gene 2017-04-05 23:24:04

相關問題