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 相关文章推荐
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
Aug 21 Javascript
Bootstrap布局之栅格系统详解
Jun 13 Javascript
js替换字符串中所有指定的字符(实现代码)
Aug 17 Javascript
JavaScript设计模式之单体模式全面解析
Sep 09 Javascript
javascript实现的左右无缝滚动效果
Sep 19 Javascript
JavaScript浮点数及运算精度调整详解
Oct 21 Javascript
移动前端图片压缩上传的实例
Dec 06 Javascript
vue中路由参数传递可能会遇到的坑
Dec 07 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
Jan 09 Javascript
发布Angular应用至生产环境的方法
Dec 10 Javascript
Vue项目安装插件并保存
Jan 28 Javascript
详解ES6 Promise的生命周期和创建
Aug 18 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
substr()函数中文版
2006/10/09 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
Python列表解析配合if else的方法
2018/06/23 Python
如何优雅地处理Django中的favicon.ico图标详解
2018/07/05 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
keras topN显示,自编写代码案例
2020/07/03 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
销售总监工作职责
2013/11/21 职场文书
个人自我剖析材料
2014/02/07 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers