在浏览网页的时候,总会有那么几个网站,在你选择了文本后给你弹出一个悬浮框,让你可以 方便 地在它的搜索引擎上搜索。实际上,我们往往只是想要复制,或者只是下意识地双击选择(不知道有没有人和我一样有这样的习惯),而跳出来的搜索框很容易误触。终于,某一天我忍无可忍,决定下手解决这种情况。
思路
经过 F12 分析后,发现绝大多数网站都是通过监听 selectionchange 和 mouseup 这两种事件来控制悬浮框的展现。于是,一个通杀方案浮现在脑海之中,那就是移除所有监听这两个事件的监听器。但是移除监听器需要知道它的回调函数,而我们很难做到通用地获取回调函数 (通过覆写 addEventListener 方法可以做到劫持,但是这么做可能导致意料之外的错误)。
在翻看了十段甚至九段文档后,我发现了一个参数:
options (可选)
一个指定有关 listener 属性的可选参数对象。可用的选项如下:capture (可选)
一个布尔值,表示 listener 会在该类型的 事件捕获阶段 传播到该 EventTarget 时触发。
要弄明白上述参数的含义,得首先弄清楚 js 的事件顺序。当某个元素发起事件时,首先从最顶层传播至发起的元素,然后再次折返传播到最顶层。第一趟称为事件捕获阶段 (Event capturing),第二趟称为事件冒泡阶段 (Event bubbling)。用人话来说就是 capture 为真时,最顶层的事件监听器会首先获得事件通知。
同时我们知道,在事件监听器的回调函数中,我们可以 调用 stopImmediatePropagation 来立刻阻止事件传播。那么,一个优雅而又通用的解决方案就呼之欲出了。
最终方案
我们直接在整个 document 上设立关于 selectionchange 和 mouseup 的监听器,capture 设为 true,从而保证我们的侦听器是最早获得事件通知的
当我们的侦听器得到通知后,调用 stopImmediatePropagation 来立刻阻止事件传播
目标网站设立的侦听器无法捕获事件 (因为已经被我们的侦听器截获了)
用人话来讲,就是我们设立了一个侦听器,截获了所有相关事件,导致网站设立的侦听器 不知道 这些事件,于是悬浮框也就不会出现了。需要注意的是,有些网站是通过这两类事件来提供其它有用的服务,在这种情况下只能使用其它方法了(这类网站大概率也不会搞个悬浮框来恶心用户吧)。
代码
Talk is cheap, show me the code.
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站日常活跃所需,积分可通过日常活跃免费获得!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励,同时还能获得对应的人气!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:http://www.yonghengzy.cn/blog/40167.html,转载请注明出处。
评论0