Javascript 用拖放替换图像

Javascript 用拖放替换图像,javascript,html,drag-and-drop,Javascript,Html,Drag And Drop,我在这个网站上得到了一些人的帮助,他们开发了一个拖放教育游戏,学生们可以将图像按正确的顺序拖动。我能够用VisualBasic在Winform中实现我的目标。现在我正试图在html中做同样的事情。使用下面的三个函数,我可以将图像从一个div拖放到另一个空div中。但是,如果我试图将图像拖放到已经包含图像的div中,则无法工作。我确实在StackOverflow中看到了关于在drop函数中使用此行“ev.target.removeChild(ev.target.childNodes[0]”的响应。

我在这个网站上得到了一些人的帮助,他们开发了一个拖放教育游戏,学生们可以将图像按正确的顺序拖动。我能够用VisualBasic在Winform中实现我的目标。现在我正试图在html中做同样的事情。使用下面的三个函数,我可以将图像从一个div拖放到另一个空div中。但是,如果我试图将图像拖放到已经包含图像的div中,则无法工作。我确实在StackOverflow中看到了关于在drop函数中使用此行“ev.target.removeChild(ev.target.childNodes[0]”的响应。但这只会创建一个错误“Node.removeChild的参数1不是对象。”谢谢您的帮助

    <!DOCTYPE HTML>
<html>
<head>
<style>
#div1, #div2, #div3, #div4, #div5
{float:left; width:100px; height:35px; margin:10px;padding:10px;border:1px                     solid #0066ff;}
#btn1
{float:left; width: 120px; height: 40px; margin: 125px; }
</style>
<script>

function allowDrop(ev) {
    ev.preventDefault();
}
function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}
function drop(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    //ev.target.removeChild(ev.target.childNodes[0]); //This line created an     error
    ev.target.appendChild(document.getElementById(data));
}
</script>

</head>
<body>

<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"><img       src='Images/grass(3).jpg' draggable="true" ondragstart="drag(event)" id="drag1"     width="88" height="31"> </div>
<div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"><img    src="Images/sun.jpg" draggable="true" ondragstart="drag(event)" id="drag2" width="88" height="31"> </div>
<div id="div3" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div4" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div5" ondrop="drop(event)" ondragover="allowDrop(event)"></div>

</body>
</html>

#第一组,第二组,第三组,第四组,第五组
{浮点:左;宽度:100px;高度:35px;边距:10px;填充:10px;边框:1px实心35; 0066ff;}
#btn1
{浮点:左;宽度:120px;高度:40px;边距:125px;}
功能allowDrop(ev){
ev.preventDefault();
}
功能阻力(ev){
ev.dataTransfer.setData(“文本”,ev.target.id);
}
功能下降(ev){
ev.preventDefault();
var data=ev.dataTransfer.getData(“文本”);
//ev.target.removeChild(ev.target.childNodes[0]);//此行创建了一个错误
ev.target.appendChild(document.getElementById(数据));
}

经过大量的尝试和错误加上互联网搜索,我终于找到了自己问题的答案。我问题的实质是我不能将一个图像拖放到另一个图像上。通常拖动的图像会消失。我真正想做的是“交换”两个图像,将图像A放到图像B上,然后让图像B显示图像A所在的位置

我在以下网站上找到了Sue Smith的教程示例:

在这个示例中,她展示了如何设置6个div,每个div都有一个内部div,每个内部div中都有一个文本字符串(通常是一个单词)。在她的示例中,很容易拖动和“交换”一个单词与另一个单词。但是如果你在div中放置一个图像,它将不再工作

因此,我所做的是为每个内部div创建一个ID。然后,我为每个内部div分配了一个背景图像,并删除了文本。在试用Sue Smith的代码后,我终于能够完成内部div的替换和交换(与它们相关联的背景图片)最终的结果是,看起来你只是在拖放和交换图像。这在Chrome和Firefox中都很有效。由于某些原因,它在IE 11版中不起作用。你可以看到下面修改的代码

<!DOCTYPE HTML>
    <html> 
    <head>
         <style type="text/css">
         .mover {
             width:200px; height:170px; line-height:4em; margin:10px;                                                padding:5px; float:left; 
             border:1px dotted #333333; text-align:center;  
             } 
             #boxA{
                background-image: url(images/coyote.jpg)
             }
             #boxB{
                background-image: url(images/black_bear.jpg)
             }
             #boxC{
                background-image: url(images/grass.jpg)
             }
             #boxD{
                background-image: url(images/rabbits.jpg)
             }
             #boxE{
                background-image: url(images/sun.jpg)
              }
          </style>
          <script type="text/javascript">
               function dragWord(dragEvent){
                  dragEvent.dataTransfer.setData("Id",    dragEvent.target.id+"|"+dragEvent.target.parentNode.id);
                 }                   
               function dropWord(dropEvent){ 
                var dropData = dropEvent.dataTransfer.getData("Id");
                dropItems = dropData.split("|"); 
                var prevElem = document.getElementById(dropItems[1]); 
                prevElem.getElementsByTagName("div")[0].id =      dropEvent.target.id;              
                dropEvent.target.id = dropItems[0]; 
                dropEvent.preventDefault(); 
                } 
                </script> 
                </head> 
                <body> <div><em>Drag and drop the pictures in order to show      how energy moves through a food chain.</em></div> 
                    <div id="box1" ondragover="event.preventDefault()"      ondrop="dropWord(event)" > 
                    <div class="mover" id="boxA" draggable="true"      ondragstart="dragWord(event)" ></div> 
                    </div>
                    <div id="box2" ondragover="event.preventDefault()"     ondrop="dropWord(event)"> 
                    <div class="mover" id="boxB" draggable="true"      ondragstart="dragWord(event)"></div> 
                    </div>
                    <div id="box3" ondragover="event.preventDefault()"      ondrop="dropWord(event)"> 
                    <div class="mover" id="boxC" draggable="true"      ondragstart="dragWord(event)"></div> 
                    </div> 
                    <div id="box4" ondragover="event.preventDefault()"      ondrop="dropWord(event)"> 
                    <div class="mover" id="boxD" draggable="true"      ondragstart="dragWord(event)"></div> 
                    </div> 
                    <div id="box5" ondragover="event.preventDefault()"      ondrop="dropWord(event)"> 
                    <div class="mover" id="boxE" draggable="true"     ondragstart="dragWord(event)"></div> 
                    </div>                                      
            </body> 
            </html>

