在兄弟元素的点击事件中从内存中删除Image()对象—JavaScript
我有一个图像预览器,它使用 JavaScriptImage()对象在用 PHP 处理图像之前预览图像。我有一个包含 'x' SVG 图形的 div,该图形的目标是单击事件以删除图像。
在函数底部的下面代码中,它使用evt.target并基本上删除每个图像所在的父元素,如果用户希望删除图像。
这一切在视觉层面上都可以正常工作,但即使图像被删除(并且它们从 HTML 中删除),当表单上的“提交”元素被单击以上传图像时,仍会处理任何已删除的图像。从我可以收集到的图像存储在内存中并从那里进行处理。
我已经尝试将图像本身(thumbnailElement在 JavaScript 中)设置为 null 并将其 src 属性设置为空字符串,但这不起作用。
防止处理这些已删除的图像预览的最佳方法是什么?
在下面的代码中,我将 'x' 的 SVG 图形换成了字母 'x' 以使其更易于阅读。
注意:我已经在下面展示了整个图像上传器 - 但它是下面 JS 的最后一部分,// Delete Images这是我需要帮助的部分。
代码笔:https ://codepen.io/emilychews/pen/WNjZVGZ
const dropZone = document.getElementById('drop-zone'),
showSelectedImages = document.getElementById('show-selected-images'),
fileUploader = document.getElementById('standard-upload-files')
dropZone.addEventListener("click", (evt) => {
// assigns the dropzone to the hidden input element so when you click 'select files' it brings up a file picker window
fileUploader.click();
});
// Prevent browser default when draging over
dropZone.addEventListener("dragover", (evt) => {
evt.preventDefault();
});
fileUploader.addEventListener("change", (evt) => {
// Clear the already selected images
showSelectedImages.innerHTML = "";
// this function is further down but declared here and shows a thumbnail of the image
[...fileUploader.files].forEach(updateThumbnail);
});
dropZone.addEventListener("drop", (evt) => {
evt.preventDefault();
// Clear the already selected images
showSelectedImages.innerHTML = "";
// assign dropped files to the hidden input element
if (evt.dataTransfer.files.length) {
fileUploader.files = evt.dataTransfer.files;
}
// function is declared here but written further down
[...evt.dataTransfer.files].forEach(updateThumbnail);
});
// updateThumbnail function that needs to be able to handle multiple files
function updateThumbnail(file) {
if (file.type.startsWith("image/")) {
const uploadImageWrapper = document.createElement('article'),
removeImage = document.createElement('div'),
thumbnailElement = new Image();
// 'x' that deletes the image
removeImage.classList.add("remove-image");
removeImage.innerHTML = 'x';
// image thumbnail
thumbnailElement.classList.add("drop-zone__thumb");
thumbnailElement.src = URL.createObjectURL(file);
// appending elements
showSelectedImages.append(uploadImageWrapper) // <article> element
uploadImageWrapper.append(removeImage) // 'x' to delete
uploadImageWrapper.append(thumbnailElement); // image thumbnail
// Delete images
removeImage.addEventListener('click', (evt) => {
if(evt.target) {
var deleteImage = removeImage.closest('article');
deleteImage.remove()
}
})
}
} // end of 'updateThumbnail' function
body {
margin: 0;
display: flex;
justify-content: center;
width: 100%;
}
form {
width: 30%;
}
#drop-zone {
border: 1px dashed;
width: 100%;
padding: 1rem;
margin-bottom: 1rem;
}
.select-files {
text-decoration: underline;
cursor: pointer;
}
/* image that is preview prior to form submit*/
.drop-zone__thumb {
width: 200px;
height: auto;
display: block;
}
#remove-x {
width: 1rem;
height: 1rem;
}
#submit-images {
margin: 1rem 0;
}
#show-selected-images {
display: flex;
}
<form enctype="multipart/form-data" method="post">
<h1>Upload Your Images</h1>
<div>
<p>DRAG AND DROP IMAGES HERE</p>
<p>Or</p>
<p>Select Files</p>
</div>
<input type="file" name="standard-upload-files[]" multiple>
<input type="submit" name="submit-images" value="SUBMIT IMAGES">
<div></div>
</form>
THE END
二维码