基础知识准备:

HTML5给我们提供了一个新的对象叫作:MutationObserver。为了兼容,还有WebKitMutationObserver、MozMutationObserver,挂靠在window下。


这个对象是干嘛的呢?
mutation:变化、变动、突变;
observer:观察者;
顾名思义,在DOM中,MutationObserver就是监听DOM变化的意思。


那么这个对象能够监听DOM的哪些变化呢?

  1. 子节点变化; ——–> childList
  2. 自身属性变化; ——–> attributes
  3. 自身的文本变化; ——–> characterData

以上三点呢是三大基本点。


至于这个对象怎么使用呢?很简单!

var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;var observer = new MutationObserver(function(mutations) {});

上面的代码中,就是new了一个对象,里面传个callback回调函数而已,就这么简单,这个回调函数干嘛的?该回调函数会在指定的DOM节点(目标节点)发生变化时被调用. 该回调函数有一个参数mutations,这个参数是个数组,数组里每个元素是对象(包含了若干个MutationRecord对象的数组)。


该对象有几个方法要知道:

observe( Node target, optional MutationObserverInit options );
ovserve(要观察的目标节点, 你要观察目标节点的哪些东西-对象);
//举个例子,给你个人(目标节点),你想观察这个人的哪些指标变动:体重、身高、小孩等等disconnect();//不再观察

好了,直接上个例子吧:

<!DOCTYPE html>
<html>
<head><title></title>
</head>
<body><div id="guoyu"></div><script type="text/javascript">var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver// 选择目标节点var target = document.querySelector('#guoyu');// 创建观察者对象,一旦目标节点发送变化,该回调立马执行var observer = new MutationObserver(function(mutations) {mutations.forEach(function(mutation) {console.log(mutation.type);});console.log(mutations);//看看callback参数到底是什么});// 配置观察选项:你想观察目标节点哪些项var config = {attributes: true,childList: true,characterData: true}// 传入目标节点和观察选项observer.observe(target, config);</script></body>
</html>

我们在id为”guoyu”的节点中添加一个节点,那么回调函数立马就会被触发执行:


看到了吧,我们在节点中插入一个子节点,立马触发了回调函数,并打印了我们想要的结果,而且改变的是childList。


再看一下,我这次把id给改了,看看有什么不同:


看到了吗,这次修改id属于属性的修改,打印出来的是attributes。


注: childList, attributes, 或者characterData三个属性中必须至少有一个为true.否则,会抛出异常”An invalid or illegal string was specified”.


下面呢,就着重介绍一下各个属性到底是啥意思!首先我们看看回调函数里的那个参数,这个参数上面说了是个数组,每个元素是个对象,具体名字参见上面截图。



我们在观察目标节点的时候,需要配置一个json对象,告诉浏览器我们要监听目标节点的哪些指标,比如:属性、子节点、文本、所有子孙节点等等。那么具体有哪些呢?


再举个例子吧,比如,我们既改变文本值,记录characterDataOldValue;又改变属性id的值,记录attributeOldValue。

<!DOCTYPE html>
<html>
<head><title></title>
</head>
<body><div id="old_guoyu">I'am old</div><script type="text/javascript">var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObservervar target = document.querySelector('#old_guoyu');var observer = new MutationObserver(function(mutations) {mutations.forEach(function(mutation) {console.log(mutation.type);});console.log(mutations); });var config = {attributes: true,childList: true,characterData: true,characterDataOldValue: true,//监听老的文本值attributeOldValue: true,//记录老的属性值subtree: true};observer.observe(target, config);</script></body>
</html>


看到没,此次我同时改变了文本值和属性值,回调函数执行了两次,一次是文本改变执行的,另一次是属性id改变执行的。说明MutationObserver准确的监听了所有的变化,并作出反应。


监听Facebook消息

有了上面的基础,我们就可以做很多有趣的东西。我们知道,每当有新的消息的时候,facebook会给你立即推送,但这是有前提的,你的软件必须和Facebook有合作,或者花钱买Facebook的服务消息推送。比如UC浏览器的海外版,UC浏览器就可以实时帮你推送Facebook的消息,因为UC和Facebook达成了合作,才会给你推送。


我们的突破口在Facebook首页的tab上,每当有新的消息,该主页上的tab会显示一个数字,只要我们实时监听到这个数字变化,就可以实时监听Facebook的消息,让你不用花钱也能实时获取消息提醒,这对于没有和Facebook达成合作协议的浏览器厂商十分有用。



前端可以使用原生JS实现对消息的实时监听,并把消息发送给浏览器客户端,浏览器客户端进行提醒,下面是一点跑除复杂业务需求的基本代码:

