未捕获的typeerror:无法读取null javascipt的属性“classlist”

yshpjwxd  于 2021-09-23  发布在  Java
关注(0)|答案(2)|浏览(346)

我有一个通过模板传递给html元素的对象列表或数组。我有一个removietem函数。它正在删除项目。但在最后一项中,它并没有隐藏它。我试图在菜单中没有任何项目时隐藏它。但在最后一项上,它被卡住了,没有做任何进一步的事情。模板导致了所有问题。除模板隐藏外,其他所有项都是隐藏的。但事实并非如此。my shoppingcart.js将cartremove.classlist.add(“隐藏”)设置为null。.hide的属性为display:none。错误:

  1. Uncaught TypeError: Cannot read property 'classList' of null
  2. at hideCart (shoppingCart.js:74)
  3. at renderCart (shoppingCart.js:54)
  4. at removeFromCart (shoppingCart.js:68)
  5. at HTMLDocument.<anonymous> (shoppingCart.js:29)


shoppingcart.js

  1. import items from "./items.json";
  2. import { formatCurrency } from "./utils/formatCurrency.js";
  3. const menu = document.querySelector(".menu");
  4. const cart = document.querySelector("#cart");
  5. const cartRemove = document.querySelector("[data-cart-item]");
  6. const storeCartContainer = document.querySelector("[data-cart-container]");
  7. const cartItemTemplate = document.querySelector("#cart-item-template");
  8. const cartQuantity = document.querySelector("[data-cart-quantity]");
  9. const cartTotal = document.querySelector("[data-cart-total]");
  10. const cartHide = document.querySelector(".ahmad");
  11. // total.innerHTML = cartTotal.innerText
  12. let shoppingCart = [];
  13. const IMAGE_URL = "https://dummyimage.com/420x220";
  14. export const toggleCard = cart.addEventListener("click", () => {
  15. menu.classList.toggle("show");
  16. });
  17. export function setupShoppingCart() {
  18. document.addEventListener("click", (e) => {
  19. e.preventDefault()
  20. if (e.target.matches("[data-remove-to-cart-button]")) {
  21. const id = parseInt(e.target.closest("[data-cart-item]").dataset.itemId);
  22. removeFromCart(id);
  23. if (id === null) {
  24. renderCart()
  25. }
  26. }
  27. });
  28. renderCart();
  29. }
  30. export function addToCart(id) {
  31. const existingItem = shoppingCart.find(entry => entry.id === id)
  32. if (existingItem) {
  33. existingItem.quantity++
  34. }
  35. else {
  36. shoppingCart.push({ id: id, quantity: 1 });
  37. }
  38. renderCart();
  39. }
  40. function renderCart() {
  41. if (shoppingCart.length === 0) {
  42. hideCart()
  43. // hideData()
  44. }
  45. else {
  46. showCart()
  47. renderCartItems();
  48. }
  49. }
  50. function removeFromCart(id) {
  51. const existingItem = shoppingCart.find((entry) => entry.id === id);
  52. if (existingItem == null) return;
  53. shoppingCart = shoppingCart.filter((entry) => entry.id !== id);
  54. renderCart();
  55. }
  56. function hideCart() {
  57. cartHide.classList.add("hide");
  58. cartRemove.classList.add("hide"); // This is getting Null
  59. }
  60. function showCart() {
  61. cart.classList.remove("hide")
  62. }
  63. function renderCartItems() {
  64. cartQuantity.innerText = shoppingCart.length;
  65. const totalCents = shoppingCart.reduce((sum, entry) => {
  66. const item = items.find((i) => entry.id === i.id);
  67. return sum + item.priceCents * entry.quantity
  68. },0)
  69. cartTotal.innerText = formatCurrency(totalCents / 100)
  70. storeCartContainer.innerHTML = "";
  71. shoppingCart.forEach((entry) => {
  72. console.log(items, entry);
  73. const item = items.find((i) => entry.id === i.id);
  74. const cartItem = cartItemTemplate.content.cloneNode(true);
  75. const container = cartItem.querySelector("[data-cart-item]");
  76. container.dataset.itemId = item.id;
  77. const name = cartItem.querySelector("[data-cart-name]");
  78. name.innerText = item.name;
  79. if (entry.quantity > 1) {
  80. const quantity = cartItem.querySelector("[data-cart-quantity]");
  81. quantity.innerText = `x${entry.quantity}`;
  82. }
  83. const image = cartItem.querySelector("[data-cart-img]");
  84. image.src = `${IMAGE_URL}/${item.imageColor}/${item.imageColor}`;
  85. const price = cartItem.querySelector("[data-cart-price]");
  86. price.innerText = formatCurrency((item.priceCents * entry.quantity) / 100);
  87. storeCartContainer.appendChild(cartItem);
  88. });
  89. };

存储索引

  1. </head>
  2. <body>
  3. <div class="container">
  4. <div class="front-page">
  5. <!-- Section 1 -->
  6. <section class="section-1">
  7. <a href="#" id="cart" class="ahmad">
  8. <i class="fas fa-shopping-cart"></i>
  9. <span data-cart-quantity></span>
  10. </a>
  11. <div>
  12. <div class="menu">
  13. <div data-cart-container> //Template is under this div
  14. <div>
  15. </div>
  16. </div>
  17. <div class="details">
  18. <h5>Total</h5>
  19. <div data-cart-total>
  20. </div> </div>
  21. </div>
  22. </section>
  23. </body>
  24. </head>
  25. <template id="cart-item-template">
  26. <div data-cart-item class="palette">
  27. <button data-remove-to-cart-button>Close</button>
  28. <img data-cart-img class="bgc-menu"></img>
  29. <div class="palette-detail">
  30. <div data-cart-name class="palette-color"></div>
  31. <div data-cart-quantity></div>
  32. <div data-cart-price class="palette-price"></div>
  33. </div>
  34. <!-- <span data-cart-amount class="plz">$0.00</span> -->
  35. </template>
jaxagkaj

jaxagkaj1#

根据这个答案,要在模板中定位元素,您需要 querySelector 使用模板的 content 关键词如下:

  1. const template = document.querySelector("#cart-item-template");
  2. const cartRemove = template.content.querySelector("[data-cart-item]");
  3. cartRemove.classList.add("hide"); // Now it works fine
nhhxz33t

nhhxz33t2#

您正试图在脚本开头引用模板中的元素:

  1. const cartRemove = document.querySelector("[data-cart-item]");

这发生在您的模板被克隆并放入dom之前,所以此时使用属性 data-cart-item 找不到-您得到 null 在你的 cartRemove 变量
在中示例化模板后,请尝试选择此元素 renderCartItems 函数,并通过一个特定示例,就像您在以下两行中所做的那样:

  1. const cartItem = cartItemTemplate.content.cloneNode(true);
  2. const container = cartItem.querySelector("[data-cart-item]");

相关问题