约 883 字
预计阅读 2 分钟
博客捉虫:Twikoo按钮点击滚动bug修复

「鹿角虫驿站」用的是Twikoo评论系统,目前使用的版本是1.6.41,但是博主发现,每次用户点击评论里的点赞和回复评论按钮,页面就会自动滑到最顶上,这显然是存在问题的。

看了眼代码,包裹回复评论按钮和点赞按钮的a标签都是这样的:

<!-- 我的回复按钮外层的标签 -->
<a href="#" class="tk-action-link">
    ...
</a>

我们知道,当在a标签的href属性是#开头的时候,比如#foo,点击该a标签,页面就会跳转到当前页面idfoo的标签处,这是a标签的点击事件触发的默认行为(Default Behavior)。

但如果#后面没有内容,即href属性就是#时,页面就会跳转到顶部。

那么就有两种解决方案:

  1. 删去a标签href属性(博主选择了这种)
  2. 阻止a标签点击事件触发的默认行为

但是要让方案落地,还差一步。

由于评论不是一访问页面就加载出来的,只有当评论加载完了,我们才能访问到需要修改的a标签,所以我们要使用Twikoo提供的钩子函数onCommentLoaded

twikoo.init({
  ......, //其他设置
  onCommentLoaded: function () {
    /*
    评论加载成功后的回调函数。
    发表评论后自动刷新评论时、加载下一页评论时,也会触发。
    评论加载失败时不会触发。
    */ 
  }
});
Warning
注意:下面代码中querySelectorAll函数的参数内容可能并不符合你的代码逻辑,请自行修改。

简单地使用removeAttribute函数就能完成。

twikoo.init({
  ......, //其他设置
  onCommentLoaded: function () {
    document.querySelectorAll("#twikoo a.tk-action-link")
        .forEach((el)=>el.removeAttribute("href"));
  }
});

这里有三种写法,都可以阻止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提供的钩子函数的解决办法 (总不能只有我碰到了这个问题吧) 。如果你知道什么,请在评论区告诉我,谢谢!

博客捉虫:Twikoo按钮点击滚动bug修复
https://changlecat.me/posts/twikoo-comment-button-bugfix/
作者
Changle_cat
发布于
2025-01-29