HTML5 WebSocket
在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)"><<</button>
<button id="play" onclick="vidplay()">暂停</button>
<button id="fastFwd" onclick="skip(3)">>></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的更多相关文章
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
- 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
- 使用 HTML5 webSocket API实现即时通讯的功能
project下载地址:http://download.csdn.net/detail/wangshuxuncom/6430191 说明: 本project用于展示怎样使用 HTML5 webSock ...
- HTML5 WebSocket和后端C#通信
1.使用 HTML5 开发离线应用 http://www.ibm.com/developerworks/cn/web/1011_guozb_html5off/ 2.利用html 5 websocket ...
- python与html5 websocket开发聊天对话窗
1.下载必须的包 https://github.com/Pithikos/python-websocket-server,解压缩并把文件夹名‘python-websocket-server-maste ...
- 浅谈HTML5 WebSocket的机制
回想上一章 在上一章<为什么我们须要HTML5 WebSocket>中,我简单的介绍了下WebSocket的前世今生.相信大家已对WebSocket有了初步的了解.那么今天我们继续深入学习 ...
- 【HTML5 WebSocket】WebSocket对象特性和方法
<HTML5 WebSocket权威指南>学习笔记&3 WebSocket方法的对象特性 1. WebSocket方法 a. send方法 send方法用于在WebSocket连接 ...
- [转]使用 HTML5 WebSocket 构建实时 Web 应用
HTML5 WebSocket 简介和实战演练 本文主要介绍了 HTML5 WebSocket 的原理以及它给实时 Web 开发带来的革命性的创新,并通过一个 WebSocket 服务器和客户端的案例 ...
- 让ie6 7 8 9支持原生html5 websocket
让ie6 7 8 9支持原生html5 websocket 从github上的 web-socket-js(socket.io好像也是用这个做的他们的flash替代传输方式)改过来的.不过值得 ...
- 使用 HTML5 WebSocket 构建实时 Web 应用
原文地址:http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/ HTML5 WebSocket 简介和实战演练 本文主要介绍 ...
随机推荐
- Android二维码的生成,解析以及扫描功能
<1> 布局只有2个按钮,实现生成二维码和解析二维码 <Button android:layout_width="wrap_content" android:la ...
- WPF之自定义控件
1.先定义画刷,一般存为资源字典 格式: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml ...
- appium 自动化测试之知乎Android客户端
appium是一个开源框架,相对来说还不算很稳定.转载请注明出处!!!! 前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:http://www.cnblogs.com/tobecraz ...
- Sublime Text:Windows下配置C 编译环境和GDB调试环境
写此文解决两个问题: 1.在Sublime Text中实现编译运行含有外部输入的C程序(如含有scanf的程序); 2.在程序运行完毕后不退出cmd,能继续用gdb调试程序. 一.MinGW 下载地址 ...
- LINUX下YUM源配置
转自:http://www.cnblogs.com/phoebus0501/archive/2010/12/14/1906144.html 1.确保RHEL5中已经安装了yum [root@lvs-m ...
- 【mongo】mongoVUE使用
1.查询存在字段"test"的项 {"test":{$exists:true}} 2.在表中插入字段 {$set:{"}} 3.正则匹配 {" ...
- tp框架实现验证码
今天来看一个小插件. tp框架是怎么实现验证码的. 又到了我们千篇一律的时候了,首先呢,先做一个用来显示的html界面名为:zhuce.html <!DOCTYPE html PUBLIC &q ...
- Linux 系统中堆栈的使用方法
本节内容概要描述了Linux内核从开机引导到系统正常运行过程中对堆栈的使用方式.这部分内容的说明与内核代码关系比较密切,可以先跳过.在开始阅读相应代码时再回来仔细研究. Linux 0.12系统中共使 ...
- Erlang--etc结构解析
Erlang中可以用List表达集合数据,但是如果数据量特别大的话在List中访问元素就会变慢了;这种主要是由于List的绝大部分操作都是基于遍历完成的. Erlang的设计目标是软实时(参考:htt ...
- Jquery知识点梳理
Jquery $代表选择器 JS 选取元素 操作内容 操作属性 操作样式 <div id="aa" style="width:100px; height:100px ...