18禁

我知道你们都是看这图进来的,但是这个图跟下面的内容没有必然联系。

前不久在网上找资料的时候突然发现某个页面的 title 是啥※18♥禁★电影【在线观看】☆...,突然就心头一紧,是哪个页面咋还自动弹广告页,还是新标签页面打开的。当时我的表情就是这样。

怀着就像你们看我题图就点进来的心情点开了那个页面,耶,正常的内容啊!刚刚那个18禁呢?!

冷静了一下,就想这是个trick啊,然后我就自己动手实现了一个。
效果就像这个样子。

这本来是个动态图,看这里

实际上,这部分代码我已经作为一个模块开源在我的博客里了,没单独分离出来。 interesting-title.js
这个文件的历史commits信息中暴露了一些奇奇怪怪的链接,老司机开车就是开的这么触不及防。不要问我要邀请码,我也没种子。

下面,我就来教你手把手实现这个trick。

首先,我们先分析需求。

基本功能是在页面被隐藏的时候显示一些劲爆的title,开个小玩笑;
当用户点击进来的时候(也就是页面正常显示的时候)显示正常的title。

接着,分析下技术要点。

  • document.title 修改标题
  • visibilitychange 事件来监听页面是否隐藏

挺简单的嘛,咱们开干!

动态的修改title

  function interesting(title) {// origin infolet originTitle = document.title;// interesting infotitle = title || '※18♥禁★电影【在线观看】☆...';// get prefix support for ...let hidden, visibilityChange;['', 'o', 'ms', 'moz', 'webkit'].forEach(prefix => {let supportHidden = prefix + (prefix ? 'Hidden' : 'hidden');if (typeof document[supportHidden] === 'undefined') return;hidden = supportHidden;visibilityChange = prefix + 'visibilitychange';});// not support for returnif (typeof document.addEventListener === 'undefined' || typeof document[hidden] === 'undefined') return;// start interestingdocument.addEventListener(visibilityChange, function() {document.title = document[hidden] ? title : originTitle;}, false);}复制代码

很完美啊,根本拦不到我们这种老司机。

看我这结构,多优雅,还支持自定义 title 呢。

“哟,小安啊,这能干咋不上天呢”

好吧,上天咱是不行的,但咱还得继续优化用户体验,要给用户那种突然发现这个页面的心头一震!然后又会心一笑的美妙落差啊。

既然是18禁,当然要装的像的一点。那哪儿不像呢?

隔壁桌的小草同志看了看说:“一般这种网站的标题不总是动来动去的么”

很有经验啊,我的小草。

来,给标题加个跑马灯。

  // start interestingdocument.addEventListener(visibilityChange, horseRaceLamp, false);let timer;function horseRaceLamp() {if (document[hidden]) {document.title = title;if (!noRunTitle) timer = setInterval(() => {let str = document.title;document.title = str.substr(1, str.length - 1) + str[0];}, 50);} else {document.title = originTitle;if (timer || timer === 0) clearInterval(timer);}}复制代码

“这么[屏蔽字]真!”

咳咳,请注意措辞,不要讲脏话!

本着用户体验的角度,总感觉哪儿不对啊,还有哪儿可以改改呢?

隔壁桌的小林同学听到小草同志的惊叹也凑过来瞅瞅。好家伙,才一过来,就说,这不错啊,就是那个 favicon 看着太不像了啊。

厉害了,我的小林同学,你是怎么一眼就发现这个核心问题的!

来来来,我们聊聊。

在小林的帮助下,我顺利的找到了某榴社区的 favicon ,还不小心把那社区的地址也给提到版本里了 = =、

撸起袖子就是一顿写。

  const originFavicon = getFaviconEle();const originFaviconHref = originFavicon.href;const defaultFavicon = 'http://****.****.com/favicon.ico';favicon = favicon || defaultFavicon;function getFaviconEle(href) {let ele = document.querySelector('link[rel="shortcut icon"]') || document.querySelector('link[type*=image]');if (ele) return ele;href = href || '/favicon.ico';ele = document.createElement('link');ele.setAttribute('rel', 'shortcut icon');ele.setAttribute('href', href);document.querySelector('head').appendChild(ele);return ele;}// 更新跑马灯方法function horseRaceLamp() {if (document[hidden]) {document.title = title;if (originFavicon) originFavicon.href = favicon;if (!noRunTitle) timer = setInterval(() => {let str = document.title;document.title = str.substr(1, str.length - 1) + str[0];}, 50);} else {document.title = originTitle;if (originFavicon) originFavicon.href = originFaviconHref;if (timer || timer === 0) clearInterval(timer);}}复制代码

这下子就看起来万事大吉了啊。
最后用 base64 转一下 favico 再合并一下前面的所有代码,大概有50多行,再优化一下默认传参,再加个是否启动替换 favico 的开关,就齐活了啊,来看一下最终的代码。

  const defaultFavicon = 'data:image/vnd.microsoft.icon;base64,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';export default function({ title, favicon, noRunTitle, noRunFavicon } = { noRunTitle: false, noRunFavicon: false }) {// origin infolet originTitle = document.title;let originFavicon, originFaviconHref;if (!noRunFavicon) {originFavicon = getFaviconEle();originFaviconHref = originFavicon.href;}// interesting infotitle = title || '※18♥禁★电影【在线观看】☆...';favicon = favicon || defaultFavicon;// get prefix support for ...let hidden, visibilityChange;['', 'o', 'ms', 'moz', 'webkit'].forEach(prefix => {let supportHidden = prefix + (prefix ? 'Hidden' : 'hidden');if (typeof document[supportHidden] === 'undefined') return;hidden = supportHidden;visibilityChange = prefix + 'visibilitychange';});// not support for returnif (typeof document.addEventListener === 'undefined' || typeof document[hidden] === 'undefined') return;// start interestingdocument.addEventListener(visibilityChange, horseRaceLamp, false);let timer;function horseRaceLamp() {if (document[hidden]) {document.title = title;if (originFavicon) originFavicon.href = favicon;if (!noRunTitle) timer = setInterval(() => {let str = document.title;document.title = str.substr(1, str.length - 1) + str[0];}, 50);} else {document.title = originTitle;if (originFavicon) originFavicon.href = originFaviconHref;if (timer || timer === 0) clearInterval(timer);}}}function getFaviconEle(href) {let ele = document.querySelector('link[rel="shortcut icon"]') || document.querySelector('link[type*=image]');if (ele) return ele;href = href || '/favicon.ico';ele = document.createElement('link');ele.setAttribute('rel', 'shortcut icon');ele.setAttribute('href', href);document.querySelector('head').appendChild(ele);return ele;}复制代码

如果觉得这篇文章不错,就给我点个star吧,如果想持续关注我的博客,就点个watch

谢谢! 我的博客

说了这么多废话!

用`visibilitychange`事件实现吸睛的十八禁相关推荐

  1. FreeRTOS操作系统——任务通知模拟消息邮箱及事件标志组(十八)

    FreeRTOS操作系统学习 文章目录 FreeRTOS操作系统学习 一.消息邮箱API函数 二.消息邮箱实验 三.事件标志组实验 总结 一.消息邮箱API函数 任务通知也可用来向任务发送数据,但是相 ...

  2. 【Vue2.0】— 组件的自定义事件(十八)

    [Vue2.0]- 组件的自定义事件(十八) <template><div ><h2>{{msg}}</h2><!-- 通过父组件给子组件传递函数 ...

  3. JavaScript学习(二十八)—事件冒泡和事件捕获

    JavaScript学习(二十八)-事件冒泡和事件捕获 一.什么是事件流? 简单说,事件流就是指事件的执行顺序,他包含两种模式:事件冒泡.事件捕获. (一).事件冒泡 最常用的一种模式,就是指事件的执 ...

  4. hangfire 过期记录_韩剧丨顶楼、空洞、再次十八岁、僵尸侦探、青春记录

    顶楼 更新至01集 主演: 李智雅 / 柳真 / 严基俊 / 奉太奎 Tae-gyu Bong 剧情:该剧讲述为了跻身上流社会而堵上人生.奋力奔走的女主的欲望和母性,以及置业暴富的成功故事. 空洞 更 ...

  5. pygame重新开始_Pygame(十八)音乐

    Pygame(十八)音乐 没有声音的游戏是没有灵魂的. 游戏中怎么可以没有声音呢? 前情提要 本节提要 内容详情 这长长的一串,对比昨天的短小无力,感觉今天的工作是真的大. 内容详情 加载与播放 加载 ...

  6. 燕十八 php经典,燕十八PHP传世经典第1部视频教程(后半部分)_PHP教程

    教程名称:燕十八PHP传世经典第1部视频教程(后半部分) 课程目录: [IT教程网]061-js基础与页面特效的关系-答同学问 [IT教程网]062-百钱买百鸡问题 [IT教程网]063-昨天回顾 [ ...

  7. 十八.用户注册 ---- 用户名/用户密码/手机号验证 2021-04-07

    十八.用户注册 ---- 用户名/用户密码/手机号验证 引言 注:该篇文章接上一篇 十七.用户注册 ---- 图形验证码 在上一篇文章我们实现了用户注册中的图形验证码过程,接下来我们要实现用户名验证, ...

  8. python3 scrapy框架,Python3爬虫(十八) Scrapy框架(二)

    对Scrapy框架(一)的补充 Infi-chu: Scrapy优点: 提供了内置的 HTTP 缓存 ,以加速本地开发 . 提供了自动节流调节机制,而且具有遵守 robots.txt 的设置的能力. ...

  9. Redis(十八)——Sentinel 哨兵模式

    文章目录 Redis(十八)--Sentinel 哨兵模式 1.哨兵模式概述 2.搭建 Sentinel 集群 3.sentinel 集群测试 4.哨兵模式的所有配置详解 Redis(十八)--Sen ...

最新文章

  1. 利用kickstart自动安装虚拟机
  2. c语言名字程序,c语言获得程序位数和操作系统位数和名称
  3. 人工智能如何获得知识?
  4. 在unity调用WebService的接口方法
  5. wxWidgets:wxDir类用法
  6. wordcount linux java_linux下在eclipse上运行hadoop自带例子wordcount
  7. RANet:MSDNet加强版!清华黄高团队提出分辨率自适应的高效推理网络RANet!
  8. Kotlin教程 - 收藏集 - 掘金
  9. 手机游戏开发纹理图片优化心得
  10. mysql驱动加载失败怎么办_为什么mysql加载驱动会报错呢输出的结果是加载驱动失败...
  11. 两个网段计算机如何共享打印机,不同网段的打印机共享怎么连接?具体步骤
  12. 外企计算机英语,职场英语:外企生存十大必备英语词汇
  13. 打开 igv java_IGV加载很久很烦人?三步帮你解决!
  14. 关于利用计算机,关于计算机应用基础试题
  15. Ble Mesh技术(九)之Friendship
  16. 物联网开发笔记(50)- 使用Micropython开发ESP32开发板之控制HC-SR501人体红外感应传感器
  17. 三维比例导引 matlab,三维比例导引律(源程序)
  18. 真空本质和对称性破缺
  19. springcloudalibaba学习分享
  20. 招聘前端面试应该问的问题

热门文章

  1. 上海交通大学819-上交819-考研上岸经验
  2. B端产品项目如何调研需求?
  3. 登录王者荣耀显示服务器连接错误,王者荣耀登陆失败解决办法 登陆失败怎么办...
  4. w32.downadup.b蠕虫病毒详解及清除攻略(转)
  5. 从零实现RPC框架之:4协议设计
  6. 使用Vue组件为页面添加评论
  7. 年终盘点 | 从Cancer Cell到Nat Plants,高分项目文章盘点
  8. 二维分类教案_大班教案二维分类
  9. 新课标、新考法,猿辅导创新教育研究院全面拆解新课标
  10. 相机上的P,S,A,M分别是什么单词的缩写?