搬运工先生{
宽度:200px;高度:170px;线条高度:4em;边距:10px;填充:5px;浮动:左侧;
边框:1px点#333333;文本对齐:居中;
} 
#博萨{
背景图片:url(images/coyote.jpg)
}
#箱B{
背景图片:url(images/black_bear.jpg)
}
#boxC{
背景图片:url(images/grass.jpg)
}
#boxD{
背景图片:url(images/rabbits.jpg)
}
#拳击{
背景图片:url(images/sun.jpg)
}
功能dragWord(dragEvent){
dragEvent.dataTransfer.setData(“Id”,dragEvent.target.Id+“|”+dragEvent.target.parentNode.Id);
}                   
函数dropWord(dropEvent){
var dropData=dropEvent.dataTransfer.getData(“Id”);
dropItems=dropData.split(“|”);
var prevElem=document.getElementById(dropItems[1]);
prevElem.getElementsByTagName(“div”)[0].id=dropEvent.target.id;
dropEvent.target.id=dropItems[0];
preventDefault();
} 
拖放图片以显示能量如何通过食物链移动。

请做两件事:第一,提供一个,而不是一个简短的代码片段,除非MCVE非常长。第二,每个问题只问一个问题——用一个图像替换另一个图像是(或者看起来至少是)另一个问题是如何让它们交换。请确保您是访问div而不是图像。穆萨,您是对的…如果我增加div的大小,那么我可以在其中拖动第二个图像。如果我做了一些变通,这可能会有所帮助。我的首选是删除(并复制)在我放置新图像之前,放置区域中的图像。