HTML5 桌面布告:Notification API

原文地址:http://blog.gdfengshuo.com/article/23/

1. 率先是输入网址

前言

Notification API 是 HTML5 新增的桌面公告API,用于向用户显示公告新闻。该文告是脱离浏览器的,即便用户并未停留在现阶段标签页,甚至最小化了浏览器,该通告新闻也一致会置顶彰显出来。

  以 www.facebook.com 为例

用户权限

想要向用户浮现布告音信,必要取得用户权限,而同样的域名只要求得到一回权限。唯有用户同意的权杖下,Notification
才能起到功用,幸免某些网站的广告滥用 Notification
或别的给用户造成影响。那么咋样明白用户到底是允不允许的?

Notification.permission
该属性用于注明当前布告彰显的授权景况,可能的值包含:

  • default :不知晓用户的选项,默许。
  • granted :用户同意。
  • denied :用户拒绝。

    if(Notification.permission === ‘granted’){

    console.log('用户允许通知');
    

    }else if(Notification.permission === ‘denied’){

    console.log('用户拒绝通知');
    

    }else{

    console.log('用户还没选择,去向用户申请权限吧');
    

    }

  2. 浏览器查找域名对应 IP

呼吁权限

当用户还没采用的时候,大家须求向用户去哀求权限。Notification 对象提供了
requestPermission() 方法请求用户眼前发源的权位以突显公告。

原先基于回调的语法已经弃用(当然在前些天的浏览器中要么能用的),最新的正经已将此办法立异为根据promise 的语法:

Notification.requestPermission().then(function(permission) {
    if(permission === 'granted'){
        console.log('用户允许通知');
    }else if(permission === 'denied'){
        console.log('用户拒绝通知');
    }
});

  2. 1 DNS 查找进度:

推送通告

赢得用户授权之后,就足以推送通告了。

var notification = new Notification(title, options)

参数如下:

  • title:文告的标题
  • options:通告的设置选项(可选)。
    • body:文告的情节。
    • tag:代表通报的一个分辨标签,相同tag时只会打开同一个公告窗口。
    • icon:要在公告中显得的图标的URL。
    • image:要在公告中显示的图像的URL。
    • data:想要和通报关联的职务项目标数目。
    • requireInteraction:文告保持有效不自行关闭,默许为false。

还有一些别样的参数,因为用持续或者没什么用那里就没要求说了。

var n = new Notification('状态更新提醒',{
    body: '你的朋友圈有3条新状态,快去查看吧',
    tag: 'linxin',
    icon: 'http://blog.gdfengshuo.comvatar.jpg',
    requireInteraction: true
})

照会音讯的意义图如下:

葡京赌场网址 1

  浏览器缓存——浏览器会记录 DNS 一段时间(2-30 分钟不等,视浏览器而定)

闭馆文告

从上边的参数可以看来,并从未一个参数用来计划显示时长的。我想要它 3s
后活动关闭的话,那时可以调用 close() 方法来关闭布告。

var n = new Notification('状态更新提醒',{
    body: '你的朋友圈有3条新状态,快去查看吧'
})

setTimeout(function() {
    n.close();
}, 3000);

  系统缓存——浏览器里没找到 DNS 缓存,此事浏览器做一个系统调用(window
下是 gethostbyname)。如发现匹配则使用。(与此对应该 host
恶意威迫更改攻击)

事件

Notification 接口的 onclick属性指定一个事件侦听器来选取 click
事件。当点击布告窗口时会触发相应事件,比如打开一个网址,指点用户回到自己的网站去。

var n = new Notification('状态更新提醒',{
    body: '你的朋友圈有3条新状态,快去查看吧',
    data: {
        url: 'http://blog.gdfengshuo.com'
    }
})
n.onclick = function(){
    window.open(n.data.url, '_blank');      // 打开网址
    n.close();                              // 并且关闭通知
}

  路由器缓存——路由器也会有 DNS
缓存(缓存你上过的网站,所以有时候路由器需求展开 DNS 刷新)

行使场景

前边说那么多,其实就是为了用。那么到底哪些地点可以用到吧?

现行网站的消息提示,半数以上都是在新闻中央突显个新闻数量,然后发邮件告诉用户,这流程完全没有错。不过像本人这种用户,觉得人家点个赞,收藏一下都要发个邮件提示我,老是要去删邮件(性冷淡),我是觉得挺烦的竟然关闭了邮件提醒。

