#jquery #fullcalendar #jquery-events
#jquery #полный календарь #jquery-события
Вопрос:
У меня есть этот код:
eventDragStop: function(event, jsEvent, ui, view) {
calendar.fullCalendar('removeEvents', event.id);
}
Но я застрял на этом. Я хотел бы иметь возможность перетащить событие через div с именем класса «event-delete», и событие будет удалено.
Я пробовал несколько способов определить, перетаскивается ли событие через раздел delete, но безрезультатно. Приведенное выше решение, похоже, частично работает. Триггер события работает, но замораживает любой перетаскиваемый элемент на месте.
Ответ №1:
просто настройте это и добавьте в свой js.
$('#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 amp;amp; ui.helper amp;amp; 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 ];
},
Комментарии:
1. Я работал с этим, но, похоже, не могу получить свой идентификатор события. В вашем примере что такое
dragged
? Как мне получить свой идентификатор события?2. извините, это было давно. «перетаскиваемый» был просто массивом, который я использовал для хранения различных частей события перетаскивания, которые я хотел. Вероятно, вам не нужно все. Я думаю, что я пытался сделать что-то, соответствующее моим конкретным потребностям.
Ответ №2:
Прошло некоторое время с тех пор, как я использовал fullcalendar, но, если я правильно помню, ui
дает вам доступ к фактическому элементу, который перетаскивается, верно? Если это так, то вы можете получить координаты перетаскиваемого элемента и координаты удаляемого div и проверить, находятся ли они друг в друге.
jQuery предоставляет доступ к координатам относительно страницы через .offset()
. В координатах указаны только top
и left
, однако правая и нижняя части могут быть вычислены с использованием высоты и ширины элемента.
(непроверенная, но общая идея)
var isElemOverDiv = function(draggedItem, dropArea) {
// Prep coords for our two elements
var a = $(draggedItem).offset();
a.right = $(draggedItem).outerWidth() a.left;
a.bottom = $(draggedItem).outerHeight() a.top;
var b = $(dropArea).offset();
a.right = $(dropArea).outerWidth() b.left;
a.bottom = $(dropArea).outerHeight() b.top;
// Compare
if (a.left >= b.left
amp;amp; a.top >= b.top
amp;amp; a.right <= b.right
amp;amp; a.bottom <= b.bottom) { return true; }
return false;
}
eventDragStop: function(event, jsEvent, ui, view) {
if (isElemOverDiv(ui, $('div.event-delete'))) {
calendar.fullCalendar('removeEvents', event.id);
}
}
Здесь есть одна сложная часть isElemOverDiv(ui, ...
. Я не помню, каково значение ui
. Возможно, вам потребуется изменить это на что-то вроде ui.element
, чтобы получить фактическую ссылку на элемент.
Комментарии:
1. Хорошо, я поиграл с кодом, но кое на чем застрял. Когда событие перетаскивается, независимо от того, куда оно отброшено, событие зависает на месте и застревает до тех пор, пока не будет создано другое событие.
2. Stone Я перепробовал все возможные варианты пользовательского интерфейса, а также различные алгоритмы позиционирования, но безрезультатно. На этом этапе помогло бы все, что хотя бы отдаленно правдоподобно!
3. Хорошо, я помогу ответу Т. Стоуна сделать его более четким. прежде всего, все ваши события должны иметь ‘id’. во-вторых, функция ‘isElemOverDiv’ должна быть записана следующим образом: var isElemOverDiv = function(draggedItem, DropArea) { var drag = $(draggedItem)[0].offset; var b = $(DropArea); var limitX = parseInt(b.offset().left) parseInt(b.outerWidth()); var limitY = parseInt (b.offset().top) parseInt(b.outerHeight()); // Сравните, если ( limitY >= parseInt(drag.top) amp;amp; limitX >= parseInt(drag.left) ) { возвращает true; } возвращает false; }
Ответ №3:
Этот ответ основан на ответе Т.Стоуна.
-
Все события должны иметь ‘id‘.
var calendar = $('#calendar').fullCalendar({ ... eventDragStop: function(event, jsEvent, ui, view) { //console.log(event.id); if (isElemOverDiv(ui, $('div#delete-events'))) { calendar.fullCalendar('removeEvents', event.id); } } }); //And an helper function: var isElemOverDiv = function(draggedItem, dropArea) { var dragged = $(draggedItem)[0].offset; var b = $(dropArea); var limitX = parseInt(b.offset().left) parseInt(b.outerWidth()); var limitY = parseInt(b.offset().top) parseInt(b.outerHeight()); // Compare if ( limitY >= parseInt(dragged.top) amp;amp; limitX >= parseInt(dragged.left) ) { return true; } return false; }
У меня это сработало идеально!
Большое спасибо Т.Стоуну за его главную идею 🙂
Ответ №4:
Я обновил демонстрационную версию с внешним перетаскиванием и опубликовал код в комментариях к http://code.google.com/p/fullcalendar/issues/detail?id=550. Надеюсь, это поможет.
Код позволяет перетаскивать события из календаря и обратно в него.
Я использовал Chrome для тестирования.
Ответ №5:
я говорю вам drop: функция (событие, пользовательский интерфейс) ui :: ui содержит пустой объект. До версии 2.1 объект пользовательского интерфейса jQuery. 🙂 и затем работайте с jsEvent 🙂 sn :
eventDragStop: function(event, jsEvent, ui, view) {
if (isElemOverDiv(jsEvent, $('div#external-events'))) {
console.log(isElemOverDiv(jsEvent, $('div#external-events')));
$('.calendario').fullCalendar('removeEvents', event.id);
}
}
var isElemOverDiv = function(draggedItem, dropArea) {
var p = dropArea;
var position = p.position();
console.log("EL DROP AREA left: " position.left ", top: " position.top);
console.log('draggedItem.pageY ', draggedItem.clientX, draggedItem.pageY);
if (draggedItem.clientX >= position.left amp;amp; draggedItem.pageY >= position.top) {
return true;
}
return false;
}