TypeError: Cannot read properties of null (reading 'addEventListener')

796 阅读1分钟

粗心把代码顺序写错了 把引入的js文件放在了html文件的头部导致文档开始加载时先加载js文件,却找不到js包裹的选择器,所以报错监听不到
文档加载从上到下,一般先加载html,css等文件,等到文档对象加载完毕,js开始加载,如果顺序搞错先加载了js那它根本找不到dom对象,当然会报错

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>防抖</title>
</head>

<body>

    
    <script>
        const text = document.getElementById('btn')

        function debounce(fn, delay) {
            let timer;
            return function (...args) {
                if (timer) {
                    clearTimeout(timer)
                }
                timer = setTimeout(() => {
                    fn.apply(this, ...args)
                }, delay)
            }
        }

        function task() {
            console.log('task')
        }
        // 测试
        text.addEventListener('click', debounce(task, 3000))
    </script>
</body>
<input type="text" id="btn" placeholder="请输入"></input>
</html>

改正:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>防抖</title>
</head>

<body>

    <input type="text" id="btn" placeholder="请输入"></input>
    <script>
        const text = document.getElementById('btn')

        function debounce(fn, delay) {
            let timer;
            return function (...args) {
                if (timer) {
                    clearTimeout(timer)
                }
                timer = setTimeout(() => {
                    fn.apply(this, ...args)
                }, delay)
            }
        }

        function task() {
            console.log('task')
        }
        // 测试
        text.addEventListener('click', debounce(task, 3000))
    </script>
</body>
<input type="text" id="btn" placeholder="请输入"></input>
</html>