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 相关文章推荐
匹配任意字符的正则表达式写法
Apr 29 Javascript
上传的js验证(图片/文件的扩展名)
Apr 25 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
Oct 16 Javascript
深入理解jQuery事件绑定
Jun 02 Javascript
js css实现垂直方向自适应的三角提示菜单
Jun 26 Javascript
vue实现ToDoList简单实例
Feb 07 Javascript
浅析JS中回调函数及用法
Jul 25 Javascript
使用taro开发微信小程序遇到的坑总结
Apr 08 Javascript
vue动态配置模板 'component is'代码
Jul 04 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
Jun 01 Javascript
echarts浮动显示单位的实现方法示例
Dec 04 Javascript
JavaScript实现打字游戏
Feb 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
PHP学习之PHP表达式
2006/10/09 PHP
PHP获取表单textarea数据中的换行问题
2010/09/10 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
php实现的http请求封装示例
2016/11/08 PHP
PHP-X系列教程之内置函数的使用示例
2017/10/16 PHP
JMenuTab简单使用说明
2008/03/13 Javascript
js 文件引入实现代码
2010/04/23 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
vue生命周期与钩子函数简单示例
2019/03/13 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
python 正则式使用心得
2009/05/07 Python
python集合用法实例分析
2015/05/30 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
解析Python中while true的使用
2015/10/13 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
python hook监听事件详解
2018/10/25 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
Python如何转换字符串大小写
2020/06/04 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
微笑面对生活演讲稿
2014/09/23 职场文书
运动会宣传稿100字
2015/07/23 职场文书