如何使用 if/else 语句编写 javascript 函数来检查 <div> class 是否包含 <img> 或 <img> class
How can I write a javascript function with the if/else statement to check whether a <div> class contains a <img> or <img> class
我正在尝试使用拖放功能制作网页。该页面旨在供用户将图像(我制作了两个 classes,一个称为 "sails",另一个 "boats")拖到 div(class 命名为 "dropbox" 和 "dropbox2")。
我遇到的问题是,如果用户将图像放入已经包含图像的可放置 div 中,其中一个图像会消失并且无法恢复。
为了解决这个问题,我认为我需要使用 if/else 语句创建一个函数来检查 div 是否包含图像。如果是这样,那么我希望拖放功能保持其默认设置,这样它就不会掉入 div 并从用户那里消失。否则,它会执行我已经拥有的关闭默认性质的代码,以便它可以放入 div。
if (**div contains an img**) {
**keep the default nature so that it doesn't drop into the div**
} else {
function drop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
}
如何描述条件以便检查 div 是否包含图像以及如何描述代码块以不允许图像放入 div 如果条件为真?
还是我以错误的方式解决了这个问题?对我来说似乎合乎逻辑,但我没有经验。
这是我的这个项目的 codepen link:
https://codepen.io/Pacman0006/pen/vYEWppe
任何帮助将不胜感激:)
这里的第一个问题是 ev.target.appendChild
会在第一次放置时将图像作为子图像添加到 div
,然后将其附加到 img
标签第二滴,创建更深的嵌套关系每个后续滴。 console.log(ev.target)
在该函数中可以观察到这一点。
所以一种方法是首先确保我们追加的节点是 div,然后我们的条件将检查 div 是否已经有任何子节点。我还简化了您的事件监听器。这是一个例子:
// When the draggable p element enters the droptarget, change the DIVS's border style
document.addEventListener("dragenter", function(event) {
if (event.target.className == "dropbox" || event.target.className == "dropbox2") {
event.target.style.border = "3px dotted red";
}
});
// When the draggable p element leaves the droptarget, reset the DIVS's border style
document.addEventListener("dragleave", function(event) {
if (event.target.className == "dropbox" || event.target.className == "dropbox2") {
event.target.style.border = "";
}
});
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function drop(ev) {
const element = ev.target.tagName === 'DIV' ? ev.target : ev.target.parentNode
if (!element.children.length) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
}
body {
background-image: url('https://drive.google.com/uc?export=view&id=1EcpUOWcgSSuAsFv0GbbSRcMtaOH-UY8q');
background-repeat: no-repeat;
}
.dropbox {
position: absolute;
float: ;
width: 200px;
height: 200px;
border: 2px dashed black
}
.dropbox2 {
position: absolute;
float: ;
width: 229px;
height: 80px;
border: 2px dashed black
}
.sails {
transform: translateY(-5%);
}
#div1 {
margin: 69px 354px;
}
#div2 {
margin: 69px 620px;
}
#div3 {
margin: 65px 887px;
}
#div4 {
margin: 65px 1150px;
}
#div5 {
margin: 367px 333px;
}
#div6 {
margin: 367px 600px;
}
#div7 {
margin: 362px 879px;
}
#div8 {
margin: 363px 1150px;
}
#div9 {
margin: 283px 333px;
}
#div10 {
margin: 283px 599px;
}
#div11 {
margin: 279px 866px;
}
#div12 {
margin: 279px 1129px;
}
#div13 {
margin: 581px 312px;
}
#div14 {
margin: 581px 579px;
}
#div15 {
margin: 576px 858px;
}
#div16 {
margin: 577px 1129px;
}
#drag3 {
transform: translateY(-54%);
}
<div class="dropbox2" id="div9" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div10" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div11" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div12" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div13" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div14" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div15" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div16" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div3" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div4" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div5" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div6" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div7" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div8" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<img class="sails" id="drag1" src="https://drive.google.com/uc?export=view&id=1ARGJDwdV9kH0IpOOL5hlm3lmOzOn81F1" draggable="true" ondragstart="drag(event)" width="215" height="210">
<img class="sails" id="drag2" src="https://drive.google.com/uc?export=view&id=1ARGJDwdV9kH0IpOOL5hlm3lmOzOn81F1" draggable="true" ondragstart="drag(event)" width="215" height="210">
<img id="drag3" src="https://drive.google.com/uc?export=view&id=1vZIEa2VkNaQLdb8zEWSkKaEeSLOOFBFV" draggable="true" ondragstart="drag(event)" width="290" height="170">
您需要在 drop
函数本身中写入您的条件。
您可以这样做:
function drop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
// check if the target container has an image already
var targetHasImage = ev.target.querySelector('img');
// check if the target container is not an image
var targetIsImage = ev.target.tagName === 'IMG'
// add the image if the target does not have an image and is not an image itself
if (!targetHasImage && !targetIsImage) {
ev.target.appendChild(document.getElementById(data));
}
}
在丢弃事件中,附加一个新的 class
: noDrop ev.target.classList.add("noDrop");
到目标 div 当第一个元素被丢弃时,为了 "mark" 他被占用.
在第二次丢弃时询问父对象是否有 class
noDrop,如果有,什么都不做,否则附加新对象。
// When the draggable p element enters the droptarget, change the DIVS's border style
document.addEventListener("dragenter", function(event) {
if (event.target.className == "dropbox") {
event.target.style.border = "3px dotted red";
}
});
document.addEventListener("dragenter", function(event) {
if (event.target.className == "dropbox2") {
event.target.style.border = "3px dotted red";
}
});
// When the draggable p element leaves the droptarget, reset the DIVS's border style
document.addEventListener("dragleave", function(event) {
if (event.target.className == "dropbox") {
event.target.style.border = "";
}
});
document.addEventListener("dragleave", function(event) {
if (event.target.className == "dropbox2") {
event.target.style.border = "";
}
});
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function drop(ev) {
debugger
var parentID = ev.target.parentNode.className
var data = ev.dataTransfer.getData("text");
if (parentID.includes("noDrop")) {
console.log("no transfer");
ev.preventDefault();
} else {
ev.preventDefault();
ev.target.appendChild(document.getElementById(data));
ev.target.classList.add("noDrop");
}
}
body {
background-image: url('https://drive.google.com/uc?export=view&id=1EcpUOWcgSSuAsFv0GbbSRcMtaOH-UY8q');
background-repeat: no-repeat;
}
.dropbox {
position: absolute;
float: ;
width: 200px;
height: 200px;
border: 2px dashed black
}
.dropbox2 {
position: absolute;
float: ;
width: 229px;
height: 80px;
border: 2px dashed black
}
.sails {
transform: translateY(-5%);
}
#div1 {
margin: 69px 354px;
}
#div2 {
margin: 69px 620px;
}
#div3 {
margin: 65px 887px;
}
#div4 {
margin: 65px 1150px;
}
#div5 {
margin: 367px 333px;
}
#div6 {
margin: 367px 600px;
}
#div7 {
margin: 362px 879px;
}
#div8 {
margin: 363px 1150px;
}
#div9 {
margin: 283px 333px;
}
#div10 {
margin: 283px 599px;
}
#div11 {
margin: 279px 866px;
}
#div12 {
margin: 279px 1129px;
}
#div13 {
margin: 581px 312px;
}
#div14 {
margin: 581px 579px;
}
#div15 {
margin: 576px 858px;
}
#div16 {
margin: 577px 1129px;
}
#drag3 {
transform: translateY(-54%);
}
<div class="dropbox2" id="div9" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div10" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div11" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div12" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div13" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div14" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div15" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div16" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div3" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div4" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div5" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div6" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div7" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div8" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<img class="sails" id="drag1" src="https://drive.google.com/uc?export=view&id=1ARGJDwdV9kH0IpOOL5hlm3lmOzOn81F1" draggable="true" ondragstart="drag(event)" width="215" height="210">
<img class="sails" id="drag2" src="https://drive.google.com/uc?export=view&id=1ARGJDwdV9kH0IpOOL5hlm3lmOzOn81F1" draggable="true" ondragstart="drag(event)" width="215" height="210">
<img id="drag3" src="https://drive.google.com/uc?export=view&id=1vZIEa2VkNaQLdb8zEWSkKaEeSLOOFBFV" draggable="true" ondragstart="drag(event)" width="290" height="170">
我正在尝试使用拖放功能制作网页。该页面旨在供用户将图像(我制作了两个 classes,一个称为 "sails",另一个 "boats")拖到 div(class 命名为 "dropbox" 和 "dropbox2")。
我遇到的问题是,如果用户将图像放入已经包含图像的可放置 div 中,其中一个图像会消失并且无法恢复。
为了解决这个问题,我认为我需要使用 if/else 语句创建一个函数来检查 div 是否包含图像。如果是这样,那么我希望拖放功能保持其默认设置,这样它就不会掉入 div 并从用户那里消失。否则,它会执行我已经拥有的关闭默认性质的代码,以便它可以放入 div。
if (**div contains an img**) {
**keep the default nature so that it doesn't drop into the div**
} else {
function drop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
}
如何描述条件以便检查 div 是否包含图像以及如何描述代码块以不允许图像放入 div 如果条件为真?
还是我以错误的方式解决了这个问题?对我来说似乎合乎逻辑,但我没有经验。
这是我的这个项目的 codepen link:
https://codepen.io/Pacman0006/pen/vYEWppe
任何帮助将不胜感激:)
这里的第一个问题是 ev.target.appendChild
会在第一次放置时将图像作为子图像添加到 div
,然后将其附加到 img
标签第二滴,创建更深的嵌套关系每个后续滴。 console.log(ev.target)
在该函数中可以观察到这一点。
所以一种方法是首先确保我们追加的节点是 div,然后我们的条件将检查 div 是否已经有任何子节点。我还简化了您的事件监听器。这是一个例子:
// When the draggable p element enters the droptarget, change the DIVS's border style
document.addEventListener("dragenter", function(event) {
if (event.target.className == "dropbox" || event.target.className == "dropbox2") {
event.target.style.border = "3px dotted red";
}
});
// When the draggable p element leaves the droptarget, reset the DIVS's border style
document.addEventListener("dragleave", function(event) {
if (event.target.className == "dropbox" || event.target.className == "dropbox2") {
event.target.style.border = "";
}
});
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function drop(ev) {
const element = ev.target.tagName === 'DIV' ? ev.target : ev.target.parentNode
if (!element.children.length) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
}
body {
background-image: url('https://drive.google.com/uc?export=view&id=1EcpUOWcgSSuAsFv0GbbSRcMtaOH-UY8q');
background-repeat: no-repeat;
}
.dropbox {
position: absolute;
float: ;
width: 200px;
height: 200px;
border: 2px dashed black
}
.dropbox2 {
position: absolute;
float: ;
width: 229px;
height: 80px;
border: 2px dashed black
}
.sails {
transform: translateY(-5%);
}
#div1 {
margin: 69px 354px;
}
#div2 {
margin: 69px 620px;
}
#div3 {
margin: 65px 887px;
}
#div4 {
margin: 65px 1150px;
}
#div5 {
margin: 367px 333px;
}
#div6 {
margin: 367px 600px;
}
#div7 {
margin: 362px 879px;
}
#div8 {
margin: 363px 1150px;
}
#div9 {
margin: 283px 333px;
}
#div10 {
margin: 283px 599px;
}
#div11 {
margin: 279px 866px;
}
#div12 {
margin: 279px 1129px;
}
#div13 {
margin: 581px 312px;
}
#div14 {
margin: 581px 579px;
}
#div15 {
margin: 576px 858px;
}
#div16 {
margin: 577px 1129px;
}
#drag3 {
transform: translateY(-54%);
}
<div class="dropbox2" id="div9" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div10" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div11" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div12" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div13" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div14" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div15" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div16" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div3" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div4" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div5" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div6" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div7" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div8" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<img class="sails" id="drag1" src="https://drive.google.com/uc?export=view&id=1ARGJDwdV9kH0IpOOL5hlm3lmOzOn81F1" draggable="true" ondragstart="drag(event)" width="215" height="210">
<img class="sails" id="drag2" src="https://drive.google.com/uc?export=view&id=1ARGJDwdV9kH0IpOOL5hlm3lmOzOn81F1" draggable="true" ondragstart="drag(event)" width="215" height="210">
<img id="drag3" src="https://drive.google.com/uc?export=view&id=1vZIEa2VkNaQLdb8zEWSkKaEeSLOOFBFV" draggable="true" ondragstart="drag(event)" width="290" height="170">
您需要在 drop
函数本身中写入您的条件。
您可以这样做:
function drop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
// check if the target container has an image already
var targetHasImage = ev.target.querySelector('img');
// check if the target container is not an image
var targetIsImage = ev.target.tagName === 'IMG'
// add the image if the target does not have an image and is not an image itself
if (!targetHasImage && !targetIsImage) {
ev.target.appendChild(document.getElementById(data));
}
}
在丢弃事件中,附加一个新的 class
: noDrop ev.target.classList.add("noDrop");
到目标 div 当第一个元素被丢弃时,为了 "mark" 他被占用.
在第二次丢弃时询问父对象是否有 class
noDrop,如果有,什么都不做,否则附加新对象。
// When the draggable p element enters the droptarget, change the DIVS's border style
document.addEventListener("dragenter", function(event) {
if (event.target.className == "dropbox") {
event.target.style.border = "3px dotted red";
}
});
document.addEventListener("dragenter", function(event) {
if (event.target.className == "dropbox2") {
event.target.style.border = "3px dotted red";
}
});
// When the draggable p element leaves the droptarget, reset the DIVS's border style
document.addEventListener("dragleave", function(event) {
if (event.target.className == "dropbox") {
event.target.style.border = "";
}
});
document.addEventListener("dragleave", function(event) {
if (event.target.className == "dropbox2") {
event.target.style.border = "";
}
});
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function drop(ev) {
debugger
var parentID = ev.target.parentNode.className
var data = ev.dataTransfer.getData("text");
if (parentID.includes("noDrop")) {
console.log("no transfer");
ev.preventDefault();
} else {
ev.preventDefault();
ev.target.appendChild(document.getElementById(data));
ev.target.classList.add("noDrop");
}
}
body {
background-image: url('https://drive.google.com/uc?export=view&id=1EcpUOWcgSSuAsFv0GbbSRcMtaOH-UY8q');
background-repeat: no-repeat;
}
.dropbox {
position: absolute;
float: ;
width: 200px;
height: 200px;
border: 2px dashed black
}
.dropbox2 {
position: absolute;
float: ;
width: 229px;
height: 80px;
border: 2px dashed black
}
.sails {
transform: translateY(-5%);
}
#div1 {
margin: 69px 354px;
}
#div2 {
margin: 69px 620px;
}
#div3 {
margin: 65px 887px;
}
#div4 {
margin: 65px 1150px;
}
#div5 {
margin: 367px 333px;
}
#div6 {
margin: 367px 600px;
}
#div7 {
margin: 362px 879px;
}
#div8 {
margin: 363px 1150px;
}
#div9 {
margin: 283px 333px;
}
#div10 {
margin: 283px 599px;
}
#div11 {
margin: 279px 866px;
}
#div12 {
margin: 279px 1129px;
}
#div13 {
margin: 581px 312px;
}
#div14 {
margin: 581px 579px;
}
#div15 {
margin: 576px 858px;
}
#div16 {
margin: 577px 1129px;
}
#drag3 {
transform: translateY(-54%);
}
<div class="dropbox2" id="div9" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div10" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div11" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div12" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div13" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div14" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div15" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox2" id="div16" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div3" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div4" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div5" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div6" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div7" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="dropbox" id="div8" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<img class="sails" id="drag1" src="https://drive.google.com/uc?export=view&id=1ARGJDwdV9kH0IpOOL5hlm3lmOzOn81F1" draggable="true" ondragstart="drag(event)" width="215" height="210">
<img class="sails" id="drag2" src="https://drive.google.com/uc?export=view&id=1ARGJDwdV9kH0IpOOL5hlm3lmOzOn81F1" draggable="true" ondragstart="drag(event)" width="215" height="210">
<img id="drag3" src="https://drive.google.com/uc?export=view&id=1vZIEa2VkNaQLdb8zEWSkKaEeSLOOFBFV" draggable="true" ondragstart="drag(event)" width="290" height="170">