You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

图片上传组件删除按钮显示控制:imagePaths与判断条件问题

需求与问题

我需要实现的效果是:当图片上传对应的label元素中没有图片时,隐藏叉形删除按钮。目前尝试两种实现方案均遇到问题:

  • 方案一:通过imagePaths数组判断按钮显示状态,但页面加载时已通过setFormData()为imagePaths赋值图片链接,代码中却无法获取到有效数据(console显示该数组为空);
  • 方案二:通过label.style.backgroundImage判断是否存在图片,但当前条件label.style.backgroundImage != ""不生效,因为无图片时该值为url("null"),有图片时为url("图片链接"),需修正判断条件。

HTML代码

<div class="upload-catalouge">
  <input type="file" class="fileupload" id="first-file-upload-btn" hidden />
  <label for="first-file-upload-btn" class="upload-image">
    <button class="delete-image" data-index="0" hidden><img src="../img/close.png" alt="" /></button>
  </label>
  <input type="file" class="fileupload" id="second-file-upload-btn" hidden />
  <label for="second-file-upload-btn" class="upload-image">
    <button class="delete-image" data-index="0"><img src="../img/close.png" alt="" /></button>
  </label>
  <input type="file" class="fileupload" id="third-file-upload-btn" hidden />
  <label for="third-file-upload-btn" class="upload-image">
    <button class="delete-image" data-index="0"><img src="../img/close.png" alt="" /></button>
  </label>
  <input type="file" class="fileupload" id="fourth-file-upload-btn" hidden />
  <label for="fourth-file-upload-btn" class="upload-image">
    <button class="delete-image" data-index="0"><img src="../img/close.png" alt="" /></button>
  </label>
</div>

JavaScript代码

let user = JSON.parse(sessionStorage.user || null);
let loader = document.querySelector(".loader");
 
// 检查用户是否已登录
window.onload = () => {
  if (user) {
    if (!compareToken(user.authToken, user.email)) {
      location.replace("/login");
    }
  } else {
    location.replace("/login");
  }
};
 
// 图片上传处理
let uploadImages = document.querySelectorAll(".fileupload");
const deleteButtons = document.querySelectorAll(".delete-image");
 
let imagePaths = []; // 存储所有上传图片的路径
 
uploadImages.forEach((fileupload, index) => {
  fileupload.addEventListener("change", () => {
    const file = fileupload.files[0];
    let imageUrl;
 
    if (file.type.includes("image")) {
      // 用户上传的是图片
      fetch("/s3url")
        .then((res) => res.json())
        .then((url) => {
          fetch(url, {
            method: "PUT",
            headers: new Headers({ "Content-Type": "multipart/form-data" }),
            body: file,
          }).then((res) => {
            imageUrl = url.split("?")[0];
            imagePaths[index] = imageUrl;
            let label = document.querySelector(`label[for=${fileupload.id}]`);
            label.style.backgroundImage = `url(${imageUrl})`;
            let productImage = document.querySelector(".product-image");
            productImage.style.backgroundImage = `url(${imageUrl})`;
          });
        });
    } else {
      showAlert("只能上传图片");
    }
  });
});
 
console.log(`window.onload下方的imagePaths : `, imagePaths);
const labels = document.querySelectorAll(".upload-image");
labels.forEach((label) => {
  console.log(`每个label的style.backgroundImage :`, label.style.backgroundImage);
});
 
deleteButtons.forEach((deleteButton, index) => {
  deleteButton.addEventListener("click", () => {
    imagePaths[index] = null;
    let label = document.querySelector(`label[for=${deleteButton.parentNode.htmlFor}]`);
    label.style.backgroundImage = null;
    let productImage = document.querySelector(".product-image");
    imageLinks = imagePaths.filter((value) => value);
    productImage.style.backgroundImage = `url(${imageLinks[imageLinks.length - 1]})`;
  });
});
 
// 已有商品详情处理
 
const setFormsData = (data) => {
  productName.value = data.name;
  shortLine.value = data.shortDes;
  des.value = data.des;
  actualPrice.value = data.actualPrice;
  discountPercentage.value = data.discount;
  sellingPrice.value = data.sellPrice;
  stock.value = data.stock;
  tags.value = data.tags;
 
  // 设置图片
  imagePaths = data.images;
  console.log(`setFormData中的imagePaths :`, imagePaths);
  /* 我把imagePaths存入localStorage */
 
  imagePaths.forEach((url, i) => {
    let label = document.querySelector(`label[for=${uploadImages[i].id}]`);
    label.style.backgroundImage = `url(${url})`;
    let productImage = document.querySelector(".product-image");
    imageLinks = imagePaths.filter((value) => value);
    productImage.style.backgroundImage = `url(${imageLinks[imageLinks.length - 1]})`;
    console.log(`setFormData中的label.style.backgroundImage :`, label.style.backgroundImage);
  });
 
  // 设置尺寸
  sizes = data.sizes;
 
  let sizeCheckbox = document.querySelectorAll(".size-checkbox");
  sizeCheckbox.forEach((item) => {
    if (sizes.includes(item.value)) {
      item.setAttribute("checked", "");
    }
  });
};
 
const fetchAddProductDataId = () => {
  fetch("/get-products", {
    method: "post",
    headers: new Headers({ "Content-Type": "application/json" }),
    body: JSON.stringify({ email: user.email, id: productId }),
  })
    .then((res) => res.json())
    .then((data) => {
      setFormsData(data);
    })
    .catch((err) => {
      console.log(err);
    });
};
 
let productId = null;
if (location.pathname != "/add-product") {
  productId = decodeURI(location.pathname.split("/").pop());
 
  fetchAddProductDataId();
}

CSS代码

.upload-image:hover .delete-image {
  opacity: 0.8;
  pointer-events: all;
}
 
.delete-image {
  position: absolute;
  top: 5px;
  left: 5px;
  width: 30px;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  transition: 0.5s;
  opacity: 0;
  background: #fff;
  border: none;
  outline: none;
  z-index: 2;
  cursor: pointer;
  pointer-events: none;
}
 
.delete-image img {
  height: 15px;
}
 
.upload-image {
  position: relative;
  width: 100%;
  height: 100px;
  background: #f5f5f5;
  cursor: pointer;
  background-size: cover;
}
 
.upload-image:hover {
  background: rgba(0, 0, 0, 0.2);
  background-size: cover;
}

内容的提问来源于stack exchange,提问作者user13069641

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:27:01