2010-08-12 4 views
9

Ich habe einen Vollkalender mit externen Elementen, die darauf gezogen werden. Ich bin relativ neu in Jquery. Ich weiß nicht genau, wie man die ID des Objekts, das auf ein Mülleimersymbol gezogen wird, bekommt. Ich möchte einfach Elemente aus dem Kalender in ein Bild ziehen und wenn ich die Maus loslasse, wird das Objekt entfernt.Elemente aus Vollkalender entfernen (durch Ziehen in den Mülleimer)

Dies ist mein Code .....

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head> 
<link rel='stylesheet' type='text/css' href='../fullcalendar.css' /> 
<script type='text/javascript' src='../jquery/jquery.js'></script> 
<script type='text/javascript' src='../jquery/jquery-ui-custom.js'></script> 
<script type='text/javascript' src='../fullcalendar.min.js'></script> 
<script type='text/javascript'> 

    $(document).ready(function() { 


     /* initialize the external events 
     -----------------------------------------------------------------*/ 

     $('#external-events div.external-event').each(function() { 

      // create an Event Object (http://arshaw.com/fullcalendar/docs/event_data/Event_Object/) 
      // it doesn't need to have a start or end 
      var eventObject = { 
       title: $.trim($(this).text()) // use the element's text as the event title 
      }; 

      // store the Event Object in the DOM element so we can get to it later 
      $(this).data('eventObject', eventObject); 



      // make the event draggable using jQuery UI 
      $(this).draggable({ 
       zIndex: 999, 
       revert: true,  // will cause the event to go back to its 
       revertDuration: 0 // original position after the drag 
      }); 

     }); 




     /* initialize the calendar 
     -----------------------------------------------------------------*/ 

     $('#calendar').fullCalendar({ 
      header: { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      editable: true, 
      droppable: true, // this allows things to be dropped onto the calendar !!! 
      drop: function(date, allDay) { // this function is called when something is dropped 

       // retrieve the dropped element's stored Event Object 
       var originalEventObject = $(this).data('eventObject'); 

       // we need to copy it, so that multiple events don't have a reference to the same object 
       var copiedEventObject = $.extend({}, originalEventObject); 

       // assign it the date that was reported 
       copiedEventObject.start = date; 
       copiedEventObject.allDay = allDay; 



       // render the event on the calendar 
       // the last `true` argument determines if the event "sticks" (http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/) 
       $('#calendar').fullCalendar('renderEvent', copiedEventObject, true); 

       // is the "remove after drop" checkbox checked? 
       if ($('#drop-remove').is(':checked')) { 
        // if so, remove the element from the "Draggable Events" list 
        $(this).remove(); 

       } 
      } 

     }); 

    }); 

</script> 
<style type='text/css'> 

    body { 
     margin-top: 40px; 
     text-align: center; 
     font-size: 14px; 
     font-family: "Lucida Grande",Helvetica,Arial,Verdana,sans-serif; 
     } 

    #wrap { 
     width: 1100px; 
     margin: 0 auto; 
     } 

    #external-events { 
     float: left; 
     width: 150px; 
     padding: 0 10px; 
     border: 1px solid #ccc; 
     background: #eee; 
     text-align: left; 
     } 

    #external-events h4 { 
     font-size: 16px; 
     margin-top: 0; 
     padding-top: 1em; 
     } 

    .external-event { /* try to mimick the look of a real event */ 
     margin: 10px 0; 
     padding: 2px 4px; 
     background: #3366CC; 
     color: #fff; 
     font-size: .85em; 
     cursor: pointer; 
     } 

    #external-events p { 
     margin: 1.5em 0; 
     font-size: 11px; 
     color: #666; 
     } 

    #external-events p input { 
     margin: 0; 
     vertical-align: middle; 
     } 

    #calendar { 
     float: right; 
     width: 900px; 
     } 

</style> 
</head> 
<body> 
<div id='wrap'> 

<div id='external-events'> 
<h4>Draggable Events</h4> 
<div class='external-event'>even1</div> 
<div class='external-event'>even2</div> 

<p> 
<input type='checkbox' id='drop-remove' /> <label for='drop-remove'>remove after drop</label> 
</p> 
</div> 

<div id='calendar'></div> 

<img src="redmond/images/trash.png" id="trash"> 

<div style='clear:both'></div> 
</div> 
</body> 
</html> 
+0

Ich versuche, das Gleiche zu erreichen. Ich habe Agzams Vorschlag ausprobiert, und das erlaubt es Ihnen, Dinge aus dem Kalender zu ziehen, aber ich kann nicht herausfinden, ob das Verhalten "abnormal" ist, um das Lösch-Ereignis auszulösen. – Dutchie432

Antwort

2

allererst Sie gonna Notwendigkeit zu entfernen Überlauf-Anweisung von CSS sind:

.fc-view 
{ 
    /* prevents dragging outside of widget */ 
    width: 100%; 
    overflow: hidden; 
} 

dann können Sie eventDragStop

1
verwenden

