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

JavaScript实现鼠标悬停文字特效时遇Uncaught TypeError报错求助

问题分析与解决:鼠标悬停特效报错 Uncaught TypeError: Cannot set properties of null (setting 'onmouseover')

报错原因

你的JS脚本放在<head>标签内,浏览器加载页面时会优先执行<head>里的脚本,此时<body>中的<h1 id="header">元素还未被解析渲染,document.getElementById("header")返回null,自然无法给null设置onmouseover属性,导致报错。

解决方法

方法1:将脚本移到<body>末尾

把<script src="code.js"></script>放在</body>标签之前,确保脚本执行时目标DOM元素已经存在:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Kokice5</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body onload="startTime()">
    <p id="clock" style="text-align: center;" class="notranslate"></p>
    <h1 id="header" style="text-align: center; font-size: 15vw;" data-value="Kokice5">Kokice5</h1>
    <script src="code.js"></script> <!-- 移到此处 -->
</body>
</html>

方法2:用DOMContentLoaded事件包裹代码

在JS代码外层添加DOM加载完成的监听事件,确保DOM元素就绪后再执行逻辑:

document.addEventListener('DOMContentLoaded', function() {
    const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" // 补上缺失的字母S

    let interval = null;
    let ampm = 0;

    document.getElementById("header").onmouseover = event => {  
        let iteration = 0;
        
        clearInterval(interval);
        
        interval = setInterval(() => {
            event.target.innerText = event.target.innerText
            .split("")
            .map((letter, index) => {
                if(index < iteration) {
                    return event.target.dataset.value[index];
                }
                
                return letters[Math.floor(Math.random() * letters.length)] // 用letters.length替代硬编码62,避免字符数变化时出错
            })
            .join("");
                
            if(iteration >= event.target.dataset.value.length){ 
                clearInterval(interval);
            }
            
            iteration += 1 / 5;
        }, 25);
    }
});

方法3:给脚本添加defer属性

在<script>标签上添加defer属性,浏览器会在DOM解析完成后执行脚本,同时保持脚本在<head>中的位置:

<script src="code.js" defer></script>

额外优化提示

你的letters字符串中缺失了字母S(原字符串是ABCDEFGHIJKLMNOPQRTUVWXYZ),补上后随机字符池更完整;另外将Math.floor(Math.random() * 62)改为Math.floor(Math.random() * letters.length),避免后续修改字符池时需要手动调整数字,提升代码健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:20:26