拖放更新id的定位问题

时间:2015-04-15 19:44:34

标签: javascript php jquery html drag-and-drop

你好我的stackoverflow朋友。我今天遇到了一些问题,需要你的帮助来解决它们。如果您可以提供任何帮助,我们将不胜感激!因为我真的需要完成这个项目。

JSFiddle:https://jsfiddle.net/rdxmmobe/1/

这是剧本:

<script type="text/javascript">
$(function(){
$(".DraggedItem").draggable({
        helper:'clone', 
        cursor:'move',
        opacity: 0.7
});

$('#rang1').droppable({
    drop: function(ev, ui) {
        $('#rang1input').val($(ui.draggable).attr('id'));
        var dropped = ui.draggable;
        var droppedOn = $(this);
        $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn);
    }
});

$('#rang2').droppable({
    drop: function(ev, ui) {
        $('#rang2input').val($(ui.draggable).attr('id'));
        var dropped = ui.draggable;
        var droppedOn = $(this);
        $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn);
    }
});

$('#rang3').droppable({
    drop: function(ev, ui) {
        $('#rang3input').val($(ui.draggable).attr('id'));
        var dropped = ui.draggable;
        var droppedOn = $(this);
        $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn);
    }
});

$('#rang4').droppable({
    drop: function(ev, ui) {
        $('#rang4input').val($(ui.draggable).attr('id'));
        var dropped = ui.draggable;
        var droppedOn = $(this);
        $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn);
    }
});

$('#rang5').droppable({
    drop: function(ev, ui) {
        $('#rang5input').val($(ui.draggable).attr('id'));
        var dropped = ui.draggable;
        var droppedOn = $(this);
        $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn);
    }
});

$('#rang6').droppable({
    drop: function(ev, ui) {
        $('#rang6input').val($(ui.draggable).attr('id'));
        var dropped = ui.draggable;
        var droppedOn = $(this);
        $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn);
    }
});

$('#rang7').droppable({
    drop: function(ev, ui) {
        $('#rang7input').val($(ui.draggable).attr('id'));
        var dropped = ui.draggable;
        var droppedOn = $(this);
        $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn);
    }
});
}); 
</script>


这些是7个可放弃的div(您可以放置​​图像):

<form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="POST">
<input type="hidden" value="<?php echo $row["IDBewoner"] ?>" name="bewoner">
<td> 
    <div id="rang1"></div> 
    <input type="hidden" value="" id="rang1input" name="rang1value">
</td>
<td> 
    <div id="rang2"></div> 
    <input type="hidden" value="" id="rang2input" name="rang2value">
</td>
<td> 
    <div id="rang3"></div> 
    <input type="hidden" value="" id="rang3input" name="rang3value">
</td>
<td> 
    <div id="rang4"></div> 
    <input type="hidden" value="" id="rang4input" name="rang4value">
</td>
<td> 
    <div id="rang5"></div>
    <input type="hidden" value="" id="rang5input" name="rang5value">
</td>
<td> 
    <div id="rang6"></div> 
    <input type="hidden" value="" id="rang6input" name="rang6value">
</td>
<td> 
    <div id="rang7"></div> 
    <input type="hidden" value="" id="rang7input" name="rang7value">
</td>
<input type="submit" value="Save">
</form>


这些是可拖动的图像(可以拖动的图像),它们来自数据库并具有不同的ID:

<td> <?php echo "<img class='DraggedItem' id='".$row["IDPictogram"]."' src='data:image/jpeg;base64,".base64_encode($row['Pictogram'])."' width='90' height='90' draggable='true'>"; ?> </td>


这是php代码:

if($_SERVER["REQUEST_METHOD"] == "POST") {
$rang1 = $_POST["rang1value"];
$rang2 = $_POST["rang2value"];
$rang3 = $_POST["rang3value"];
$rang4 = $_POST["rang4value"];
$rang5 = $_POST["rang5value"];
$rang6 = $_POST["rang6value"];
$rang7 = $_POST["rang7value"];
$bewonerID = $_POST["bewoner"];

echo "<script>alert('Rang1: $rang1')</script>";
echo "<script>alert('Rang2: $rang2')</script>";
echo "<script>alert('Rang3: $rang3')</script>";
echo "<script>alert('Rang4: $rang4')</script>";
echo "<script>alert('Rang5: $rang5')</script>";
echo "<script>alert('Rang6: $rang6')</script>";
echo "<script>alert('Rang7: $rang7')</script>";
}


第一个问题:正如您在上面的脚本中所看到的,我使用过&#34; helper:&#39; clone&#39;&#34;但是图像与类#34; .DraggedItem&#34;正在被移动,这不是重点。应该在7个div之间移动和替换图像。但它们应该从原始列表中克隆(因此我可以使用相同的图标两次,例如)

