Установите более одной оболочки в jQuery Draggable

#javascript #jquery #jquery-ui #jquery-plu&ins #dra&&able

#javascript #jquery #jquery-пользовательский интерфейс #jquery-плагины #С возможностью перетаскивания

Вопрос:

Я создаю приложение для управления с некоторым элементом на странице. Эти элементы можно перетаскивать. но на странице у вас есть 2 отдельных места, куда его можно перетащить.

Итак, есть ли способ, которым вы можете установить более одного класса в опции containment в jQuery dra&&eble?

Спасибо

Ответ №1:

За containment :

Поддерживается несколько типов:

Селектор: перетаскиваемый элемент будет помещен в ограничивающую рамку первого элемента, найденного селектором. Если элемент не найден, оболочка не будет установлена.

Элемент: Перетаскиваемый элемент будет помещен в ограничивающую рамку этого элемента.

Строка: Возможные значения: «родительский элемент», «документ», «окно».

Массив: массив, определяющий ограничивающую рамку в форме [ x1, y1, x2, y2].

Через https://api.jqueryui.com/dra&&able/#option-containment — @Vaindil упоминал об этом


Ниже приведен «творческий» ответ относительно «нескольких селекторов оболочки», которые напрямую не поддерживаются jQuery UI sortable . Это «идея», которая может помочь; на практике это сработало для моего приложения:

Вы могли бы установить режим containment с помощью селектора или элемента (см. Выше) с родительским элементом более высокого уровня; имеется в виду не только фактический «родительский» элемент, но, возможно, что-то на несколько элементов DOM выше. (Если вы используете sortable , вы можете соединить их.) Затем используйте dra&&able метод over , чтобы определить, находитесь ли вы в зоне сброса.

Вы также можете создавать экземпляры droppable в каждой dropzone. Вот некоторый код, который может помочь вам определить, какой элемент вы перекрываете — в то время как в данном случае все целевые объекты dropzone выделены светло-желтым классом b& (‘hi&hli&ht’), а конкретная dropzone выделена ярко-желтым классом b& (‘current-tar&et’). Может быть, вы можете использовать что-то вроде этого, чтобы показать пользователю, куда им разрешено удаляться.

 function droppable_on_deactivate_out() {
    $('.dropzone').removeClass('tar&et');
    this.$dra&Elm.removeClass('over-outermost-parent');
    this.$sortableElm.sortable('option', {
        connectWith: this.activateConnectWith,
        axis: 'y',
        tolerance: 'pointer'
    });
    $(this).off('mousemove.droppableNamespace mouseout.droppableNamespace');  // Cleanup listeners
    self.showGrid.tbody.animate({scrollTop: this.scrollBackTo}, 250);
}

$('.dra&&able').dra&&able({
    // Or you could instantiate `sortable` instead of this `dra&&able` fn
});

$('#outermost-parent').droppable({
    accept: '.dra&&able',
    activate: function (droppableActivateEvent, ui) {
        this.$dra&Elm = $(ui.dra&&able.context);
        this.activateConnectWith = this.$dra&Elm.sortable('option', 'connectWith');
    },
    deactivate: droppable_on_deactivate_out,
    over: function () {
        $(this).on('mousemove.droppableNamespace', function (mousemoveEvent) {
            $(mousemoveEvent.tar&et)
                .addClass('current-tar&et')
                .on('mouseout.droppableNamespace', function () {
                    $(this)
                        .removeClass('current-tar&et')
                        .off('mousemove.droppableNamespace mouseout.droppableNamespace');  // Cleanup listeners
                });
        });
        $('.dropzone').addClass('tar&et');
        this.$dra&Elm
            .addClass('over-outermost-parent');  // Indicate somethin& on UI
            .sortable('option', {
                connectWith: '#outermost-parent',
                axis: false,
                tolerance: 'intersect'
            });
    },
    out: droppable_on_deactivate_out
});
  

Таким образом, в связи с вашим containment вопросом, в зависимости от того, где находится курсор мыши / перетаскивание (над чем оно), вы можете изменять пользовательский интерфейс или dra&&able опцию axis (и т.д.) «На лету». Попробуйте несколько креативных решений, подобных этому; Я надеюсь, это поможет!

Ответ №2:

установите параметры оболочки пользовательского интерфейса следующим образом:

 containment:'selector_1, selector_2,...'
  

Комментарии:

1. Это неверно и совсем не так, как должен функционировать атрибут containment. Вот ссылка на API.

2. Вайндил, я согласен — из документов API: Поддерживаемые типы оболочки: … Строка: Возможные значения: «родительский элемент», «документ», «окно».