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 相关文章推荐
用js实现多域名不同文件的调用方法
Jan 12 Javascript
jquery等宽输出文字插件使用介绍
Sep 18 Javascript
js、css、img等浏览器缓存问题的2种解决方案
Oct 23 Javascript
js上传图片及预览功能实例分析
Apr 24 Javascript
JavaScript实现cookie的写入、读取、删除功能
Nov 05 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
Jan 27 Javascript
jquery 获取select数组与name数组长度的实现代码
Jun 20 Javascript
微信小程序 增、删、改、查操作实例详解
Jan 13 Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
浅谈vue中resetFields()使用注意事项
Aug 12 Javascript
详解如何在Javascript中使用Object.freeze()
Oct 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
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
javascript 自定义事件初探
2009/08/21 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
js字符串转成JSON
2013/11/07 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
Python中zip()函数用法实例教程
2014/07/31 Python
python中的字符串内部换行方法
2018/07/19 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
信号生成及DFT的python实现方式
2020/02/25 Python
英国电气世界:Electrical World
2019/09/08 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
c语言常见笔试题总结
2016/09/05 面试题
中专生学习生活的自我评价分享
2013/10/27 职场文书
高中政治教学反思
2014/01/18 职场文书
内勤主管岗位职责
2014/04/03 职场文书
庆元旦演讲稿
2014/09/15 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
老兵退伍标语
2014/10/07 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python
python实现简单聊天功能
2021/07/07 Python
Python 正则模块详情
2021/11/02 Python
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js