4

我检查了这些:

Jquery 可拖动/可放置和可排序组合

jQuery UI:可排序和可拖动 + 可排序和可放置

JQuery Draggable + Droppable + Sortable

所以,答案都不是这些。

理论

  • 我有 2 个元素,UL 和 OL。
  • UL 的清单项目必须进入 OL
  • OL 可排序

问题

  • 我在单页上有多个这样的 UL 和 OL。
  • 我需要确保 UL 的 List Items 不会进入其他部分的 OL。

你试过什么?

$(function() {
$( ".fetchedfromdb li" ).draggable({
        appendTo: "body",
        helper: "clone",
        drag: function(){
            $(".sortintodb ol").droppable({
                activeClass: "ui-state-default",
                hoverClass: "ui-state-hover",
                accept: ":not(.ui-sortable-helper)",
                drop: function(event, ui) {
                    $( this ).find( ".placeholder" ).remove();
                    $( "<li></li>" ).text( ui.draggable.text() ).appendTo( this );
                }
        }).sortable({
            sort: function() {
                $( this ).removeClass( "ui-state-default" );
            }
        });
        }
});
});

我的代码点火器部分:

<?php
echo form_open('/data/process');
echo form_label('yep') . form_textarea('remarks');
foreach($dataFetched as $data => $field) {
    echo "<h2>$data</h2> \n <ul class='fetchedfromdb'>";
        foreach($field as $f):
            $fieldFetch = $data.'_1_1';
            echo '<li>'.$f->$fieldFetch.'</li>';
            echo "<br />";
        endforeach;
    echo '</ul>';
    echo '<div style="background-color: #c3c3c3; height:100px">';
    echo "<ol class=\"sortintodb\" id=\"$data\">";
    echo '<li class="placeholder">Drop here</li>
    </ol>
    </div><hr />';
}
echo form_submit('submit','Submit');
echo form_close();
?>

通过 CSS,我确保直到父 foreach 结束之前的每个输出都在同一部分

关于如何实施的任何想法?

任何帮助,非常感谢。谢谢 :)

我们正在看的东西的“视觉”表示......

使用排序隔离多个拖放

4

3 回答 3

4

这是工作演示。Jsfiddle 演示

HTML

<ul class='fetchedfromdb' id="da1"> //parent element
    <li id="1">Data1</li>
    <br />
    <li id="2">Data2</li>
    <br />
    <li id="3">Data3</li>
    <br />
<div style="background-color: #c3c3c3; height:100px">
    <ol class="sortintodb" id="e201">
        <li class="placeholder" id="9">Drop here</li>
    </ol>
</div>
</ul>//ends

<hr />
<h2>e202</h2> 
<ul class='fetchedfromdb'>
    <li id="5">Data1</li>
    <br />
    <li id="6">Data2</li>
    <br />
    <li id="7">Data4</li>
    <br />
<div style="background-color: #c3c3c3; height:100px">
    <ol class="sortintodb" id="e202">
        <li class="placeholder" id="8">Drop here</li>
    </ol>
</div>
</ul>
<hr />

脚本

$(".fetchedfromdb li").draggable({
        containment: 'parent',
        helper: "clone",
        connectToSortable: '.sortable',
    });
    $(".sortintodb").droppable({
        activeClass: "ui-state-default",
        hoverClass: "ui-state-hover",
        accept: ":not(.ui-sortable-helper)",
    drop: function(event, ui) {
        var self = $(this);
        //if you don't want same "data" in placeholder more than once
        self.find(".sortintodb").remove();
        var dropId = ui.draggable.attr('id');
        if (self.find("[id=" + dropId + "]").length) return;
        $("<li></li>", {
            "text": ui.draggable.text(),
            "id": dropId
        }).appendTo(this);
    },
    });
    $('.sortintodb').sortable({
      placeholder: "ui-state-highlight",
    });
于 2013-10-15T17:04:05.270 回答
3

请检查这个更新的小提琴,让我知道是否需要任何额外的行为

  • 将“空”类添加到列表中,以便它们可以在为空时充当放置目标,并且可以应用一些视觉样式

http://jsfiddle.net/a8BAY/2/

$(function() {
    $('.sortable').sortable().disableSelection();

    $( ".draggable li" ).draggable({
        revert: true
    });     

    $('.droppable').droppable({
        drop: function(e, ui) {
            var el = $('<li></li>').text($(ui.draggable).text()).appendTo($(this)); 


            if($(ui.draggable).parent().find('li').size() == 1)
                $(ui.draggable).parent().addClass('empty');
            else
                $(ui.draggable).parent().removeClass('empty');

            $(ui.draggable).remove();

            if($(this).find('li').size() == 1)
                $(this).addClass('empty');
            else
                $(this).removeClass('empty');

            if($(this).is('.sortable')) {
                $(this).sortable( "refresh" );
                $(this).sortable( "refreshPositions" );             
            } else {
                $(el).draggable({
                    revert: true
                });     
            }

        },
        accept: function(draggable) {
            return $(draggable).parent().data('section') == $(this).data('section') && !$(draggable).parent().is($(this));              
        }
    });
});
于 2013-10-15T17:14:32.927 回答
0

所以我猜你想要一些代码来更新你订购/丢弃的数据库?

在您的 jquery .drop 和 .sort 函数中有一些代码运行 jquery ajax 以将数据发布到控制器。然后控制器可以让您的模型重新排序数据以模仿屏幕上显示的内容。

下面是我用来做这个的代码作为一个例子。所以一般来说,它会获取一些数据,将其发送到服务器,并整理本地屏幕副本。我的 ajax_post 方法相当复杂,但它的功能是向服务器发送数据,并处理回复。

drop: function( event, ui ) {
        var row = ui.draggable.context.id;
        var data = {id:row.substr(row.lastIndexOf('_')+1),mr_id:o.mr_id,type:o.type}
        ajax_post('patients/row_remove',data);
        $('#'+row).remove();
        setup_row_banding(o.container + ' .med_row');
    } // end drop
于 2013-10-12T12:35:14.180 回答