为什么拖动(拖放/拖动)元素导致dropzone(div)部分消失?

时间:2017-11-06 00:17:20

标签: javascript html5 drag-and-drop

使用HTML5拖放功能,拖动元素时,dropzone会从UI部分消失,如屏幕截图所示。图像中的部分缺失div具有红色边框。当我删除" hr"标签,从下面的代码,它的工作原理,拖动元素时div不会消失!这只发生在Chrome浏览器中。所有代码都在下面。有谁知道为什么会这样?

<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>

<style>
    .objects {
        display: inline-block;
        background-color: #FFF3CC;
        border: #DFBC6A 1px solid;
        width: 50px;
        height: 50px;
        margin: 10px;
        padding: 8px;
        font-size: 18px;
        text-align: center;
        box-shadow: 2px 2px 2px #999;
        cursor: move;
    }

    #drop_zone {
        background-color: #EEE;
        border: #f00 1px solid;
        width: 280px;
        height: 200px;
        padding: 8px;
        font-size: 18px;
    }
</style>

<script>
        function _(id){
           return document.getElementById(id);
        }
        var droppedIn = false;
        function drag_start(event) {

             _('app_status').innerHTML = "Dragging the " + 
event.target.getAttribute('id');

            event.dataTransfer.dropEffect = "move";
            event.dataTransfer.setData("text", 
event.target.getAttribute('id') );
        }
        function drag_enter(event) {
            _('app_status').innerHTML = "You are dragging over the 
"+event.target.getAttribute('id');
        }
        function drag_leave(event) {
            _('app_status').innerHTML = "You left the 
"+event.target.getAttribute('id');
        }
        function drag_drop(event) {
            event.preventDefault(); /* Prevent undesirable default behavior 
while dropping */
            var elem_id = event.dataTransfer.getData("text");
            event.target.appendChild( _(elem_id) );
            _('app_status').innerHTML = "Dropped "+elem_id+" into the 
"+event.target.getAttribute('id');
            _(elem_id).removeAttribute("draggable");
            _(elem_id).style.cursor = "default";
            droppedIn = true;
        }
        function drag_end(event) {
            if(droppedIn == false){
                _('app_status').innerHTML = "You let the 
"+event.target.getAttribute('id')+" go.";
            }
            droppedIn = false;
        }
        function readDropZone(){
    alert('dropzone');
            for(var i=0; i < _("drop_zone").children.length; i++){
                alert(_("drop_zone").children[i].id+" is in the drop zone");
            }
            /* Run Ajax request to pass any data to your server */
        }
</script>

</head>
<body>

<h2 id="app_status">App status...</h2>

<h1>Drop Zone</h1>

<div id="drop_zone" ondragenter="drag_enter(event)" 
ondrop="drag_drop(event)" ondragover="return false" 
ondragleave="drag_leave(event)"></div>
<div id="object1" class="objects" draggable="true" 
ondragstart="drag_start(event)" ondragend="drag_end(event)">object 1</div>
<div id="object2" class="objects" draggable="true" 
ondragstart="drag_start(event)" ondragend="drag_end(event)">object 2</div>
<div id="object3" class="objects" draggable="true" 
ondragstart="drag_start(event)" ondragend="drag_end(event)">object 3</div>

<hr />
<br />
<button onclick="readDropZone()">Get Object Data</button>


</body>
</html>

DIV display cut off

1 个答案:

答案 0 :(得分:1)

在我的测试中,即使我删除了<hr />,错误仍然会被重现。我注意到,它是在更改h2#app_status文本后发生的。如果你将div#drop_zone以及所有下一个元素(例如div#object...)与包含inline-block的div作为显示样式进行包装,那么就不会有这样的消失。

<style>
   #drop-zone-wrapper {display: inline-block;}
</style>

<div id="drop-zone-wrapper">
    <div id="drop_zone" ondragenter="drag_enter(event)"
         ondrop="drag_drop(event)" ondragover="return false"
         ondragleave="drag_leave(event)"></div>
    <div id="object1" class="objects" draggable="true"
         ondragstart="drag_start(event)" ondragend="drag_end(event)">object 1</div>
    <div id="object2" class="objects" draggable="true"
         ondragstart="drag_start(event)" ondragend="drag_end(event)">object 2</div>
    <div id="object3" class="objects" draggable="true"
         ondragstart="drag_start(event)" ondragend="drag_end(event)">object 3</div>
</div>