第二个问题:我为每个div都有一个隐藏的输入,它们必须包含
的id 删除图像,以便我可以将它们插入数据库。我们只是说我在Div1上放了一个图像(#rang1),然后将图像移动到Div4(#rang4),图像的ID保留在Div1的隐藏输入中,不会被删除/更新。当我在div上放一个新图像时,如何确保id也会更新?

第三个问题:当我从主列表中删除图像时如何检查,如果已有图像,旧图像会被删除并被新图像替换?
enter image description here

第四个问题:在两张图片之间切换的最佳方式是什么? enter image description here


如果你可以帮助我解决任何这些问题,将不胜感激!如果不解决这些问题,我就无法继续前进,我真的需要专家的帮助。

2 个答案:

答案 0 :(得分:2)

我会从一些代码的重构开始,以摆脱所有的复制粘贴代码。 Droppables可以通过一次调用进行初始化,将回调中的每个输入引用为$(this).next('input')

接下来,我不会将图像直接克隆到已删除的字段中以避免ID重复。我会在插槽内创建一个具有不同类的新图像元素,因为它们在插槽之间移动时必须表现不同,在我的示例中没有半透明的帮助器。

因此,在我的示例中,您的DraggedItem图片没有更改。我将DropZone类添加到每个可放置的插槽中,以允许通过一次调用进行初始化。

当图像被丢弃时,我会检查它的来源。如果它来自库,则创建一个新的图像元素,将其设置为src以匹配原始图像元素,并将data-id数据属性设置为原始项目的ID,以便在需要时保持跟踪。作为最后一步,我添加了一个DroppedItem类,并使其成为另一种没有帮助者的可拖动类。

如果丢弃的项目是DroppedItem,即来自不同的插槽,只需交换容器的内容和相应的input框值。

<强> HTML

<table>
    <tr>
        <td> 
            <div id="rang1" class="DropZone"></div> 
            <input type="text" value="" id="rang1input" name="rang1value" />
        </td>
        <td> 
            <div id="rang2" class="DropZone"></div> 
            <input type="text" value="" id="rang2input" name="rang2value" />
        </td>
        <td> 
            <div id="rang3" class="DropZone"></div> 
            <input type="text" value="" id="rang3input" name="rang3value" />
        </td>
        <td> 
            <div id="rang4" class="DropZone"></div> 
            <input type="text" value="" id="rang4input" name="rang4value" />
        </td>
        <td> 
            <div id="rang5" class="DropZone"></div>
            <input type="text" value="" id="rang5input" name="rang5value" />
        </td>
        <td> 
            <div id="rang6" class="DropZone"></div> 
            <input type="text" value="" id="rang6input" name="rang6value" />
        </td>
        <td> 
            <div id="rang7" class="DropZone"></div> 
            <input type="text" value="" id="rang7input" name="rang7value" />
        </td>
    </tr>
</table>
<img id="img1" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=1" />
<img id="img2" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=2" />
<img id="img3" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=3" />
<img id="img4" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=4" />
<img id="img5" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=5" />
<img id="img6" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=6" />
<img id="img7" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=7" />

<强> CSS

table { margin-bottom: 50px; }
td div { width: 50px; height: 50px; border:1px solid silver; margin-bottom: 10px;}
td input { width: 50px; }

<强>的JavaScript

$('.DraggedItem').draggable({
    helper: 'clone',
    cursor:'move',
    opacity: 0.7
});

var droppedOptions = {
    revert: 'invalid',
    cursor: 'move'
};

$('.DropZone').droppable({
    drop: function(ev, ui) {
        var dropped = ui.draggable;
        var droppedOn = $(this);

        if(ui.draggable.is('.DroppedItem')) {
            // Item is dragged from another slot, swap images

            var draggedFrom = ui.draggable.parent();
            droppedOn.find('img').appendTo(draggedFrom);
            dropped.css({ top:0, left:0 }).appendTo(droppedOn);

            var temp = '' + droppedOn.next('input').val();
            draggedFrom.next('input').val(temp);
            droppedOn.next('input').val(dropped.data('id'));
        } else {
            // Item is dragged from library

            droppedOn
                .empty() // Delete already dropped items
                .next('input')
                    .val(dropped.attr('id'));

            $('<img class="DroppedItem">')
                .attr('src', dropped.attr('src'))
                .data('id', dropped.attr('id'))
                .draggable(droppedOptions)
                .appendTo(droppedOn);
        }
    }
});

JS Fiddle example

请注意,在我的示例中,我将输入类型更改为text以进行显示,只需将其更改回hidden即可。

答案 1 :(得分:1)

这是我做的: https://jsfiddle.net/Twisty/rdxmmobe/3/

$(function () {
    $(".DraggedItem").draggable({
        helper: 'clone',
        cursor: 'move',
        opacity: 0.7,
        revert: true
    });

    $("div[id^='rang']").droppable({
        drop: function (ev, ui) {
            var target = $("#" + $(this).attr("id") + "input");
            target.val($(ui.draggable).attr('id'));
            var dropCopy = $("<img>");
            console.log("Setting DropCopy Source: " + $(ui.draggable).attr('src'));
            $(dropCopy).attr('src', $(ui.draggable).attr('src'));
            var droppedOn = $(this);
            droppedOn.append(dropCopy).css({
                top: 0,
                left: 0
            });
        }
    });
});