如何解决网站上线后出现的Uncaught ReferenceError: like_post未定义报错
错误原因
你遇到的Uncaught ReferenceError: like_post is not defined报错核心原因是:like_post函数定义在window.onload的局部作用域内,行内onclick属性绑定的事件会默认在全局作用域查找函数,自然找不到。公网环境资源加载速度慢于本地,用户更容易在页面未完全加载、函数还未定义时点击按钮,所以仅在公网触发报错。
修改方案
第一步:修改HTML代码
删除a标签的onclick属性,新增class="like-btn"作为事件绑定的标记,修改后代码如下:
<a class="like-btn" 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代码
在原JS的window.onload回调函数末尾,新增addEventListener批量绑定事件的逻辑,修改后完整JS代码如下:
<script type="text/javascript"> window.onload = function() { function ajax_send(data, element) { var ajax = new XMLHttpRequest(); ajax.addEventListener('readystatechange', function() { if (ajax.readyState == 4 && ajax.status == 200) { response(ajax.responseText, element); } }); data = JSON.stringify(data); ajax.open("post", "<?= ROOT ?>ajax.php", true); ajax.send(data); } function response(result, element) { if (result != "") { var obj = JSON.parse(result); if (typeof obj.action != 'undefined') { if (obj.action == 'like_post') { var likes = ""; if (typeof obj.likes != 'undefined') { likes = (parseInt(obj.likes) > 0) ? '<svg fill="#1877f2" 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>' : '<svg fill="#626a70cf" 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>'; element.innerHTML = likes; } if (typeof obj.info != 'undefined') { var info_element = document.getElementById(obj.id); info_element.innerHTML = obj.info; } } } } } function like_post(e) { e.preventDefault(); var link = e.currentTarget.href; var data = {}; data.link = link; data.action = "like_post"; ajax_send(data, e.currentTarget); } // 新增逻辑:给所有点赞按钮绑定点击事件 document.querySelectorAll('.like-btn').forEach(btn => { btn.addEventListener('click', like_post); }); } </script>
修改后所有事件绑定逻辑都在window.onload的作用域内,可直接访问内部定义的like_post函数,无需将函数暴露到全局,同时兼容单条/多条帖子的点赞场景。
内容的提问来源于stack exchange,提问作者rustyrice23
相关产品推荐
相关产品推荐

