jquery перетаскиваемый + сортируемый с пользовательским HTML на событие выпадения? - PullRequest
7 голосов
/ 14 декабря 2011

Изменить HTML, когда элемент помещается в область сброса.

Примерно так: http://the -stickman.com / files / jquery / draggable-sortable.html

Но когда я отбрасываю элемент, меняют HTML.

Другой пример: у меня есть 2 списка: первый перетаскиваемый список и второй сбрасываемый список, когда я перетаскиваю элемент из первого списка и перетаскиваю этот элемент во второй список, элемент будет клонирован во второй список

перетаскивание:

<a href="#">test</a>

падение:

<a href="#">test</a>

я хочу изменить этот HTML-код на

перетаскивание:

<a href="#">test</a>

падение:

<div class="toggle"><a href="#">test</a></div>

Ответы [ 4 ]

11 голосов
/ 09 июля 2013

Отметьте это ДЕМО http://jsfiddle.net/yeyene/7fEQs/8/

Вы можете настроить свой упавший элемент по своему желанию.

$(function() {
    $( "#draggable li" ).draggable({
        connectToSortable: "#sortable",
        helper: "clone",
        revert: "invalid"
    });

    $( "#sortable" ).sortable({
        revert: true,
        receive: function(event, ui) {
            var html = [];
            $(this).find('li').each(function() {
                html.push('<div class="toggle">'+$(this).html()+'</div>');
            });
            $(this).find('li').replaceWith(html.join(''));
        }
    });
});
5 голосов
/ 07 июля 2013

Это очень простой пример, но он должен применяться в нескольких разных случаях. Я взял пример jQuery UI Draggable + Sortable и, кроме виджета .sortable(), связал виджет .droppable() с элементом <ul id="sortable">. Хотя это и не самый умный способ в событии drop выпадающего виджета, я проверяю значение переменной, чтобы определить происхождение перемещенного элемента. (это из сортируемого списка или одного из моих перетаскиваемых предметов?) Если это происходит от одного из перетаскиваемых объектов, я изменяю его HTML-код на нужный. В противном случае он остается прежним (поскольку вы просто меняете порядок сортировки)

HTML

<ul>
    <li id="draggable" class="ui-state-highlight">Drag me down</li>
</ul>
<br />
<br />
<br />
<ul id="sortable">
    <li class="ui-state-default">Item 1</li>
    <li class="ui-state-default">Item 2</li>
    <li class="ui-state-default">Item 3</li>
    <li class="ui-state-default">Item 4</li>
    <li class="ui-state-default">Item 5</li>
</ul>

JS

$(function () {
     var origin = 'sortable';
     $("#sortable").droppable({
         drop: function (event, ui) {
             if (origin === 'draggable') {
                 ui.draggable.html('<span>Look at this new fancy HTML!</span>');
                 console.log(ui.draggable);
                 origin = 'sortable';
             }
         }
     }).sortable({
         revert: true
     });
     $("#draggable").draggable({
         connectToSortable: "#sortable",
         helper: "clone",
         revert: "invalid",
         start: function () {
             origin = 'draggable';
         }
     });

 });

jsfiddle для демонстрации

Довольно скучный пример, потому что новый HTML-код статичен. Но допустим, у вас есть свой помощник для каждого перетаскиваемого объекта, и он должен стать вашим новым HTML. Поэтому вы, например, сохранили некоторые фрагменты HTML в массиве и выберите подходящую запись, подходящую для индекса или чего-либо еще. Это будет выглядеть так:

var helpersArr = ['<input type="text" />', '<input type="file" />', '<input type="submit" value="Save" />'];
var helper;
//draggable
helper: function () {
    helper = helpersArr[$(this).index()];
    return helper;
}
//dropppable drop function
ui.draggable.html(helper);

jsfiddle для второго примера

Я уверен, что вы могли бы добиться того же результата, избегая вспомогательной переменной и вместо этого использовать ui.helper, но я не мог понять, как получить ее HTML-часть. Если это не работает, как вам нужно, просто сообщите мне. В целом, я думаю, вы можете использовать мои примеры в качестве начала для различных целей, касающихся изменения HTML-кода отброшенного элемента.

2 голосов
/ 21 ноября 2012

У меня была похожая проблема, которая требовала гораздо более тщательного решения. Моя система перетаскивала элемент div слева, который содержал другие элементы div с именами и идентификаторами элементов формы, которые упали в сортируемый элемент div, который должен был стать веб-формой. Поскольку мне нужно, чтобы div справа был похожим на содержимое формы без дополнительной разметки, использование неупорядоченного списка не могло быть и речи, если только я не хотел делать кучу «очистки» на пути к базе данных. Нет, спасибо. В моем примере, когда я перетаскиваю из списка слева, мне нужно использовать идентификатор перетаскиваемого элемента, чтобы найти несколько вещей через ajax, а затем поместить метку, элемент формы и проверку в список на осталось на основе результатов этого AJAX. Для ясности я удалил ajax из моего примера.

Итак, по сути, вы берете два соседних элемента div, выполняя перетаскивание и сортировку со списком соединений. Ключ в том, что в Sortable есть функции обратного вызова, которые вы должны использовать. Обратный вызов «Receive» сработает только при добавлении нового элемента в сортируемый список. Это важно, потому что вы должны различать, чтобы ваши изменения не происходили и в сортировке. Вы не можете использовать только «получать», потому что, если вы попытаетесь манипулировать html в этом обратном вызове, вы затронете список, из которого вы перетаскиваете, а не список, в который вы перетаскиваете. Чтобы отслеживать, является ли это добавлением в список или перетаскиванием, я установил переменную с именем "newlement" в $ .data равной 1, если это добавление в список, который я затем проверяю в обратном вызове обновления, чтобы увидеть, должен ли я влиять на перетаскиваемый HTML или нет. В моем случае я не хочу ничего делать с перетаскиваемым элементом.

Итак, HTML:

<div class='master_list'>
  <div id="2">First Name</div>
  <div id="3">Last Name</div>
</div>

<div id="webform_container">
</div>

И JQuery:

$( ".master_list div" ).draggable({
    connectToSortable: "#webform_container",
    helper: "clone",
    revert: "invalid"
});


$( "#webform_container" ).sortable({
    revert: true,
    cursor: 'pointer',
    placeholder: "placeholderdiv",
    connectWith: '.master_list',
    start: function() {
            /* Clear the value of newelement at start */
        $(this).data('newelement', 0);
    },
    receive: function(event, ui) {
            /* Get id from function and pass to the update to do stuff with */
        $(this).data('id', ui.item[0].id);
            /* Set value of newelement to 1 only when new element is added to list */
        $(this).data('newelement', 1);
    },
    update: function(event, ui) {
        /* If newelement ==1, this is a new element to the list, transform it */
        if ($(this).data('newelement') == 1) {
            var fieldname = ui.item.text();
            ui.item.html('your new html here');         
        }
    }

}); * +1011 *

1 голос
/ 14 декабря 2011

Ознакомьтесь с документацией по сортировке.Вы можете использовать элемент пользовательского интерфейса для изменения html отброшенного объекта

http://jqueryui.com/demos/sortable/#event-update

. Здесь вы также можете увидеть примеры подключенных списков и события, которые вызываются

http://jqueryui.com/demos/sortable/#connect-lists

Событие обновления - это место, где вы бы изменили html элемента.

...