在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. yii2图片处理扩展yii2-imagine的使用

    示例控制器: <?php /** * 图片常用处理 * * 需要 yii/yii2-imagine 的支持 * php composer.phar require --prefer-dist y ...

  2. C#夯实基础之接口(《CLR via C#》读书笔记)

    一. 接口的类型 接口是引用类型.因此从值类型赋值给接口是需要装箱的.如下所示: class Program { static void Main(string[] args) { ISay catS ...

  3. Linux远程复制命令SCP

    scp test.json savo@yourdomain.com:/usr/share/nginx/test # 以上命令需配置好ssh

  4. javascript export excel

    <input type="button" onclick="tableToExcel('tablename', 'name')" value=" ...

  5. Ionic 常用插件

    ionic扩展插件 1.ionic-timepicker 时间选择 https://github.com/rajeshwarpatlolla/ionic-timepicker   2.ionic-da ...

  6. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  7. gdb调试

    ·代码(实验楼中的代码,改了部分数值)命名为test.c int g(int x) { return x + 7; } int f(int x) { return g(x); } int main(v ...

  8. python之platform模块

    python之platform模块 ^_^第三个模块从天而降喽!! 函数列表 platform.system() 获取操作系统类型,windows.linux等 platform.platform() ...

  9. Tomcat7.0+ web.xml问题

    Tomcat7+版本的web.xml都加上 <context-param> <param-name>webAppRootKey</param-name> <p ...

  10. 北漂的生活 - python 面试

    第一次来北京,先谈谈感受吧.都说北京的雾霾非常严重,可能是我来的时间短,暂时我还没有遇到特别恶劣的天气,感觉还是很美好的.和朋友住在顺义,出去一次真的远啊,旁边暂时还没有找到清真的饭馆(本人少数民族) ...