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 插件实现图片延迟加载效果代码
Feb 06 Javascript
jQuery each()方法的使用方法
Mar 18 Javascript
jQuery控制图片的hover效果(smartRollover.js)
Mar 18 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
Jan 30 Javascript
JavaScript使用循环和分割来替换和删除元素实例
Oct 13 Javascript
jQuery层动画定位滑动效果的方法
Apr 30 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
Sep 06 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
如何解决vue在ios微信&quot;复制链接&quot;功能问题
Mar 26 Javascript
JavaScript自定义超时API代码实例
Apr 30 Javascript
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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
jquery ajax执行后台方法
2010/03/18 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
django允许外部访问的实例讲解
2018/05/14 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
python 字典的打印实现
2019/09/26 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
Django在Model保存前记录日志实例
2020/05/14 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
python函数超时自动退出的实操方法
2020/12/28 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
教师求职自荐信
2014/03/09 职场文书
校庆标语集锦
2014/06/25 职场文书
教师师德考核自我评价
2014/09/13 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
地雷战观后感
2015/06/09 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
详解Python如何批量采集京东商品数据流程
2022/01/22 Python
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android