自然那里并不是说要用 Notification,毕竟它和邮件的功效完全分歧。

自身觉得相比较适合的是音讯网站。用户浏览新闻时,可以推送给用户实时资讯。以腾讯体育为例,它就动用了
Notification API。在页面中引入了一个
notification2017_v0118.js,有趣味可以看看外人是怎么成熟的运用的。

一进来页面,就取得授权,同时协调页面有个浮动框提示您允许授权。倘诺同意之后,就开首给您推送布告了。不过它在关门标签卡的时候,通告也会被关门,那是因为监听了页面
beforeunload 事件。

function addOnBeforeUnload(e) {
    FERD_NavNotice.notification.close();
}
if(window.attachEvent){
    window.attachEvent('onbeforeunload', addOnBeforeUnload);
} else {
    window.addEventListener('beforeunload', addOnBeforeUnload, false);
}

  ISP DNS 缓存——接下去是在 ISP(互联网服务提供商)的 DNS
服务器的缓存上找寻。

兼容

说到优良,自然是倒下一大片,而且各浏览器的突显也会有些异样。移动端的大致全倒,PC端的还好大多都能支撑,除了IE。所以使用前,必要先检查一下浏览器是否支持Notification。

  递归查找——DNS 缓存里没有的话,ISP DNS
服务器会先后从根域名服务器(root)、.com 顶级域名服务器、Facebook域名服务器获取 IP(一般缓存内都会有,所以这一步一般不会生出)

愈来愈多文章:https://github.com/lin-xin/blog

  2. 2 多 IP 域名 DNS 查询解决方案

  循环 DNS——单个域名、两个 IP 列表循环应对 DNS 查询

  负载均衡器——一个特定 IP
的载荷均衡服务器(例如:反向代理服务器)负责监听请求并转载给前面的五个服务器集群的某一个,已毕几个服务器负荷均衡

  地理 DNS——按照用户所处地理地点,再次来到不相同的 IP(应用:CDN)

  anycast——一个 IP 地址映射五个大体主机的路由技术

  3. 殡葬请求

  获得域名对应的 IP 后,就起来发送 HTTP (S)请求了.

  请求头详解:

  GET http://facebook.com/ HTTP/1.1

  Accept: application/x-ms-application, image/jpeg,
application/xaml+xml, […]

  User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1;
WOW64; […]

  Accept-Encoding: gzip, deflate

  Connection: Keep-Alive

  Host: facebook.com

  Cookie: datr=1265876274-[…]; locale=en_US; lsd=WW[…];
c_user=2101[…]

  请求告诉服务器:

  1. 自我要博取(GET) http://facebook.com/ (GET 的 URL)那么些页面

  2. Accept:我能经受那么些品种的公文

  3. 我利用的是何种操作系统上的哪些项目那么些版本的浏览器

  4. 肯定接受何种方式的压缩文件

葡京赌场网址,  5. 接连类型:短连接?长连接?

  6. 主机域名

  7. 发送存储在本机的 cookies 新闻给服务器

  除了发送获取请求,仍是可以发送提交响应请求(如:搜索时要把搜索的情节一并发放服务器举行处理(在伸手
URL 前边扩大一定的用户参数),以博取特定的内容)

  注意:URL 后边加斜杠与不加斜杠的分别(文件夹与单个文件的界别)

  http://www.facebook.com

  http://www.facebook.com/

  当大家输入 http://www.facebook.com 时,浏览器会自动添加斜杠,保证URL 的小心。

  当我们输入:http://www.facebook.com/folderOrFile 时,因为浏览器不掌握folderOrFile
到底是文件夹如故文件,所以无法自动添加斜杠。那时,浏览器就不加斜杠直接访问地址,服务器会响应一个重定向,结果造成四回不需求的抓手。

  4. 重定向

  当我们输入不完全的网址 http://www.facebook.com 时,或者网站迁移做了重定向设置时,服务器会进展一回重定向响应。

  下边是重定向之后回到的响应头:

  HTTP/1.1 301 Moved Permanently

  Cache-Control: private, no-store, no-cache, must-revalidate,
