HTML5 MutationObserver检测页面劫持

好久没写博客了,业务一直在变化,陆陆续续的做了很多web app,被业务流淹没就很少有机会去反思,前端技术发展如此之快,常常有种不学则退的恐慌,一种技术还没吃透就涌出新的技术,然后一波人又打着各种旗帜去宣传,想偷懒都不行,大脑完全不够用。

Nodejs,AngularJS,vuejs,React,grunt,gulp,webpack...Fuck!

HTML5的水很深很深,感觉还有很多技术没有挖掘和使用。无意中发现HTML5 DOM4级MutatioObserver方法,可以检查页面中的DOM是否发生变化,说到这也许大家知道可以用来干嘛了。

确实,前段时间我们遇到了web app被运营商劫持的问题,不清楚哪个环节出了问题,换了https按理说应该不会再出现,后来想到用类似GA统计的方式去统计页面是否被注入了js脚本或者iframe,然后通过日志去查看异常问题。

劫持问题无非就是页面被修改了,DOM结构发生变化了被插入了小广告。看到MutatioObserver方法有种豁然开朗的感觉,虽然不能解决被劫持的问题,但是也能查看被注入了什么,也算涨了见识。

概述

MutationObserver从字面上含义就是发现突变。它可以监听页面的DOM元素是否发生了变化,然后给出通知。

Constructor

MutationObserver()

new MutationObserver(callback)

callback,当每次DOM发生变化的时候都会触发callback,大家也许就会问,那要是频繁修改dom,那这个callback就会频繁触发,性能上怎么办?实际上,MutationObserver并不是每次dom发生变化的时候立即触发,还是等所有的dom操作完成之后一次执行,也就是说它是异步的。

举个栗子:

<body>
  <ul id="container"></ul>
</body>
var callback=function(){
  console.log("Dom changed");
};
var mutationObserver=new MutationObserver(callback);
var otpions={
  subtree:true,
  childList:true
};
mutationObserver.observe(document.body,otpions);
window.onload=function(){
  for(var i=0;i<10;i++){
    var li=document.createElement("li");
    li.innerText="这是";
 document.getElementById("container").appendChild(li);
  }
};

http://jsbin.com/nimilelote/edit?html,js,console,output

我们像DOM元素中插入了10次,实际上oberve只执行了一次,是在所有的dom操作完成之后触发的。

mutationObserver实例有三个方法。

observe(target,options)  //给制定的DOM注册一个事件,如果DOM发生变化就会发送通知。target是目标元素,比如body,options是配置哪写dom发生变化时才发送通知

disconnect();    //终止监听DOM变化,直到重新实例化

takeRecords()   //清除变动记录,即不再监听还没发生的DOM变化

observe实例化配置:

childList:设置为true表示监听指定元素的子元素的变动;

attributes:设置为true表示监听指定元素的属性的变动;

characterData:设置为true表示监听指定元素的data变动;

subtree:设置为true表示不紧监听目标元素也同时监听其子元素变动;

attributeOldValue:在attributes属性已经设为true的前提下,如果需要将发生变化的属性节点之前的属性值记录下来(记录到下面MutationRecord对象的oldValue属性中),则设置为true;

characterDataOldValue:在characterData属性已经设为true的前提下,如果需要将发生变化的characterData节点之前的文本内容记录下来(记录到下面MutationRecord对象的oldValue属性中),则设置为true.

attributeFilter:一个属性名数组(不需要指定命名空间),只有该数组中包含的属性名发生变化时才会被观察到,其他名称的属性发生变化后会被忽略.

// Firefox和Chrome早期版本中带有前缀
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver

// 选择目标节点
var target = document.querySelector(‘#some-id‘);

// 创建观察者对象
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });
});

// 配置观察选项:
var config = { attributes: true, childList: true, characterData: true }

// 传入目标节点和观察选项
observer.observe(target, config);

// 随后,你还可以停止观察
observer.disconnect();
时间: 2024-08-06 18:00:57

HTML5 MutationObserver检测页面劫持的相关文章

通过HTML5 Visibility API检测页面活动状态

几年前,我们浏览网页的时候是没有选项卡浏览模式的,每一个网页都会是一个浏览器窗口,如果我没有记错,Win7之前我们都是这样浏览网页的.作为一个程序员,我们经常会同时打开10-15个网页,多的时候超过20个也不足为奇. 为什么要使用这个API? 早期我们没有办法确定哪些选项卡是活动状态的,但是现在通过HTML Visibility API,我们可以检测访客是否正在浏览我们的界面. 在这个教程中我们会介绍如何使用HTML5 Visibility API,同时我们也为你准备了一个简单的demo来查看页

