同样的 DOM 操作为什么会有不一样的结果?

简介: 深夜光顾小网站,一进去竟然全部是广告,可惜 wuhen 模式下无法开启我的 Adblock,可我再转念一下,删广告这种事还用得着浏览器插件,不就是一个 DOM 操作?我直接一行代码删完

同样的 DOM 操作为什么会有不一样的结果?

深夜光顾小网站,一进去竟然全部是广告,可惜 wuhen 模式下无法开启我的 Adblock,可我再转念一下,删广告这种事还用得着浏览器插件,不就是一个 DOM 操作?我直接一行代码删完(放抖音上又是堪比 python 画花的一个爆款小作品)

t_3.jpg

即使面对内容丰富的网站,我依然还是面不改色的简单的进行了一下页面分析,很快啊,我打开了开发者工具,我一个 ctrl + c 迅速定位到广告栏,然后一个右键 Copy selector,拿到选择器,然后所谓的一行代码就出现了(凭我这分析速度,明天又可以跟隔壁小梁吹我会爬虫了)

document.querySelector("#HMRichBox").remove();

很快啊,我在控制台上复制粘贴,一个回车,广告立无,但是当我看下一页的时候却又发现,又来了一个广告,它奶奶的,玩阴的是吧!

它奶奶的,玩阴的是吧!

那么有没有什么办法可以让我可以一进去网页就可以执行我设计好的脚本呢?这我可想到了,Tampermonkey 这个油猴插件了,注意之前提到过插件在无痕模式下是不可以使用的,但是后面我百度后发现是可以的,但一涉及到 js 我可就不困了呀,还用得着 Adblock ?我直接手写一个!

油猴就是可以实现我们访问网页时帮助我们执行已经设计好的脚本,可是写好了之后,我发现这个去广告的效果并不是特别好?有时候行有时候不行,这是为什么呢?

前面说过,通过分析 HTML 页面结构然后通过 JS 执行相应的 DOM 操作可以帮助我们去删掉广告,那么可以去直接去看访问这个页面时,对展示的 HTML 页面的请求的返回结果进行一个分析

img1.png

罪魁祸首 - ajax

看完之后我就发现了罪魁祸首 - ajax,在请求回来初始 HTML 后,再通过异步请求弹窗广告,然后再渲染到 HTML 上,这也就是为什么插件时灵时不灵,如果访问网页的那一瞬间,网速快了,图片请求回来时,脚本还没运行,这时广告就能够去除,反之则不能,所以我访问这个网站的时候还要靠网速去除广告?

那肯定是不行的,我很快就想到了解决方案

延时运行脚本

网速慢了会导致脚本提前运行,那我延时一下我的脚本不就行了?

setTimeout(() => {
  document.querySelector("#HMRichBox").remove();
}, 1000);

加上时间限制后果然好了很多,但是有时候还是不太行,太短吧,失误率高,太长吧,我已经看完我想看的,或者已经跳过广告部分了,所以这阈值不是能够很好的把控

所以浏览器就是有没有一种可能,就是它可能会有生命周期钩子之类的东西呢?

页面生命周期

  1. DOMContentLoaded —— 浏览器已完全加载 HTML,并构建了 DOM 树,但像 和样式表之类的外部资源可能尚未加载完成。
  2. load —— 浏览器不仅加载完成了 HTML,还加载完成了所有外部资源:图片,样式等。
  3. beforeunload/unload —— 当用户正在离开页面时。

光看文字可能不太清除,看一下控制台 - network 上面的请求分析就可以清除的看到 DOMContentLoaded 和 load 的区别

img2.png

DOMContentLoaded 响应是在 5.62s,而 load 响应是在 5.85s

那么从上面这三个阶段并结合分析结果可以知道,在 DOMContentLoaded 的时候执行我们的脚本是比较合适的,而且更重要的是,在 DOMContentLoaded 响应的时候,广告弹窗的请求已经发送出去了,所以我们的脚本这个时候执行是能够去除广告的,也不再需要去考虑设置时间的多少去执行我们的脚本

总结

这篇文章的敲的代码都是在浏览器中完成的,也就是说,我需要对着网站的紧张刺激的内容一个键一个键的敲代码,而且还经历了三个版本

  1. 控制台
  2. 油猴脚本
  3. 页面生命周期分析

