Подтвердить что ты не робот

Jquery droppable принять

Может ли кто-нибудь сказать мне, как я могу написать функцию в состоянии accept, а затем как она узнает, что принимать и что не принимать. Например, я хочу принять div a и div b в состоянии accept. Как я могу написать через функцию?

4b9b3361

Ответ 1

Если вы хотите, чтобы droppable принимал несколько элементов, вы можете сделать что-то вроде этого:

$(".droppable").droppable({
    accept: function(d) { 
        if(d.hasClass("foo")||(d.attr("id")=="bar")){ 
            return true;
        }
    }
});

Этот droppable будет принимать элементы с классом "foo" или элементом с идентификатором "bar"

Ответ 2

Если я правильно понял ваш вопрос, вы хотите условно принять сброшенный элемент на основе пользовательского кода. Ответ Aberon - типичный случай: вы хотите разрешить только некоторые перетаскиваемые опции на основе их класса, а все остальные будут возвращены. Если это ответит на ваш вопрос, то хорошо.

Тем не менее, есть случай, когда реверсивная анимация происходит условно на основе чего-то более сложного, чем совпадение класса. В моем собственном проекте я использую drag-drop для добавления пользователей в группу. Если утерянный пользователь уже находится в группе, я хочу, чтобы элемент вспомогательного пользователя возвращался обратно. В противном случае я продолжу действие AJAX, чтобы вставить их. Это не заменяет проверку на заднем плане, но это приятная визуальная обратная связь.

Я посмотрел в другом месте для простого ответа на этот вопрос. Обратите внимание на поддерживающие JQuery: для меня самым простым способом было бы добавить некоторое свойство объекта события в функцию drop, например:

$('.target').droppable({
    accept: '.valid'
    drop: function(event, ui) {
        if(isDropOK() == true) {
            // add child here
        } else {
            event.revert = true;
        }
    }
});

К сожалению, это не сработает. Здесь то, что "работает", тем не менее: установите перетаскиваемый элемент, чтобы он всегда возвращался, а затем скрыл помощника, если условие выполнено. Вы можете получить ссылку на помощника, ища единственный элемент на странице с классом ".ui-draggable-dragging". Вот пример, замените "isDropOK()" своей логикой:

$('.valid').draggable({
    revert: true,
    helper: 'clone',
    opacity: 0.5
});

$('.target').droppable({
    accept: '.valid'
    drop: function(event, ui) {
        if(isDropOK() == true) {
            $('.ui-draggable-dragging').hide();
            // add child here
        }
    }
});

Итак, чтобы повторить, каждый элемент будет всегда возвращаться, если вы не нажмете на событие drop и не скроете помощника вручную. Реверсивная анимация все равно произойдет, но ваши пользователи ее не увидят. Это немного взломать, но конечный результат, похоже, все в порядке.

Ответ 3

В соответствии с документация JQuery для селекторов.

Все перетаскиваемые элементы, соответствующие селектору будут приняты. Если функция указанный, функция будет вызываться для каждого перетаскиваемого на страницу (пройденного как первый аргумент функция), чтобы обеспечить пользовательский фильтр. Функция должна возвращать значение true, если draggable должен быть принят.

Таким образом,

$('.selector').droppable({ accept: '.special' }); 

в их примере будет действовать только так, как будто что-то было сброшено на него, если оно имеет класс "специальный". Похоже, что он может принять любой Jquery selector.

Ответ 4

Это решение, которое я использую:

... accept: '#diva,#divb', ...

Ответ 5

Я выяснил решение, основанное на условии, что draggable не должен быть помещен в droppable, уже занятый другим draggable:

$(".placement").droppable({
    accept: function(elm) {
        // only allow draggables to the placement if there no other draggable 
        // in the droppable
        if (!$(this).attr('isbusy'))
            return true;
    },
    drop: function(event, ui) {
        $(this).attr('isbusy', 'yeap'); // fill key with something

        var draggable = $(ui.draggable[0]);
        // free the draggable previous droppable 
        if (draggable.attr('droppable')) {
            $('#' + draggable.attr('droppable')).attr('isbusy', '');
        }

        // save the new draggable droppable
        draggable.attr('droppable', $(this).attr('id'));
    },
});

Ответ 6

В дополнение к Alex answer, который является лучшим ответом, который я нашел по этому вопросу, мне нравится добавлять, что если вы хотите проверить соответствие атрибутов между droppable и draggable, вы можете использовать ключевое слово this для доступа к droppable в вашей функции accept. Вот небольшой пример, который я недавно использовал:

accept : function (draggable) {
  var id_group_drop, id_group_drag;

  //get the "id_group" stored in a data-attribute of the draggable
  id_group_drag = $(draggable).attr("data-id-group");

  //get the "id_group" stored in a data-attribute of the droppable
  id_group_drop = $(this).parent().attr("data-id-group");

  //compare the id_groups, return true if they match or false otherwise
  return id_group_drop == id_group_drag;
}

Итак, draggable принимается только тогда, когда id_group (помните, только пример) соответствует id_group droppable, иначе draggable будет возвращен. Я думаю, что это может быть очень распространенный случай использования, возможно, это поможет кому-то.

Ответ 7

Вместо использования класса в качестве accept вы можете просто использовать функцию типа и верните true, если оно соответствует вашим критериям.

$('#mydroppable').droppable(
{
    accept: function() { return true; },
    drop: function () { alert("Dropped!"); }
});

Ответ 8

Это мое решение:

var foo = true;

$( ".draggable" ).draggable({ 
                        revert: function(){if(foo == true){return true;}else{foo = true;}},
                         });

    $("#droppable").droppable({
        activeClass: "ui-state-hover",
        hoverClass: "ui-state-active",
        drop: function( event, ui ) {
            if($this == $that){
                foo = true;
                alert("this will revert the draggable back to original position");
            }else{
                foo = false;
                alert("this will NOT revert the draggable back to original position");
            }
        }
    });