Как сортировать и создавать несколько текстовых полей с помощью jQuery UI?

4

Сценарий:. Я хочу, чтобы мои пользователи могли создавать список покупок, перетаскивая продукты в список с возможностью выбора и сортировки. В зависимости от местоположения продукта в списке и значения продукта текстовые поля для этой формы должны быть заполнены.

jsFiddle: http://jsfiddle.net/imjp/5NWAQ/1/

Например:

  • Orange
  • Apple,
  • Banana

Создает следующие значения в моих полях формы (на основе, конечно, data-product attribute):

  • item_1: orange
  • item_2: apple
  • item_3: banana

Если я переведу яблоко, поля также должны обновить это.

Вот некоторые html, которые я собрал:

<div class="demo">

<div id="products">
<h1 class="ui-widget-header">Products</h1>    
<div id="catalog">
    <h3><a href="#">T-Shirts</a></h3>
    <div>
        <ul>
            <li data-product="Lolcat Shirt">Lolcat Shirt</li>
            <li data-product="Cheezeburger Shirt">Cheezeburger Shirt</li>
            <li data-product="Buckit Shirt">Buckit Shirt</li>
        </ul>
    </div>
    <h3><a href="#">Bags</a></h3>
    <div>
        <ul>
            <li>Zebra Striped</li>
            <li>Black Leather</li>
            <li>Alligator Leather</li>
        </ul>
    </div>
    <h3><a href="#">Gadgets</a></h3>
    <div>
        <ul>
            <li>iPhone</li>
            <li>iPod</li>
            <li>iPad</li>
        </ul>
    </div>
</div>
</div>

<div id="cart">
<h1 class="ui-widget-header">Shopping Cart</h1>
<div class="ui-widget-content">
    <ol>
        <li class="placeholder">Add your items here</li>
    </ol>
</div>
</div>
<div id="cart">
<h1 class="ui-widget-header">Shopping Cart</h1>
<div class="ui-widget-content">
    <ol>
        <li class="placeholder">Add your items here</li>
    </ol>
</div>
</div>


<div id="list_1" style="clear: both; float: left;">
  <h3>List 1</h3>
<input id="list_1_item_1" type="text">
<input id="list_1_item_2" type="text">
</div>

 <div id="list_2" style="clear: both; float: left;">
      <h3>List 2</h3>
  <input id="list_2_item_1" type="text">
 <input id="list_2_item_2" type="text">
 </div>
 </div><!-- End demo -->

javascript (Имейте в виду, что код javascript не работает так, как я хочу, он обновляет все поля с одинаковым значением):

$( "#catalog" ).accordion();
    $( "#catalog li" ).draggable({
        appendTo: "body",
        helper: "clone"
    });
    $( "#cart ol" ).droppable({
        activeClass: "ui-state-default",
        hoverClass: "ui-state-hover",
        accept: ":not(.ui-sortable-helper)",
        drop: function( event, ui ) {
            $( this ).find( ".placeholder" ).remove();
            console.log(ui.draggable.length);
    $('#list_1_item_1').val(ui.draggable.data('product')); 
    $('#list_1_item_2').val(ui.draggable.data('product')); 

    $('#list_2_item_1').val(ui.draggable.data('product')); 
    $('#list_2_item_2').val(ui.draggable.data('product')); 
            $( "<li></li>" ).text( ui.draggable.text() ).appendTo( this );
        }
    }).sortable({
        items: "li:not(.placeholder)",
        sort: function() {
            // gets added unintentionally by droppable interacting with sortable
            // using connectWithSortable fixes this, but doesn't allow you to customize active/hoverClass options
            $( this ).removeClass( "ui-state-default" );
        }
    });
  • 0
    проверьте свою скрипку, пожалуйста. Для меня нет никакого перетаскивания капли, работающей вообще в примере.
  • 0
    Извините за этого человека. Исправлена!
Показать ещё 2 комментария

2 ответа

2
Лучший ответ

Из того, что я понимаю, вы должны иметь возможность создавать/обновлять поля ввода динамически, когда:

a) предметы перетаскиваются и переносятся с элементов аккордеона на любую из тележек

b) элементы переупорядочиваются в любой из телег (сортируемый)

Проверьте эту скрипту для реализации: http://jsfiddle.net/CzKn9/3/

В вашей скрипке я мог видеть, что вы использовали одно и то же свойство id для нескольких элементов (2 элемента с тележкой id). Этого следует избегать, поскольку атрибут id был разработан для однозначного определения одного элемента в дереве DOM. (например, если вы выполняете document.getElementById('x'), а несколько элементов имеют id 'x', вы получите только первый элемент, соответствующий этому ID). Я изменил ваш код, чтобы исправить это.

Во-вторых, я добавил функцию, которая воссоздает ваши поля ввода (которые будут отправляться при отправке формы на сервер) при каждом перетаскивании или событии сортировки. Иды создаваемых полей ввода имеют вид list_1_item_1, list_1_item_2, list_2_item_1, list_1_item_2 и т.д.

Надеюсь, что это поможет.

UPDATE

Добавлен индекс индекса индекса. Проверьте эту скрипту: http://jsfiddle.net/CzKn9/4/

  • 0
    Спасибо чувак! Ты жжешь! : D
  • 1
    Пожалуйста. Рад, что смог помочь. :)
Показать ещё 4 комментария
2

Попробуйте эту скрипту:

http://jsfiddle.net/5NWAQ/5/

Используйте событие остановки сортировки для извлечения самого верхнего значения li и добавьте его на вход.

  • 0
    Хорошая работа! Единственная проблема заключается в том, что он все равно заполняет всю форму, когда товар перетаскивается в корзину. Как мы можем это исправить?
  • 1
    Посмотрите на jsfiddle.net/5NWAQ/8 - вам нужно заменить ссылки $ ('# item_1') и $ ('# item_2') на динамические; Я использовал атрибут data-chart для идентификации текущего сортируемого. Также обратите внимание, что у вас нет атрибутов html id более одного раза! Кроме того, вы можете использовать prependTo вместо appendTo, чтобы после перетаскивания добавленный элемент автоматически находился в верхней части списка. Также не стесняйтесь принимать ответы - в будущем люди с большей вероятностью ответят на ваши вопросы.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню