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

网站上线后出现Cannot set properties of null (setting 'innerHTML')错误如何解决?

问题根因
  • 直接报错原因:你调试发现obj.id仅返回info_,说明后端返回的ID值为空,导致document.getElementById(obj.id)获取到null,调用innerHTML时抛出类型错误。该报错和onclick事件绑定方式没有关系。
  • 本地正常、公网异常的原因:like.ajax.php中使用固定索引$URL[5]、$URL[6]从链接中提取帖子ID,公网部署后ROOT常量对应的路径层级和本地不一致,URL拆分后的分段索引发生偏移,无法取到正确的ID值。
修复方案

1. 修复ID提取逻辑(彻底解决路径适配问题)

不再通过解析链接获取ID,直接通过自定义属性传递帖子ID,避免不同部署环境路径差异的影响:

修改HTML代码

给点赞按钮添加data-postid自定义属性存储帖子ID:

<a data-postid="<?php echo $ROW['postid']?>" onclick="like_post(event)" href="<?= ROOT ?>like/post/<?php echo $ROW['postid'] ?>" style="text-decoration:none;float:left;position:relative;top:2px;">
    <svg id="icon_like" fill="<?= $Like_color ?>" width="22" height="22" viewBox="0 0 24 24">
        <path d="M21.216 8h-2.216v-1.75l1-3.095v-3.155h-5.246c-2.158 6.369-4.252 9.992-6.754 10v-1h-8v13h8v-1h2l2.507 2h8.461l3.032-2.926v-10.261l-2.784-1.813zm.784 11.225l-1.839 1.775h-6.954l-2.507-2h-2.7v-7c3.781 0 6.727-5.674 8.189-10h1.811v.791l-1 3.095v4.114h3.623l1.377.897v8.328z" />
    </svg>
</a>

修改JS的like_post函数

直接从自定义属性取ID传给后端,无需传递整个链接:

function like_post(e) {
    e.preventDefault();
    var postId = e.currentTarget.dataset.postid;
    var data = {};
    data.post_id = postId;
    data.action = "like_post";
    ajax_send(data, e.currentTarget);
}

修改like.ajax.php的ID提取逻辑

删掉原来拆分URL的代码,直接取前端传递的post_id:

<?php
// 删掉以下原逻辑
// if(!empty($data->link)){
//     $URL = split_url_from_string($data->link);
// }
// $_GET['type'] = isset($URL[5]) ? $URL[5] : '';
// $_GET['id'] = isset($URL[6]) ? $URL[6] : '';

// 替换为以下代码
$_id = isset($data->post_id) ? htmlspecialchars($data->post_id, ENT_QUOTES) : '';
$_type = 'post'; // 点赞场景固定为post,若需要支持用户、评论点赞可额外加自定义属性传递类型

$_SESSION['mybook_userid'] = isset($_SESSION['mybook_userid']) ? $_SESSION['mybook_userid'] : 0;
// 后续原有逻辑不变

2. 添加空值判断增强鲁棒性

修改JS的response函数,操作DOM前先判断元素是否存在,避免异常场景下报错:

if (typeof obj.info != 'undefined') {
    var info_element = document.getElementById(obj.id);
    // 新增元素存在判断
    if(info_element) {
        info_element.innerHTML = obj.info;
    }
}

(可选)替换onclick为addEventListener绑定

如果需要统一管理事件绑定,可以按以下方式修改:

  1. 给点赞a标签添加统一类名like-btn,删掉onclick属性:
<a class="like-btn" data-postid="<?php echo $ROW['postid']?>" href="<?= ROOT ?>like/post/<?php echo $ROW['postid'] ?>" style="text-decoration:none;float:left;position:relative;top:2px;">
  1. JS中统一绑定事件:
// 页面DOM加载完成后绑定所有点赞按钮的点击事件
document.addEventListener('DOMContentLoaded', function() {
    document.querySelectorAll('.like-btn').forEach(btn => {
        btn.addEventListener('click', like_post);
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:15:05