jabbany / CommentCoreLibrary

Javascript Live Comment (Danmaku) Engine Implementation. JS弹幕模块核心,提供从基本骨架到高级弹幕的支持。
http://jabbany.github.io/CommentCoreLibrary/demo
MIT License
1.9k stars 304 forks source link

如何实现鼠标悬停至单个弹幕暂停移动 #136

Closed VirusYu closed 2 years ago

VirusYu commented 2 years ago

源码中发现以下代码,是否可以通过添加弹幕的唯一标识,来过滤runline中的弹幕,找到对应实例后执行stop呢,stop后如何重新开始移动呢

CommentManager.prototype.stop = function() {
    this._stopTimer()
    // Send stop signal to all comments
    this.runline.forEach(function(c) {
      c.stop()
    })
  }
dbFlower commented 2 years ago

已收到

VirusYu commented 2 years ago

又仔细看了下源码,stop方法没有实现啊……直接是个空函数……

jabbany commented 2 years ago

哦,悬停这个的话,可以这么做:

var dummyTime = function () { }; // 空函数,让弹幕无视播放器推动

cm.addEventListener('enterComment', function(cmt){
  // 监听 CommentManager 的 enterComment 事件
  // 此事件在每个弹幕初始化完毕后实现
  cmt.dom.addEventListener('click', function () {
    // 抓出弹幕对应的dom元素,监听点击事件
    if (cmt.border) {
      // 这里我们用边框记录状态,如果已有边框则恢复弹幕运行
      cmt.time = cmt._oldTime.bind(cmt); // 恢复记住的原始推动方法
      cmt.border = false;  // 关掉边框
      cmt.time(0);  // 触发推动
    } else {
      cmt._oldTime = cmt.time; // 记住弹幕的推动方法
      cmt.time = dummyTime;  // 换成一个空函数,无视播放器推动
      cmt.border = true; // 打开边框
      cmt.stop();  // 触发停止函数(用于停止基于css的弹幕)
    }
  });
});

想测试效果的话,可以打开demo页面,选择顶栏的 【Code】标签,然后在 Input Window 区域粘贴下方代码,点击【Run】 之后回到 【Main】标签,随便一个 demo。

之后播放期间内,点击弹幕就会把它停住(并且显示边框),再点一下则会重新开始弹幕移动。

VirusYu commented 2 years ago

你好,我看文档中存在 remove方法,但是在源码中没有发现原型上存在remove方法

remove(data:ICommentData) 从弹幕列表中删除弹幕。注意参数data必须是同一个实例引用,否则即使参数都一样也不会导致弹幕被删除。 删除只会从时间轴中删除,如果被删除的弹幕正再播放,不会导致正在播放的弹幕消失。 remove(filterFunction:Function) 从弹幕列表中删除弹幕。filterFunction会在每个弹幕对象上被调用。当filterFunction返回 true 时(严格),删除相应弹幕。

jabbany commented 2 years ago

remove系列还没在现在用的版本实现呢,文档是给1.0预留的API。。。目前计划是把剩余还是传统 js 写的几个类(CommentManager等)换到TS里面,但是ts那边还没写完(主要是出于考虑各种类型),所以就一直也没加进去。