jQuery с перетаскиванием / опрокидыванием поведения на Over и Out
Мне действительно нужна твоя помощь с этим. Я так старался понять это правильно, но я просто не могу сделать это..
jsfiddle: http://jsfiddle.net/5Vyq8/13/
JS-код:
$(document).ready(function () {
// Treetable
$("table").treetable({
expandable: true,
initialState: "expanded",
expanderTemplate: "<a href='#'> </a>",
indent: 24,
column: 0
});
// Draggable
$("table .draggable").draggable({
opacity: .75,
refreshPositions: true,
revert: "invalid",
revertDuration: 300,
scroll: true,
delay: 100,
cursor: 'move'
});
//Droppable
$("table tbody tr").each(function () {
$(this).droppable({
accept: ".draggable",
hoverClass: "append-to-task",
over: function (e, ui) {
// add class 'accept-incoming-task' to the row under after 1 second
},
out: function () {
},
drop: function (e, ui) {
var droppedEl = ui.draggable;
// Adds the task as the first child to dropped row
$("table").treetable("move", droppedEl.data("ttId"), $(this).data("ttId"));
},
});
});
});
То, что я пытаюсь достичь, это:
- перетащите строку в другую строку (Готово!)
- при наведении курсора более 1 секунды следует добавить класс в строку под
- Когда вы все еще зависаете и переходите к другим строкам, он должен удалить добавленный класс в предыдущем шаге.
Я ценю ваше время и помощь.
2 ответа
Мне удалось решить это наконец! Вот решение:
$(document).ready(function () {
// Treetable
$("table").treetable({
expandable: true,
initialState: "expanded",
expanderTemplate: "<a href='#'> </a>",
indent: 24,
column: 0
});
// Draggable
$("table .draggable").draggable({
opacity: .75,
refreshPositions: true,
revert: "invalid",
revertDuration: 300,
scroll: true,
delay: 100,
cursor: 'move'
});
//Droppable
var hoverTimeout;
$("table tbody tr").each(function () {
var that=this;
$(this).droppable({
accept: ".draggable",
hoverClass: "append-to-task",
over: function (e, ui) {
clearTimeout(hoverTimeout);
$('.accept-incoming-task').removeClass('accept-incoming-task');
// add class 'accept-incoming-task' to the row under after 1 second
hoverTimeout = setTimeout(function(){
$(that).addClass("accept-incoming-task");
}, 1000);
},
out: function () {
},
drop: function (e, ui) {
$('.accept-incoming-task').removeClass('accept-incoming-task');
var droppedEl = ui.draggable;
// Adds the task as the first child to dropped row
$("table").treetable("move", droppedEl.data("ttId"), $(this).data("ttId"));
},
});
});
});
Скрипка: http://jsfiddle.net/7yEaU/2/
Взгляните на http://jsfiddle.net/snowMonkey/7yEaU/
$("table tbody tr").each(function () {
var that=this;
$(this).droppable({
accept: ".draggable",
over: function (e, ui) {
// add class 'accept-incoming-task' to the row under after 1 second
hoverTimeout = setTimeout(function(){
$(that).addClass("append-to-task");
}, 1000);
},
out: function () {
clearTimeout(hoverTimeout);
$(that).removeClass("append-to-task");
},
drop: function (e, ui) {
var droppedEl = ui.draggable;
// Adds the task as the first child to dropped row
$("table").treetable("move", droppedEl.data("ttId"), $(this).data("ttId"));
},
});
});
У меня ваш второй шаг работает. Первое, что вам нужно сделать, это удалить hoverClass из вашего hover, вы потянете его вручную после задержки.
Во-вторых, создайте переменную hoverTimeout вне этого (чтобы вы могли получить к ней доступ как из hover, так и из обратных вызовов out).
В-третьих, в обратном вызове over: установите hoverTimeout в 1000 мс и добавьте класс при его срабатывании.
Наконец, в обратном вызове out очистите тайм-аут и удалите класс.
Это обрабатывает оба шага два и три - но это не позволяет вам уронить и добавить брошенный предмет в ловушку. Надеюсь, поможет!