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 相关文章推荐
Javascript 浮点运算精度问题分析与解决
Mar 26 Javascript
JS 在指定数组中随机取出N个不重复的数据
Jun 10 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
Jan 23 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
Nov 21 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
Dec 08 Javascript
原生JS下拉加载插件分享
Dec 26 Javascript
javascript实现下雨效果
Mar 27 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
Aug 10 Javascript
用node.js写一个jenkins发版脚本
May 21 Javascript
VUE写一个简单的表格实例
Aug 06 Javascript
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 Javascript
封装Vue Element的table表格组件的示例详解
Aug 19 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
自己动手,丰衣足食 - 短波框形天线制作
2021/03/01 无线电
在数据量大(超过10万)的情况下
2007/01/15 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
php实现文件上传基本验证
2020/03/04 PHP
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
Linux下为不同版本python安装第三方库
2016/08/31 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
安装python及pycharm的教程图解
2019/10/10 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
python dict乱码如何解决
2020/06/07 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
策划主管的工作职责
2013/11/24 职场文书
党支部活动策划方案
2014/08/18 职场文书
红色电影观后感
2015/06/18 职场文书
公司人事管理制度
2015/08/05 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
小程序实现筛子抽奖
2021/05/26 Javascript
nginx+lua单机上万并发的实现
2021/05/31 Servers