网站上线后出现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绑定
如果需要统一管理事件绑定,可以按以下方式修改:
- 给点赞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;">
- JS中统一绑定事件:
// 页面DOM加载完成后绑定所有点赞按钮的点击事件 document.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('.like-btn').forEach(btn => { btn.addEventListener('click', like_post); }); });
内容的提问来源于stack exchange,提问作者rustyrice23
相关产品推荐
相关产品推荐

