浅谈html5之sse服务器发送事件EventSource介绍


Posted in HTML / CSS onAugust 28, 2017

前言

我前面文章讲过数据大屏,里面的数据时时更新。还有时时更新的股票数据,Facebook/Twitter 更新、估价更新、新的博文、赛事结果等等,都需要数据时时更新。之前我们一般都是请求服务器,看看有没有可以更新的数据。html5提供了Server-Sent Events方法,通过服务器发送事件,更新能够自动到达。

Server-Sent Events使用

Server-Sent Events使用很简单,通过EventSource 对象来接受服务器端消息。有如下事件:

  • onopen 当通往服务器的连接被打开
  • onmessage 当接收到消息
  • onerror 当发生错误

检测 Server-Sent 事件支持

if(typeof(EventSource)!=="undefined")
{
  // 浏览器支持 Server-Sent
  // 一些代码.....
}
else
{
// 浏览器不支持 Server-Sent..
}

接收 Server-Sent 事件通知

var source=new EventSource("haorooms_sse.php");
source.onmessage=function(event)
{
    document.getElementById("result").innerHTML+=event.data + "<br>";
};

服务器端代码实例

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 

$time = date('r'); 
echo "data: The server time is: {$time}\n\n"; 
flush(); 
?>

链接事件和报错事件都加上

if(typeof(EventSource)!=="undefined")
{
    var source=new EventSource("server.php");
    source.onopen=function()
    {
         console.log("Connection to server opened.");
    };
    source.onmessage=function(event)
    {

        document.getElementById("result").innerHTML+=event.data + "<br>";
    };
    source.onerror=function()
    {
        console.log("EventSource failed.");
    };
}
else
{
    document.getElementById("result").innerHTML="抱歉,你的浏览器不支持 server-sent 事件...";
}

我们会发现,控制台打印如下:

浅谈html5之sse服务器发送事件EventSource介绍

不停的进入链接、和错误,详情请点击

那是因为php代码只是简单的echo,并没有连续输出,我们把上面php代码做如下改进

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 

$time = date('r'); 

  $i = 0;
  $c = $i + 100;
  while (++$i < $c) {
    echo "id: " . $i . "\n";
    echo "data: " . $time. ";\n\n";
    ob_flush();
    flush();
    sleep(1);
  }
?>

就不会出现不停错误了!

IE浏览器兼容解决方案

我们知道,IE浏览器并不支持EventSource,有如下解决方案:

引入

eventsource.min.js

就可以完美解决。可以查看其github地址:https://github.com/Yaffle/EventSource 结合nodejs使用也很方便,直接

npm install event-source-polyfill

就可以了。

github地址:https://github.com/confidence68/demoOfSocket/tree/master/serversent

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
详解CSS3伸缩布局盒模型Flex布局
Aug 20 HTML / CSS
css3实现可滑动跳转的分页插件示例
May 08 HTML / CSS
一款利用css3的鼠标经过动画显示详情特效的实例教程
Dec 29 HTML / CSS
CSS3 中filter(滤镜)属性使用详解
Apr 07 HTML / CSS
纯CSS3实现圆圈动态发光特效动画的示例代码
Mar 08 HTML / CSS
Html5移动端获奖无缝滚动动画实现示例
Jun 25 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
May 28 HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
Aug 01 HTML / CSS
HTML5 UTF-8 中文乱码的解决方法
Nov 18 HTML / CSS
HTML5 audio标签使用js进行播放控制实例
Apr 24 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
Mar 21 HTML / CSS
uniapp+Html5端实现PC端适配
Jul 15 HTML / CSS
HTML5实现可缩放时钟代码
Aug 28 #HTML / CSS
HTML5操作WebSQL数据库的实例代码
Aug 26 #HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
Aug 24 #HTML / CSS
HTML5中的拖放实现详解
Aug 23 #HTML / CSS
html5使用Drag事件编辑器拖拽上传图片的示例代码
Aug 22 #HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
Aug 18 #HTML / CSS
mui几种页面跳转方式对比总结概括
Aug 18 #HTML / CSS
You might like
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
PHP实现网上点歌(二)
2006/10/09 PHP
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
php获取远程文件内容的函数
2015/11/02 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
用户注册常用javascript代码
2009/08/29 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
Python标准库之Sys模块使用详解
2015/05/23 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
Django框架 信号调度原理解析
2019/09/04 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
python两个_多个字典合并相加的实例代码
2019/12/26 Python
python上selenium的弹框操作实现
2020/07/13 Python
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
党员个人思想汇报
2013/12/28 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang