我的window.onload有时不起作用。我该如何使其工作?

huangapple go评论137阅读模式
英文:

My window.onload doesn't work sometimes. How do I make it work?

问题

const productsJsonFile = '../products.json';

// 获取和显示产品的函数
async function fetchProducts() {
    try {
        const response = await fetch(productsJsonFile);
        const products = await response.json();
        displayProducts(products);
    } catch (error) {
        console.error('获取产品出错:', error);
    }
}

// 显示产品的函数
function displayProducts(products) {
    let productContainer = document.getElementById("products");

    for (let product of products) {

        // 创建卡片元素
        let card = document.createElement("div");
        card.classList.add("card");

        // 卡片应该有一个类别,初始时应该保持隐藏状态
        card.classList.add("card", product.category, "hide");

        // 创建图像容器
        let imgContainer = document.createElement("div");
        imgContainer.classList.add("image-container");

        // 创建图像元素
        let image = document.createElement("img");
        image.setAttribute("src", product.image);
        imgContainer.appendChild(image);
        card.appendChild(imgContainer);

        // 创建产品详情容器
        let container = document.createElement("div");
        container.classList.add("container2");

        // 创建产品名称元素
        let name = document.createElement("h5");
        name.classList.add("product-name");
        name.innerText = product.name.toUpperCase();
        container.appendChild(name);

        // 创建评分元素
        let rating = document.createElement("div");
        rating.classList.add("rating");

        for (let i = 1; i <= 5; i++) {
            let starIcon = document.createElement("i");
            starIcon.classList.add("fa");
            if (i <= product.rating) {
                starIcon.classList.add("fa-star");
            } else if (i - 0.5 === product.rating) {
                starIcon.classList.add("fa-star-half-o");
            } else {
                starIcon.classList.add("fa-star-o");
            }
            rating.appendChild(starIcon);
        }

        container.appendChild(rating);

        // 创建价格元素
        let price = document.createElement("h6");
        price.classList.add("price");
        price.innerText = "Php " + product.price + ".00";
        container.appendChild(price);

        card.appendChild(container);

        productContainer.appendChild(card);
    }
}

// 获取并显示产品
fetchProducts();

function filterProduct(value) {
    // 按钮类代码
    let buttons = document.querySelectorAll(".button-value");
    buttons.forEach((button) => {
        // 检查值是否等于 innerText
        if (value.toUpperCase() == button.innerText.toUpperCase()) {
            button.classList.add("active-cat");
        } else {
            button.classList.remove("active-cat");
        }
    });

    // 选择所有卡片
    let elements = document.querySelectorAll(".card");
    // 循环遍历所有卡片
    elements.forEach((element) => {
        // 在单击“all”按钮时显示所有卡片
        if (value == "all") {
            element.classList.remove("hide");
        } else {
            // 检查元素是否包含类别类
            if (element.classList.contains(value)) {
                // 基于类别显示元素
                element.classList.remove("hide");
            } else {
                // 隐藏其他元素
                element.classList.add("hide");
            }
        }
    });
}

window.onload = () => {
    filterProduct("all");
};
英文:

The window.onload function that I have on my code sometimes work but when I reload or re run the html, it stops working. I don't know what's the problem... Here's my entire javascript code

const productsJsonFile = &#39;../products.json&#39;;
// Function to fetch and display products
async function fetchProducts() {
try {
const response = await fetch(productsJsonFile);
const products = await response.json();
displayProducts(products);
} catch (error) {
console.error(&#39;Error fetching products:&#39;, error);
}
}
// Function to display products
function displayProducts(products) {
let productContainer = document.getElementById(&quot;products&quot;);
for (let product of products) {
// Create card element
let card = document.createElement(&quot;div&quot;);
card.classList.add(&quot;card&quot;);
//Card should have category and should stay hidden initially
card.classList.add(&quot;card&quot;, product.category, &quot;hide&quot;);
// Create image container
let imgContainer = document.createElement(&quot;div&quot;);
imgContainer.classList.add(&quot;image-container&quot;);
// Create image element
let image = document.createElement(&quot;img&quot;);
image.setAttribute(&quot;src&quot;, product.image);
imgContainer.appendChild(image);
card.appendChild(imgContainer);
// Create container for product details
let container = document.createElement(&quot;div&quot;);
container.classList.add(&quot;container2&quot;);
// Create product name element
let name = document.createElement(&quot;h5&quot;);
name.classList.add(&quot;product-name&quot;);
name.innerText = product.name.toUpperCase();
container.appendChild(name);
// Create rating element
let rating = document.createElement(&quot;div&quot;);
rating.classList.add(&quot;rating&quot;);
for (let i = 1; i &lt;= 5; i++) {
let starIcon = document.createElement(&quot;i&quot;);
starIcon.classList.add(&quot;fa&quot;);
if (i &lt;= product.rating) {
starIcon.classList.add(&quot;fa-star&quot;);
} else if (i - 0.5 === product.rating) {
starIcon.classList.add(&quot;fa-star-half-o&quot;);
} else {
starIcon.classList.add(&quot;fa-star-o&quot;);
}
rating.appendChild(starIcon);
}
container.appendChild(rating);
// Create price element
let price = document.createElement(&quot;h6&quot;);
price.classList.add(&quot;price&quot;);
price.innerText = &quot;Php &quot; + product.price + &quot;.00&quot;;
container.appendChild(price);
card.appendChild(container);
// Create anchor element
// let anchor = document.createElement(&quot;a&quot;);
// anchor.setAttribute(&quot;href&quot;, &quot;#&quot;);
// anchor.appendChild(card);
productContainer.appendChild(card);
}
}
// Fetch and display products
fetchProducts();
function filterProduct(value) {
//Button class code
let buttons = document.querySelectorAll(&quot;.button-value&quot;);
buttons.forEach((button) =&gt; {
//check if value equals innerText
if (value.toUpperCase() == button.innerText.toUpperCase()) {
button.classList.add(&quot;active-cat&quot;);
} else {
button.classList.remove(&quot;active-cat&quot;);
}
});
//select all cards
let elements = document.querySelectorAll(&quot;.card&quot;);
//loop through all cards
elements.forEach((element) =&gt; {
//display all cards on &#39;all&#39; button click
if (value == &quot;all&quot;) {
element.classList.remove(&quot;hide&quot;);
} else {
//Check if element contains category class
if (element.classList.contains(value)) {
//display element based on category
element.classList.remove(&quot;hide&quot;);
} else {
//hide other elements
element.classList.add(&quot;hide&quot;);
}
}
});
}
window.onload = () =&gt; {
filterProduct(&quot;all&quot;);
};

I really don't know how to fix it no matter how many times I researched for a way. I can't find any solution. Please help

答案1

得分: 1

以下是翻译好的部分:

我猜 - window.onload 在你的 fetchProducts() 执行之前就触发了。所以,请将最后一行改成这样:

window.onload = async () => {
    await fetchProducts();
    filterProduct("all");
};

并且在全局范围内移除 fetchProducts(); 的调用。

英文:

My guess is - window.onload fires before your fetchProducts() does its thing.

so change the last line with this

window.onload = async () =&gt; {
    await fetchProducts();
    filterProduct(&quot;all&quot;);
};

and remove the fetchProducts(); call in the global scope.

huangapple
  • 本文由 发表于 2023年6月5日 04:19:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/76402253.html