jQuery с перетаскиванием / опрокидыванием поведения на Over и Out

Мне действительно нужна твоя помощь с этим. Я так старался понять это правильно, но я просто не могу сделать это..

jsfiddle: http://jsfiddle.net/5Vyq8/13/

JS-код:

$(document).ready(function () {

    // Treetable
    $("table").treetable({
        expandable: true,
        initialState: "expanded",
        expanderTemplate: "<a href='#'>&nbsp;&nbsp;&nbsp;&nbsp;</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. при наведении курсора более 1 секунды следует добавить класс в строку под
  3. Когда вы все еще зависаете и переходите к другим строкам, он должен удалить добавленный класс в предыдущем шаге.

Я ценю ваше время и помощь.

2 ответа

Решение

Мне удалось решить это наконец! Вот решение:

$(document).ready(function () {

    // Treetable
    $("table").treetable({
        expandable: true,
        initialState: "expanded",
        expanderTemplate: "<a href='#'>&nbsp;&nbsp;&nbsp;&nbsp;</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 очистите тайм-аут и удалите класс.

Это обрабатывает оба шага два и три - но это не позволяет вам уронить и добавить брошенный предмет в ловушку. Надеюсь, поможет!

Другие вопросы по тегам