在WebSocket API中,浏览器和服务器只需要做一个握手动作,然后,浏览器和服务器之间就形成一条快速通道,两者之间就可以直接进行数据传送,这一个功能可以应用到“字幕”,自己做了一个demo,废话不说了,直接贴代码:

 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>弹幕</title>
</head>
<script type="text/javascript" src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script>
<style type="text/css">
#Barrage{
width:800px;
height:400px;
margin:0 auto;
border:1px solid #000;
}
#Video1{
box-shadow: 10px 5px 5px black;
display: block;
}
</style>
<script type="text/javascript"> function vidplay() {
var video = document.getElementById("Video1");
var button = document.getElementById("play");
if (video.paused) {
video.play();
button.innerHTML = "||";
} else {
video.pause();
button.innerHTML = ">";
}
} function restart() {
var video = document.getElementById("Video1");
video.currentTime = 0;
} function skip(value) {
var video = document.getElementById("Video1");
video.currentTime += value;
} function makeBig(){
var video = document.getElementById("Video1");
video.width = 600;
}
</script> <body>
<div id="Barrage">
<video id="Video1" autoplay loop>
<source src="http://www.runoob.com/try/demo_source/mov_bbb.mp4" type="video/mp4">
<source src="http://www.runoob.com/try/demo_source/mov_bbb.ogg" type="video/ogg">
</video>
<div id="buttonbar" style="margin-left: 50px;margin-top: 20px">
<button id="restart" onclick="restart();">重播</button>
<button id="rew" onclick="skip(-3)">&lt;&lt;</button>
<button id="play" onclick="vidplay()">暂停</button>
<button id="fastFwd" onclick="skip(3)">&gt;&gt;</button>
<button onclick="makeBig()">放大</button>
</div>
</div>
</body>
<script type="text/javascript">
var that = this;
//舞台是全局变量
var stage = $('#Barrage');
//弹幕的总时间,这个是值得思考的问题,根据业务而已,这个不应该是一开始写死,因为是动态的弹幕,不过这里是为了测试方便,后面会修改
var totalTime = 9000;
//检测时间间隔
var checkTime = 1000;
//总飞幕数
var playCount = Math.ceil(totalTime / checkTime); var messages=[{
//从何时开始
time:0,
//经过的时间
duration:4292,
//舞台偏移的高度
top:10,
//弹幕文字大小
size:16,
//弹幕颜色
color:'#000',
//内容
text:'前方高能注意'
},{
//从何时开始
time:100,
//经过的时间
duration:6192,
//舞台偏移的高度
top:100,
//弹幕文字大小
size:14,
//弹幕颜色
color:'green',
//内容
text:'我准备追上前面那条',
},{
//从何时开始
time:130,
//经过的时间
duration:4192,
//舞台偏移的高度
top:90,
//弹幕文字大小
size:16,
//弹幕颜色
color:'red',
//内容
text:'遮住遮住遮住。。',
},{
//从何时开始
time:1000,
//经过的时间
duration:6992,
//舞台偏移的高度
top:67,
//弹幕文字大小
size:20,
//弹幕颜色
color:'blue',
//内容
text:'临水照影Testing....~~',
}]; //构造一个单独的弹幕
var BarrageItem = function(config){
//保存配置
this.config = config;
//设置样式,这里的样式指的是一个容器,它指包含了单个弹幕的基础样式配置的div
this.outward = this.mySelf();
//准备弹出去,先隐藏再加入到舞台,后面正式获取配置参数时会把一些样式修改。
this.outward.hide().appendTo(stage);
} //单个弹幕样式,从config中提取配置
BarrageItem.prototype.mySelf = function(){
//把配置中的样式写入
var outward = $('<div style="min-width:400px;font-size:'+this.config.size +'px;color:'+this.config.color+';">'+this.config.text+'</div>');
return outward;
} //定义弹的过程,这是弹幕的核心,而且一些高级扩展也是在这里添加 BarrageItem.prototype.move = function(){
var that = this;
var outward = that.outward;
var myWidth = outward.width();
//用jq自带animate来让它运动
outward.animate({
left: -myWidth
},that.config.duration,'swing',function(){
outward.hide(); //弹完我就藏起来
});
} //开始弹弹弹 BarrageItem.prototype.start = function(){
var that = this;
var outward = that.outward; //这里引用的还是原型中的那个outward
//开始之前先隐藏自己
outward.css({
position: 'absolute',
left: stage.width() + 'px', //隐藏在右侧
top:that.config.top || 0 , //如果有定义高度就从配置中取,否则就置顶
zIndex:10,//展示到前列
display: 'block'
}); //延迟时间由配置的开始时间减去队列中该弹幕所处的位置所需要等的位置,而这里的队列位置是由驱使者diretor分配的,事实上根据我的调试发现这种写法只能近似于模仿顺序,然而如果两个播放时间间隔不大将会同时出发,不过这个对于普通体验影响不大。后期如果有强需求可能需要把整个逻辑改掉
var delayTime = that.config.time - (that.config.queue - 1) * checkTime;
setTimeout(function(){
that.move();
},delayTime); } //设置一个支持事件机制的对象,也就是弹幕们的驱使者,它来驱使弹幕弹弹弹 var diretor = $({});//创建一个空的对象 //对舞台进行样式设置,其实可以直接写到css里面
stage.css({
position:'relative',
overflow:'hidden'
}); //批量读取写好的弹幕配置内容,然而后期是需要动态弹幕,打算采用websocket来分配因此这里也只是为了测试而简写 //that.messages 是配合vue的data来设置的,如果是为了在单个文件中引用,去掉that,把message写在该js里面 $.each(messages,function(k,config){
//确认弹出的时间
var queue = Math.ceil(config.time / checkTime);
config.queue = queue; //新建一个对象给它配置
var go = new BarrageItem(config);
//驱动者监听驱使动作
diretor.on(queue+'start',function(){
go.start();
})
}); var currentQueue = 0;
setInterval(function(){
//从队列中取第n个开始谈
diretor.trigger(currentQueue+'start');
//如果都弹完了 循环来一遍
if (currentQueue === playCount) {
currentQueue = 0;
}else{
currentQueue++;
} },checkTime);
</script> </html>

