问题
「鹿角虫驿站」用的是Twikoo
评论系统,目前使用的版本是1.6.41
,但是博主发现,每次用户点击评论里的点赞和回复评论按钮,页面就会自动滑到最顶上,这显然是存在问题的。
看了眼代码,包裹回复评论按钮和点赞按钮的a
标签都是这样的:
<!-- 我的回复按钮外层的标签 -->
<a href="#" class="tk-action-link">
...
</a>
构思
我们知道,当在a
标签的href
属性是#
开头的时候,比如#foo
,点击该a
标签,页面就会跳转到当前页面id
为foo
的标签处,这是a
标签的点击事件触发的默认行为(Default Behavior)。
但如果#
后面没有内容,即href
属性就是#
时,页面就会跳转到顶部。
那么就有两种解决方案:
- 删去a标签href属性(博主选择了这种)
- 阻止a标签点击事件触发的默认行为
但是要让方案落地,还差一步。
由于评论不是一访问页面就加载出来的,只有当评论加载完了,我们才能访问到需要修改的a
标签,所以我们要使用Twikoo提供的钩子函数onCommentLoaded
:
twikoo.init({
......, //其他设置
onCommentLoaded: function () {
/*
评论加载成功后的回调函数。
发表评论后自动刷新评论时、加载下一页评论时,也会触发。
评论加载失败时不会触发。
*/
}
});
解决
Warning
注意:下面代码中
querySelectorAll
函数的参数内容可能并不符合你的代码逻辑,请自行修改。方案一:删去href
属性
简单地使用removeAttribute
函数就能完成。
twikoo.init({
......, //其他设置
onCommentLoaded: function () {
document.querySelectorAll("#twikoo a.tk-action-link")
.forEach((el)=>el.removeAttribute("href"));
}
});
方案二:阻止a
标签的默认行为
这里有三种写法,都可以阻止a
标签的默认行为
// 第一种写法
twikoo.init({
......, //其他设置
onCommentLoaded: function () {
document.querySelectorAll("#twikoo a.tk-action-link")
.forEach((el)=>el.setAttribute("href", "javascript:void(0);"));
}
});
// 第二钟写法
twikoo.init({
......, //其他设置
onCommentLoaded: function () {
document.querySelectorAll("#twikoo a.tk-action-link")
.forEach((el)=>el.setAttribute("onclick","event.preventDefault();"));
}
});
// 第三种写法
twikoo.init({
......, //其他设置
onCommentLoaded: function () {
document.querySelectorAll("#twikoo a.tk-action-link")
.forEach((el)=>{
el.addEventListener("click", function(event) {
event.preventDefault();
})
});
}
});
后话
博主在使用钩子函数解决这个问题之前,曾去过另外一个使用Twikoo
的博客园子里的日光取经,却未能发现博主Chlorine用来解决这个问题的代码(也可能是博主眼瞎,但至少是没看到过有onCommentLoaded
的使用痕迹)。
也就是说,这个问题存在不使用Twikoo
提供的钩子函数的解决办法 (总不能只有我碰到了这个问题吧) 。如果你知道什么,请在评论区告诉我,谢谢!