js观察者模式的弹幕案例


Posted in Javascript onNovember 23, 2020

本文实例为大家分享了js观察者模式的弹幕案例代码,供大家参考,具体内容如下

观察者模式的弹幕案例

上代码

js观察者模式的弹幕案例

弹幕.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    input{
    
      width:1208px;
      height: 38px;
      font-size: 30px;
      position: absolute;
    }
    .div0{
      width:1208px;
      height: 768px;
      position: relative;
      overflow: hidden;
    }
    video{
    width:1208px;
      height: 720px;
    }
  </style>
</head>
<body>
  <div class="div0">
    <video src="./y2mate.com - nylonjapan11_wjhIR0JdoXA_1080p.mp4" controls></video>
    <br>
   
    <input type="text">
  </div>
  <script type="module">
    import Bullet from "./observer/Bullet.js";//导入模块
    var input=document.querySelector("input");
    document.addEventListener("keyup",keyHandler);
//input的键盘监听事件按回车实例化BUllet
    function keyHandler(e){
      if(e.keyCode!==13) return;
      if(input.value.trim().length===0) return;
      var bullet=new Bullet(input.value);
      bullet.appendTo(".div0");
      input.value="";
    }
  </script>
</body>
</html>

bullet.js:

import TimeManager from "./TimeManager.js";//导入观察者

export default class Bullet {
  rect;
  x;
  speed = 2;
  width;
  constructor(txt) {
    this.elem = this.createElem(txt);
  }
  //创建弹幕
  createElem(txt) {
    if (this.elem) return this.elem;
    var div = document.createElement("div");
    Object.assign(div.style, {
      whiteSpace: "nowrap",
      position: "absolute",
    })
    div.textContent = txt
    return div;
  }
  //将弹幕随机位置插入视屏中并且将弹幕插入到观察者中的list数组中
  appendTo(parent) {
    if (typeof parent === "string") parent = document.querySelector(parent);
    parent.appendChild(this.elem);
    this.rect = parent.getBoundingClientRect();
    Object.assign(this.elem.style, {
      top: Math.random() * this.rect.height / 4 + "px",
      left: this.rect.width + "px"
    });
    this.x = this.rect.width;
    this.width = this.elem.offsetWidth;
    TimeManager.instance.add(this);
  }
  //使弹幕移动,并给限制如果弹幕移出视频,则在list中删除此元素
  update() {
    if (!this.width) return;
    this.x -= this.speed;
    this.elem.style.left = this.x + "px";
    if (this.x < -this.width) {
      TimeManager.instance.remove(this);
      this.elem.remove();
      this.elem = null;
    }
  }
}

TimeManager.js:

export default class TimeManager {
  static _instance
  list = new set()//设置一个set类型的变量
  ids
  constructor() {

  }
  static get instance() {
    //设置一个静态方法,此为单例模式,
    if (!TimeManager._instance) {
      Object.defineProperty(TimeManager, '_instance', {
        value: new TimeManager()
      })//给TimeManager设置属性如果没有则赋值为实例并保存,有则直接给保存的实例
    }
    return TimeManager._instance;
  }
  //将带入的变量加入到list中如果list中有元素时则没16ms调用updata方法
  add(elem) {
    this.list.add(elem)
    if (this.list.size > 0 && !this.ids) {
      this.ids = setInterval(() => this.updata(), 16)
    }
  }
  //将带入的变量从list中删除,如果list中没有变量了就将定时器关闭,销毁定时器
  remove(elem) {
    this.list.delete(elem)
    if (this.list.size === 0 && this.ids) {
      clearInterval(this.ids)
      this.ids = undefined
    }
  }
  //遍历所有list里的元素,如果元素带有updata方法,则调用updata方法
  updata() {
    this.list.forEach(item => {
      if (item.updata) item.updata
    })
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery struts 验证唯一标识(公用方法)
Mar 27 Javascript
浅谈JavaScript函数参数的可修改性问题
Dec 05 Javascript
javascript实现Table排序的方法
May 15 Javascript
超赞的动手创建JavaScript框架的详细教程
Jun 30 Javascript
Javascript实现图片不间断滚动的代码
Jun 22 Javascript
微信小程序 wx:key详细介绍
Oct 28 Javascript
Angular.js实现注册系统的实例详解
Dec 18 Javascript
Vue常用指令V-model用法
Mar 08 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
vue生命周期的探索
Apr 03 Javascript
微信小程序实现上传照片代码实例解析
Aug 04 Javascript
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
js异步接口并发数量控制的方法示例
Nov 22 #Javascript
Vue实现购物小球抛物线的方法实例
Nov 22 #Vue.js
ES6学习教程之Promise用法详解
Nov 22 #Javascript
Node.js文本文件BOM头的去除方法
Nov 22 #Javascript
JavaScript手写数组的常用函数总结
Nov 22 #Javascript
JavaScript实现点击图片换背景
Nov 20 #Javascript
JavaScript实现鼠标经过表格某行时此行变色
Nov 20 #Javascript
You might like
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
2015/03/04 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
2017/03/08 Javascript
JS实现两周内自动登录功能
2017/03/23 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
python归并排序算法过程实例讲解
2020/11/04 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
软件测试英文面试题
2012/10/14 面试题
如何在Shell脚本中使用函数
2015/09/06 面试题
销售实习自我鉴定
2013/12/07 职场文书
仓库主管岗位职责
2014/03/02 职场文书
法制演讲稿
2014/09/10 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
党员个人年度总结
2015/02/14 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
社区结对共建协议书
2016/03/23 职场文书
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技
GO中sync包自由控制并发示例详解
2022/08/05 Golang