但是实现的内容其实只是为了去除广告,在思考完后,那天晚上其实我已经没有多大兴趣去看网站的实际内容了,违背初心了属于是

那我最后使用了什么去解决广告问题的呢?

其实还是用的 adblock,有些饭还得是让专业的人吃啊

好家伙我他妈直接好家伙

adblock 是采用拦截请求和 CSS 覆盖的方式解决

咱就是说有东西不用,尽 TM 造一些烂轮子

参考资料

load/domContentLoaded 事件、异步/延迟 Js 与 DOM 解析

ADBlock 的实现原理

相关文章
|
6月前
|
缓存 JavaScript 前端开发
【JavaScript 技术专栏】DOM 操作全攻略:从基础到进阶
【4月更文挑战第30天】本文深入讲解JavaScript与DOM交互,涵盖DOM基础、获取/修改元素、创建/删除元素、事件处理结合及性能优化。通过学习,开发者能掌握动态改变网页内容、结构和样式的技能,实现更丰富的交互体验。文中还讨论了DOM操作在实际案例、与其他前端技术结合的应用,助你提升前端开发能力。
243 0
|
6月前
|
JavaScript 前端开发
低效的DOM操作(js的问题)
低效的DOM操作(js的问题)
22 0
|
5月前
|
JavaScript 前端开发 UED
JavaScript基础-DOM操作:查找、创建、修改
【6月更文挑战第12天】本文介绍了DOM基础,包括查找元素(getElementById、getElementsByClassName等)、创建新节点(createElement、createTextNode)和修改节点(innerText、innerHTML、setAttribute等)。强调了易错点,如ID唯一性、性能考量和安全问题,并提供了代码示例。熟练掌握DOM操作对前端开发至关重要,但应注意性能优化,适时使用框架或库。
58 2
JavaScript基础-DOM操作:查找、创建、修改
|
5月前
|
JavaScript 前端开发
DOM操作有哪些方法可以改变元素的样式?
【6月更文挑战第30天】DOM操作有哪些方法可以改变元素的样式?
38 2
|
5月前
|
JavaScript 前端开发 开发者
DOM操作
【6月更文挑战第30天】DOM操作
35 1
|
4月前
|
JavaScript 前端开发 API
前端框架与库 - jQuery基础与DOM操作
【7月更文挑战第18天】jQuery 是一个简化JavaScript任务的库,以其“write less, do more”理念著称。核心功能包括DOM操作、事件处理和Ajax。DOM操作如选择元素(`$("p")`、`$("#myDiv")`、`$(".myClass")`)、创建及添加元素、修改属性和内容。事件处理如绑定(`click`)和触发(`trigger`)。常见问题涉及`$`符号冲突(使用`jQuery`代替)、异步加载管理和选择器性能优化。了解并规避这些问题能提升jQuery使用效率。
32 0
|
5月前
|
JavaScript 前端开发 安全
【JavaScript 】DOM操作快速入门
【JavaScript 】DOM操作快速入门
69 2
|
5月前
|
JSON JavaScript 数据格式
技术好文:tabel表格的dom操作
技术好文:tabel表格的dom操作
24 0
|
6月前
|
JavaScript 前端开发
JavaScript 提供了多种方法来操作 DOM(文档对象模型)
【5月更文挑战第11天】JavaScript 用于DOM操作的方法包括获取元素(getElementById, getElementsByClassName等)、修改内容(innerHTML, innerText, textContent)、改变属性、添加/删除元素(appendChild, removeChild)和调整样式。此外,addEventListener用于监听事件。注意要考虑兼容性和性能当使用这些技术。
45 2
|
6月前
|
JavaScript 前端开发 UED
深入解析JavaScript原生操作DOM技术
【4月更文挑战第22天】本文深入探讨JavaScript原生DOM操作技术,包括使用`getElement*`方法和CSS选择器获取元素,借助`createElement`与`appendChild`动态创建及插入元素,修改元素内容、属性和样式,以及删除元素。通过掌握这些技术,开发者能实现页面动态交互,但应注意避免过度操作DOM以优化性能和用户体验。