效果展示:

可以把代码copy出来,点击重播、暂停、快进、放大等功能试试效果,后续结合webSocket 的即时弹幕也会有所展示!

下班喽!!!!拜拜~~

HTML5 WebSocket的更多相关文章

  1. Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

  2. 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

  3. 使用 HTML5 webSocket API实现即时通讯的功能

    project下载地址:http://download.csdn.net/detail/wangshuxuncom/6430191 说明: 本project用于展示怎样使用 HTML5 webSock ...

  4. HTML5 WebSocket和后端C#通信

    1.使用 HTML5 开发离线应用 http://www.ibm.com/developerworks/cn/web/1011_guozb_html5off/ 2.利用html 5 websocket ...

  5. python与html5 websocket开发聊天对话窗

    1.下载必须的包 https://github.com/Pithikos/python-websocket-server,解压缩并把文件夹名‘python-websocket-server-maste ...

  6. 浅谈HTML5 WebSocket的机制

    回想上一章 在上一章<为什么我们须要HTML5 WebSocket>中,我简单的介绍了下WebSocket的前世今生.相信大家已对WebSocket有了初步的了解.那么今天我们继续深入学习 ...

  7. 【HTML5 WebSocket】WebSocket对象特性和方法

    <HTML5 WebSocket权威指南>学习笔记&3 WebSocket方法的对象特性 1. WebSocket方法 a. send方法 send方法用于在WebSocket连接 ...

  8. [转]使用 HTML5 WebSocket 构建实时 Web 应用

    HTML5 WebSocket 简介和实战演练 本文主要介绍了 HTML5 WebSocket 的原理以及它给实时 Web 开发带来的革命性的创新,并通过一个 WebSocket 服务器和客户端的案例 ...

  9. 让ie6 7 8 9支持原生html5 websocket

      让ie6 7 8 9支持原生html5 websocket   从github上的 web-socket-js(socket.io好像也是用这个做的他们的flash替代传输方式)改过来的.不过值得 ...

  10. 使用 HTML5 WebSocket 构建实时 Web 应用

    原文地址:http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/ HTML5 WebSocket 简介和实战演练 本文主要介绍 ...

随机推荐

  1. 上个项目的一些反思 III

    离线缓存 之前的项目因为实时性要求比较高,所以一打开客户端,就开始做网络请求.现在想想,是没有做内容的离线缓存.这个问题,我没意识到.产品经理也没有意识到... 我觉得Archiver,来做比较合适, ...

  2. kali 安装ss代理客户端的方法(纯属个人总结)

    1.声明版本,因为别的版本没测试过 2.下载客户端安装包 wget https://github.com/shadowsocks/shadowsocks/archive/master.zip 这个是代 ...

  3. 解决mysql Table ‘xxx’ is marked as crashed and should be repaired的问题。

    解决mysql Table 'xxx' is marked as crashed and should be repaired的问题. 某个表在进行数据插入和更新时突然出现Table 'xxx' is ...

  4. JqueryUI Dialog 加载动态页 部分页

    问题:使用JqueryUIDialog 加载部分页,可以弹出对话框,但是在操作页面上的按钮是提示"dialog"找不到,思路是,先取到部分页加载到要dialog的Div上,在dia ...

  5. ssdb binlog机制 存疑

    int BinlogQueue::del_range(uint64_t start, uint64_t end){ while(start <= end){ leveldb::WriteBatc ...

  6. ASP.NET SignalR入门

    前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM ...

  7. SecureCRT如何与Linux虚拟机进行关联

    首先在宿主机上确认虚拟网卡是否正确工作,并查看其IP地址,如本例中,宿主机的虚拟网卡VMnet8的IP地址为:192.168.121.1/24. VMnet8是VMware用于NAT连接的虚拟网卡. ...

  8. AgileEAS.NET SOA 中间件Web运行容器管理功能已全部开源,欢迎大家下载、使用、反馈

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  9. PowerDesigner导出SQL脚本

    1. 先创建E-R图模型

  10. 学习微信小程序之css7

    盒模型 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...