forEach

 這個錯誤訊息 "Uncaught TypeError: tablinks.forEach is not a function" 表示 tablinks 這個變數,它看起來像是一個 DOM 元素的集合,但是它並沒有 forEach 這個方法。

document.getElementsByClassName 返回的是一個 HTMLCollection,而不是一個 ArrayHTMLCollection 沒有 forEach 方法。

要解決這個問題,你有幾個選擇:

  1. HTMLCollection 轉換為 Array
    你可以使用 Array.from() 或展開運算符 ... 來將 HTMLCollection 轉換為真正的陣列,然後再使用 forEach

        window.addEventListener('load', () => {
        const tablinks = document.getElementsByClassName('tablinks');
        // 轉換為陣列
        Array.from(tablinks).forEach(tablink => {
            tablink.addEventListener('click', () => {
                openPage(tablink, tablink.dataset.pagename);
            });
        });
        createDailyPage();
        document.getElementById("DefaultOpen").click();
    });
      

    或者使用展開運算符:

        window.addEventListener('load', () => {
        const tablinks = [...document.getElementsByClassName('tablinks')];
        tablinks.forEach(tablink => {
            tablink.addEventListener('click', () => {
                openPage(tablink, tablink.dataset.pagename);
            });
        });
        createDailyPage();
        document.getElementById("DefaultOpen").click();
    });
      
  2. 使用 for 迴圈
    HTMLCollection 雖然不是陣列,但你可以像陣列一樣使用傳統的 for 迴圈來迭代它。

        const tablinks = document.getElementsByClassName('tablinks');
        for (let i = 0; i < tablinks.length; i++) {
            const tablink = tablinks[i];
            tablink.addEventListener('click', () => {
                openPage(tablink, tablink.dataset.pagename);
            });
        }
        createDailyPage();
        document.getElementById("DefaultOpen").click();
    });
      
  3. 使用 document.querySelectorAll (推薦):
    document.querySelectorAll 返回的是一個 NodeList,它在現代瀏覽器中是支援 forEach 方法的。這是處理多個元素時更現代且常見的方法。

        window.addEventListener('load', () => {
        const tablinks = document.querySelectorAll('.tablinks'); // 注意這裡使用了 CSS 選擇器 '.'
        tablinks.forEach(tablink => {
            tablink.addEventListener('click', () => {
                openPage(tablink, tablink.dataset.pagename);
            });
        });
        createDailyPage();
        document.getElementById("DefaultOpen").click();
    });
      

總結一下,最推薦的解決方案是使用 document.querySelectorAll('.tablinks'),因為它更現代且直接支援 forEach

留言

這個網誌中的熱門文章

Offscreen Canvas

外部網頁新增 Google 日曆行程(URL模板)

計算 Canvas 文字最大字體