2010-03-25 4 views
11

Trong sự kiện DayClick FullCalendar, tôi có thể nhận được các sự kiện đã tồn tại trong ngày được nhấp không?Trong sự kiện DayClick FullCalendar, tôi có thể nhận được các sự kiện đã tồn tại trong ngày được nhấp không?

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

Hãy để tôi giải thích một chút về dự án của tôi Tôi đang viết một trang web php đơn giản mà cho phép người dùng thêm/chỉnh sửa sự kiện trên lịch.

  • Chỉ một sự kiện duy nhất mới có thể thêm vào một ngày.
  • Nếu người dùng nhấp vào ngày trống, Cửa sổ bật lên sự kiện mới sẽ hiển thị (Tôi sử dụng sự kiện dayclick).
  • Nếu ngày nhấp của người dùng có sự kiện hiện tại, Chỉnh sửa bật lên sự kiện sẽ hiển thị (Tôi sử dụng sự kiện sự kiện nhấp chuột).

Vấn đề là khi người dùng nhấp vào bên ngoài khu vực sự kiện (khu vực trên hoặc dưới cùng) của một ngày có sự kiện hiện tại, nó tăng dayclick thay vì eventclick. Làm cách nào để kích hoạt sự kiện eventclick và bỏ qua sự kiện dayclick nếu có sự kiện hiện tại trong ngày?

Trả lời

17

Sự kiện của bạn có được lưu trữ ở phía máy khách hoặc ở phía máy chủ không? Nếu trên các mặt hàng, điều này sẽ làm việc đặc biệt nếu bạn muốn sự kiện trong thời gian đó nhấp:

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

này sẽ cung cấp cho các sự kiện mà chồng lên nhau lần nhấp và được lưu trữ trên các mặt hàng. Đối với các khe cắm cả ngày, nó sẽ cung cấp cho tất cả các sự kiện chồng chéo ngày hôm đó.

Nếu bạn muốn tất cả các sự kiện trên chính ngày đó, bất kể vị trí thẻ allDay hay một khe thời gian đã được nhấp.

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

Nếu sự kiện của bạn được lưu trữ trên máy chủ, bạn sẽ muốn thực hiện cuộc gọi đến máy chủ của mình để nhận thông tin ở bất kỳ định dạng nào bạn cần.

EDIT Nếu làm một chuyến đi vòng hoặc cố gắng để có được những thông tin cách khác

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

Và nếu bạn không muốn chuyến đi vòng, bạn cũng có thể có một cái nhìn vào những gì xảy ra trong, nói , refetchEvents trong fullCalendar.js. Nếu bạn không ngại phân tách khỏi thân cây fullCalendar, bạn có thể lưu các sự kiện đã tìm nạp ở đâu đó để bạn không thực hiện một loạt thao tác DOM (tùy thuộc vào số lượng sự kiện, khi chúng lớn lên sẽ khó sử dụng).

+0

Cảm ơn trả lời của bạn sự kiện của tôi là đến từ phía máy chủ bằng cách sử dụng sự kiện: "json-events.php" Vì vậy, tôi cần phải gọi ajax để lấy các sự kiện? Có thể viết một hàm javascript chấp nhận ngày làm thông số và trả về danh sách sự kiện của ngày đã cho mà không quay lại phía máy chủ không? Vì tôi có thể xem các sự kiện cho ngày trên trình duyệt của khách hàng. Không phải là nó có thể truy vấn các sự kiện từ lịch dom? – zawmn83

+0

Nếu bạn đang cố gắng thực hiện công việc thông qua DOM, hãy xem mã trong tệp fullcalendar.js sẽ giúp bạn hiểu rõ hơn. Bạn sẽ nhận thấy rằng Adam Shaw, người sáng tạo, đếm tds để biết ngày nào để đặt các sự kiện khác nhau. Vì vậy, có, nó chắc chắn có thể làm điều này. Nó sẽ trở nên đau đớn hơn nhiều và đòi hỏi nhiều thao tác DOM - có lẽ đủ để một chuyến đi khứ hồi tới máy chủ sẽ nhanh như vậy. Ngoài ra, thao tác DOM sẽ không giúp bạn có được JSON của các sự kiện, nhưng các div được đặt bên trong để mô tả các sự kiện, chỉ hiển thị thông tin được hiển thị. Có thể là đủ, có thể không. – justkt

+0

Tôi có thể thấy td đại diện cho mỗi ngày trong lịch dom. Nhưng sự kiện được lưu trữ dưới dạng div riêng biệt sau bảng lịch. Tôi không thấy div sự kiện này và mối quan hệ td. Vậy tôi có thể lấy mối quan hệ giữa div sự kiện và ngày tháng td ở đâu? Cảm ơn – zawmn83

0

câu trả lời Exested không làm việc cho tôi như vậy có là mã làm việc:

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

Đây là là bạn cần tất cả sự kiện của bạn cho ngày hiện tại trong một chức năng:

  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

Tôi vừa tự mình gặp vấn đề này trong khi tìm giải pháp f hoặc nhập ngày lễ vào lịch. Tôi thấy đây là giải pháp tốt cho các sự kiện cả ngày. Tôi hy vọng điều này có thể giúp một người khác tiếp tục xuống dòng.

$('#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

So sánh ngày với '' 'thời điểm''' là những gì phù hợp với tôi. – 0x1gene