post-check=0,pre-check=0

  Expires: Sat, 01 Jan 2000 00:00:00 GMT

  Location: http://www.facebook.com/

  P3P: CP=”DSP LAW”

  Pragma: no-cache

  Set-Cookie: made_write_conn=deleted; expires=Thu, 12-Feb-2009
05:09:50 GMT;

  path=/; domain=.facebook.com; httponly

  Content-Type: text/html; charset=utf-8

  X-Cnection: close

  Date: Fri, 12 Feb 2010 05:09:51 GMT

  Content-Length: 0

  1. 301 永久重定向

  2. 新的 Location:……

  为啥要重定向,而不间接重临用户想看的始末吧?(既然服务器已经因此重定向知道了用户必要哪些)

  答:原因之一:与寻找引擎名次有关。你看,即便一个页面有几个地点,就好像 http://www.igoro.com/ 和 http://igoro.com/,搜索引擎会认为它们是七个网站,结果导致每一个的追寻链接都缩减从而下降排行。而寻找引擎知道
301 永久重定向是怎么样看头,这样就会把走访带 www 的和不带 www
的地点归到同一个网站排行下。

  5. 新的请求

  重定向之后会发表一个新的得到请求

  6. 服务器处理请求

  6. 1 web 服务器软件

  服务器操作系统连串:Linux(一般是厂家按照开源定制)、windows server
序列(微软)

  主要的服务器软件:IIS、Apache、汤姆cat、JBOSS、Nginx、lighttpd、Tetty

  服务器软件的成效:接收、处理与响应请求(明白 CGI 的效率)

  6. 2 甩卖流程:

  web 服务器软件(如 IIS 或者 Apache)接收到 HTTP 请求

  确定实施那么些请求处理程序(一个能读懂请求并且能生成 HTML
来拓展响应的次序)(例如:Asp.Net,PHP,RUBY……)来拍卖它

  请求处理器阅读请求头的参数和 cookies 新闻

  更新服务器上的音信:例如更新数据库新闻、服务端 cookies

  生成 HTML,压缩(gzip 或其余),响应请求发送给用户

  7. 服务器发回一个 HTML 响应

  响应包涵响应头(响应参数与新闻)、响应包(主体文件)

  响应包选择一定措施压缩,整个响应以 blob
类型传输,响应头提示响应包以何种方法裁减

  这几个响应头与重定向的响应头不太相同,那几个响应头还带有着缓存选项,cookies
设置和隐衷音信等

  8. 浏览器初叶呈现 HTML

  浏览器在从来不完全接收全部 HTML 文件,就早已上马展示页面了

  9. 浏览器获取其它文件

  浏览器解析 HTML
蒙受必要下载的文件时,便再也向服务器(CDN)发送获取文件的哀告。

  注意:

  1. 动态页面不可能缓存,静态文件允许浏览器进行缓存。

  2. 静态文件本地有缓存时直接从地点读取

  3.
伸手响应头内富含着静态文件保留的时限,浏览器知道下载的静态文件要静默保留多长时间。

  4. 响应头还会有静态文件的
ETag(相当于版本号),当浏览器发现呼吁的静态文件的响应头的 ETag
与现有的缓存文件不符时,便会再也向服务器获取静态文件。

  10. 浏览器发送异步(AJAX)请求

  web 2.0
的一大特色就是页面彰显完全后客户端依旧与服务器端保持联系(keep-alive)

  浏览器执行一定的 JS
代码会给服务器发送异步请求,获取最新的动态音信,使得页面能保持较新的状态。

  HTTP
是一个伸手-响应协议,唯有在客户端发送请求,服务器端才能做出响应,而无法主动把音讯依然文档发给客户由此,要想维持页面处于最新的意况,需求定时进行轮询(定时发送
AJAX 请求以立异页面内容)

  AJAX 请求非凡便于更改,且用户格外便于自己制作和殡葬 AJAX
请求,所以没有验证码的从未有过 IP
限制条件的投票就是一个小游戏了(参照工作室三回刷票:自己定义
IP,自己定时发送 AJAX 请求,然后票就哗哗的上了)。

  优化小方案:借使服务器被轮询时未尝新音讯,它就不理这些客户端。而当呼吁没有超时的景观下要是接到了该客户的新新闻,服务器就找到未到位的乞求,把新音讯作为响应发送给客户端(这样就无需频仍地响应请求了)

 

 

来自: www.jianshu.com