var MutationObserverMRN = window.MutationObserver || window.WebKitMutationObserver;
var observerM, targetM;
var observerR, targetR;
var observerN, targetN;
var configGYFBUI = {'characterData' : true,'characterDataOldValue' : true,'childList': true,'subtree' : true
};
function observerMessages(nodeId, type) {var idDiv = document.getElementById(nodeId);var parentM = (idDiv.childNodes[0].nodeName == 'A') ? idDiv.childNodes[0] : idDiv;targetM = parentM.querySelectorAll('span')[1];if (!observerM) {observerM = new MutationObserverMRN(function(mutations) {var strCount = (targetM.innerText == 'undefined') ? '0' : targetM.innerText;if (parseInt(strCount) > 0) {var url = 'https://m.facebook.com' + parentM.getAttribute('href');var href = window.location.href;var reg = /messages/;if (!reg.test(href)) {JSInterfaceManager.receiveFbNoti(type, url, strCount);}}});}observerM.observe(targetM, configGYFBUI);
}
function observerRequests(nodeId, type) {var idDiv = document.getElementById(nodeId);var parentR = (idDiv.childNodes[0].nodeName == 'A') ? idDiv.childNodes[0] : idDiv;targetR = parentR.querySelectorAll('span')[1];if (!observerR) {observerR = new MutationObserverMRN(function(mutations) {var strCount = (targetR.innerText == 'undefined') ? '0' : targetR.innerText;if (parseInt(strCount) > 0) {var url = 'https://m.facebook.com' + parentR.getAttribute('href');JSInterfaceManager.receiveFbNoti(type, url, strCount);}});}observerR.observe(targetR, configGYFBUI);
}
function observerNotifications(nodeId, type) {var idDiv = document.getElementById(nodeId);var parentN = (idDiv.childNodes[0].nodeName == 'A') ? idDiv.childNodes[0] : idDiv;targetN = parentN.querySelectorAll('span')[1];if (!observerN) {observerN = new MutationObserverMRN(function(mutations) {var strCount = (targetN.innerText == 'undefined') ? '0' : targetN.innerText;if (parseInt(strCount) > 0) {var url = 'https://m.facebook.com' + parentN.getAttribute('href');JSInterfaceManager.receiveFbNoti(type, url, strCount);}});}observerN.observe(targetN, configGYFBUI);
}
observerMessages('messages_jewel', 'messages');
observerRequests('requests_jewel', 'requests');
observerNotifications('notifications_jewel', 'notifications');

JavaScript:原生JS实现Facebook实时消息抓捕相关推荐

  1. JavaScript——原生js实现瀑布流

    瀑布流介绍及实现原理: 瀑布流是一种页面布局,页面上也有多等宽的块(块就页面内容),每一块都是绝对定位(absolute),每个块排列的方式如下:寻找现在高度最小的列,把该块定位到该列下方.需要知道, ...

  2. 原生Javascript/原生JS修改CSS样式的四种方式

    设置style var domName = document.querySelector('#domName'); domName.style.backgroundColor = '#aaa' 设置属 ...

  3. .NET Web实时消息后台服务器推送技术-GoEasy

    越来越多的项目需要用到实时消息的推送与接收,怎样用.NET实现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推 ...

  4. html 监听input输入框的值,利用原生JS实时监听input框输入值

    利用原生JS实时监听input框输入值 原生JS中可以使用oninput,onpropertychange,onchange oninput,onpropertychange,onchange的用法 ...

  5. 微信小程序 -- 原生JS集成腾讯IM实时聊天/实时音视频(踩坑及心得)

    原生JS集成腾讯IM实时聊天/实时音视频对话功能 一.腾讯IM集成 前期准备 实例创建及初始化 IM登录 收发消息 二.腾讯音视频实时互动 跑通demo 三.同时集成即时通讯IM 和 音视频直播的 坑 ...

  6. 蓝鸥原生JS:js的历史及JavaScript的优缺点

    蓝鸥原生JS:js的历史及JavaScript的优缺点 蓝鸥零基础学习HTML5-html+css基础 http://11824614.blog.51cto.com/11814614/1852769 ...

  7. 总结获取原生JS(javascript)的父节点、子节点、兄弟节点

    关于原生JS获取节点,一直是个头疼的问题,而且调用方法的名字又贼长了,所以我选择用JQ,好像跑题了-- 话不多说看代码 获取父节点 及 父节点下所有子节点(兄弟节点) <ul><li ...

  8. vue实现实时监听文本框内容的变化(最后一种为原生js)

    一.用watch方法监听这个变量. <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  9. html js轮播图无白链接,JavaScript:100%原生js实现左右切换的轮播图(无延迟加载)...

    简介这篇文章主要介绍了JavaScript:100%原生js实现左右切换的轮播图(无延迟加载)以及相关的经验技巧,文章约11114字,浏览量505,点赞数3,值得参考! *{ margin:0; pa ...

最新文章

  1. BoneCP 学习笔记
  2. bzoj1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
  3. 【刷题记录】杂题记录
  4. MFC让文档/视图结构程序支持滚动条
  5. Matlab图像处理创新实践-实验2【图像滤波基础(2)】
  6. 使用alertmanager对监控对象进行报警(微信)三
  7. 还在安装各种截图软件?Windows10自带的截图工具你会用吗?
  8. 重学java基础第一课:解决大家的疑问
  9. [bzoj1011] [HNOI2008]遥远的行星
  10. ES6-18:class类及其继承
  11. wordpress连接mysql数据库_安装wordpress连接mysql数据库问题
  12. linux系统命令行方式复制文件
  13. ruby 批量下载王者荣耀皮肤
  14. beta分布_浅谈分布之分布(beta分布)贝叶斯分析之1 精选
  15. 常用生物信息学格式介绍
  16. 弹弹堂手游语音服务器怎么连接,腾讯弹弹堂手游空间怎么进去 互动玩法攻略介绍...
  17. OPenAL 3D音效开发
  18. Codevs2491玉蟾宫
  19. 计算机专业征兵,计算机应用工程系征兵宣传大会顺利召开──保家卫国,学子应征...
  20. 洁净室(区)浮游菌检测方法操作规程标准

热门文章

  1. wordpress网站文章内容页模板主题开发制作教程
  2. 利用LDA和主题模型发现9种冠状病毒研究趋势
  3. 一生应该必看的20个故事
  4. 7-24 程序改错题3 (5 分)
  5. 安装gtsam遇到的错误
  6. 洛谷 5061 秘密任务——二分图染色
  7. 中国石油大学 2019-2020大中小学训练赛第二场 F题 位置 【螺旋矩阵+DFS】
  8. 电子表格的使用技巧!!实用啊!!!
  9. php dwz,PHP中的短网址怎么利用DWZ.CN服务进行生成
  10. 虚拟机vmare16使用u盘装安装ghost系统