hier ist etwas, was ich nur hoffe, dass es hilft. Ich weiß nicht, ob Sie PHP/MySQL verwenden, aber wenn Sie nicht nur den Ajax-Aufruf entfernen und behalten, was in der Erfolgsfunktion ist.

 $('#calendar').children('.fc-content').children().append('<div id="calendarTrash" style="float: right; padding-top: 5px; padding-right: 5px; padding-left: 5px;"><span class="ui-icon ui-icon-trash"></span></div>'); 

    //listens for drop event 
    $("#calendarTrash").droppable({ 
     tolerance: 'pointer', 
     drop: function(event, ui) { 
      if (dragged && ui.helper && ui.helper[0] === dragged[0]) { 
       var event = dragged[1]; 
       var answer = confirm("Delete Event?") 
       if (answer) 
       { 
        $.ajax({ 
         url:'/employees/removeevent?id='+event.id, 
         dataType: 'json', 
         async: false, 
         error: function(xhr, ajaxOptions, thrownError) 
         { 
          //console.log(xhr.status); 
          //console.log(thrownError); 
         }, 
         success: function() 
         { 
          calendar.fullCalendar('removeEvents' , event.id ); 
         } 
        }); 
       } 
      } 
     } 
    }); 

     eventDragStart: function(event, jsEvent, ui, view) { 
      dragged = [ ui.helper[0], event ]; 
     }, 
+0

Was wird "gezogen"? – MarcoS

+0

das Ereignis aus dem Kalender. –

+0

ok es hat lange gedauert aber wenn der code gefunden wurde. Ich werde den Beitrag bearbeiten, aber was er tut, ist nur in einem Array die verschiedenen benötigten Komponenten zu speichern. –

19

komplette Tutorial, wie man hinzufügen Funktion "in den Papierkorb verschieben" fullcalendar

enter image description here

HERE IS DEMO

wenn Sie wollen abwerfbaren nicht verwenden:

von fullcalendar.css löschen Sie diese Zeilen

.fc-view 
{ 
    /* prevents dragging outside of widget */ 
    width: 100%; 
    overflow: hidden; 
} 

Fund in fullcalenar.js (Linie cca 6086)

function eachEventElement(event, exceptElement, funcName) { 
    var elements = eventElementsByID[event._id], 
     i, len = elements.length; 
    for (i=0; i<len; i++) { 
     if (!exceptElement || elements[i][0] != exceptElement[0]) { 
      elements[i][funcName](); 
     } 
    } 
} 

und ändern:

function eachEventElement(event, exceptElement, funcName) { 
    var elements = eventElementsByID[event._id], 
     i; 
    if (elements != null) { 
     var len = elements.length; 
     for (i = 0; i < len; i++) { 
      if (!exceptElement || elements[i][0] != exceptElement[0]) { 
       elements[i][funcName](); 
      } 
     } 
    } 
} 

in js:

//actually cursor position 
var currentMousePos = { 
    x: -1, 
    y: -1 
}; 

//set actually cursor pos 
jQuery(document).ready(function() { 

    jQuery(document).on("mousemove", function (event) { 
     currentMousePos.x = event.pageX; 
     currentMousePos.y = event.pageY; 
    }); 

}); 

//check if cursor is in trash 
    function isElemOverDiv() { 
     var trashEl = jQuery('#calendarTrash'); 

     var ofs = trashEl.offset(); 

     var x1 = ofs.left; 
     var x2 = ofs.left + trashEl.outerWidth(true); 
     var y1 = ofs.top; 
     var y2 = ofs.top + trashEl.outerHeight(true); 

     if (currentMousePos.x >= x1 && currentMousePos.x <= x2 && 
      currentMousePos.y >= y1 && currentMousePos.y <= y2) { 
      return true; 
     } 
     return false; 
    } 

//fullcalendar mouseover callback 

     eventMouseover: function (event, jsEvent) { 
      $(this).mousemove(function (e) { 
       var trashEl = jQuery('#calendarTrash'); 
       if (isElemOverDiv()) { 
        if (!trashEl.hasClass("to-trash")) { 
         trashEl.addClass("to-trash"); 
        } 
       } else { 
        if (trashEl.hasClass("to-trash")) { 
         trashEl.removeClass("to-trash"); 
        } 

       } 
      }); 
     }, 

//fullcalendar eventdragstop callback 
eventDragStop: function (event, jsEvent, ui, view) { 
    if (isElemOverDiv()) { 

     jQuery('#fr-calendar').fullCalendar('removeEvents', event.id); 

     var trashEl = jQuery('#calendarTrash'); 
     if (trashEl.hasClass("to-trash")) { 
      trashEl.removeClass("to-trash"); 
     } 
    } 
}, 

in fullcalendar Set Option dragRevertDuration : 0,

in fullcalendar Erklärung Laden Callback-Funktion hinzufügen, für eine trashcalendar anhängen:

loading: function (bool) { 
    if (!bool) { 
     jQuery('.fc-header-left').append('<div id="calendarTrash" class="calendar-trash"><img src="' + imagePath + '/cal-trash.png"></img></div>'); 

    } 
}, 

CSS für Müll

:

div.calendar-trash{ 
float: left; 
padding-right: 8px; 
margin-right:5px; 
padding-left:8px; 
padding-top: 3px; 
cursor: pointer; 
} 

.to-trash{ 
    background-color:#EAEAEA; 
    -webkit-border-radius: 5em; 
    border-radius: 5em; 
} 

Wenn Laden Rückruf nicht funktioniert, fügen Müll am Ende jquery Dokument-Ready-Funktion.

foo.JFS('.fc-header-left').append('<div id="calendarTrash" class="calendar-trash"><img src="/images/cal-trash.png"></img></div>'); 

Papierkorb-Symbol:

enter image description here

+0

die ausgezeichnete Antwort! +1 –