浏览器对HTML5特性检测工具Modernizr

最近在做公司移动端运营的项目,需求中多处地方都会涉及动画.相信很多前端开发都会有这种感触,对CSS3中的动画属性很熟悉,但是由于对动画运动过程的理解不深入,经常只能望而止步.CSS3中动画这在Web页面中具有点睛之笔,让人眼前一亮,这段时间我会抽空来整理关于动画这块的知识点,希望能在总结的同时分享给有需要的朋友们,如果有什么好的建议和想法欢迎相互交流学习.无论是动画还是别的CSS3的新特性在移动端都能得到很好的支持,可是对于PC端来说,有那么些不太友好的浏览器(比如万恶的IE9-)无法支持CSS

HTML5 增强的页面元素

一.HTML5 改良的 input 元素的种类 1.<input type="number" id="num1"> var n1 = document.getElementById("num1").valueAsNumber; 七.HTML5 增强的页面元素 1.figure.figcaption <figure> 标签规定独立的流内容(图像.图表.照片.代码等等).figure 元素的内容应该与主内容相关,但如果被删除,

html5移动端页面分辨率设置及相应字体大小设置的靠谱使用方式

对于动端网页编写CSS网上有很多介绍的文章,但在实际使用过程中还是会纠结. 网上的资料太多,且大多都是技术介绍型,特别是针对android上,网上写的各种麻烦,各种复杂,各种不接地气儿... 我在做移动端网页时,总是和美工设计的页面有出入,主要还是由于双方对移动端HTML5实现页面还了解还不够. 今天就研究一下各大互联网公司对于移动端页面的处理方式. 主要研究对象:BAT(度娘,阿狸,企鹅)这几家的移动端网站或webapp 主要研究点:viewport的设置,字体的设置,图片原始宽高设置 汝甚吊

HTML5+CSS3静态页面项目-PayPaul的总结

学习前端有一段时间了,一直在看书上的理论知识,而实战项目却很少.师兄常说,想要知道自己的实力有多少,知识掌握了多少,最好的方法就是去实践了,实践出真知嘛.于是决定在这个假期里,主要是通过项目的实践以及理论知识的辅助来提高代码水平.首先是做几个HTML5+CSS3静态页面布局的练习,查缺补漏知识点并且总结在实践过程中遇到的一些错误.页面的设计稿主要是网络上找来了的,也尝试自己切图.测量位置.获得内容的属性等等,假装自己真的在完成一个项目. 第一个页面是从设计达人这个平台上找来的,这个平台的页面设计

html5中让页面缩放的4种方法

html5中让页面缩放的4种方法 2013-10-22 14:45:03 分类: Web开发 1.viewport这种方法,不是所有的浏览器都兼容 2.百分比这种方法,可以兼容大部分浏览器,但是修改幅度比较大.main .login .txt1{margin-top:8.59375%; position:relative;}3.css transform这种方法,可以兼容大部分浏览器,但是页面的位置是居中的.w320{transform: scale(1,1);-ms-transform: sc

基于HAproxy的web动静分离及输出状态检测页面

一.简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理.HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接.并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上. HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数.多进程或多线程模型受

HTML5+CSS3静态页面项目-BusinessTheme的总结

因为期末考试.调整心态等等的种种原因,距离上一次的项目练习已经过了很久了,今天终于有时间继续练习HTML5+CSS3的页面架构和设计稿还原.设计图很长,整个页面分为了好几个区域,所以就不放完整的设计图了,具体的设计文件可以在文末的Github地址中下载.第一次的总结是以我对页面架构的理解,按照代码实现顺序讲解的,那这一次就按照遇到的问题总结性地记录吧.欢迎大家看完我的作品和总结以后,提出宝贵的建议!谢谢大家! 经过上一次的练手,这次的练手就更加从容了,不仅仅是为了查缺补漏,也是为了解决问题的同时

html5体验优化页面加载的14条建议

html5体验优化页面加载的14条建议 1. fake 页 - 首屏加速目标:首屏 3s 以内因为 71% 的用户期望移动页面跟 pc 页面一样快 (3s) ,74% 的用户能容忍的响应时间为 5 秒,所以我们必须保证移动端页面有足够的速度. 方案:- 避免页面长时间白页,页面渲染只需要完整的HTML 以及 CSS- 加载结束后页面第一屏便渲染结束,然后再异步加载js- 静态资源不使用 cookie- 优化加载顺序 css头.js尾 2. 降低请求「数」- 将可合并的 CSS.JS 文件合并-