javascript - 如何优雅地防止某些元素在现代浏览器上呈现
问题描述
所以我想防止某些我知道它们的 html/css 属性的元素(例如广告横幅),例如,XXXX-ads-notification
当我浏览某些域时,它们将有一个类似的类来呈现/显示?
目前我所做的是,当网页完全呈现时,我检查元素并手动删除它们,这样我就可以在查看某些页面/域时摆脱广告/通知等这些烦人的事情。
但是,效率低下,每次都需要这样做,更不用说我想为不同的域处理不同的情况。
我不确定我是否需要编写自己的扩展来处理这个问题,或者有没有更出色/优雅的方式来实现这个目标?
顺便说一句,我正在使用 AdBlock,我觉得它的规则不太适合我的情况,因为有些广告更适合内容(例如原生广告),可能无法被此扩展程序捕获......</p>
由于浏览器在客户端存储 html 文件,我实际上不认为这是一个真正的 hack,应该可以自由地这样做吗?
解决方案
我有一个用户脚本可以做到这一点。(你需要一个像 Tampermonkey 这样的用户脚本管理器。)我使用的一般想法是创建一个指向广告的 CSS 选择器列表,并插入一个<style>
将这些元素设置为display: none
.
例如,如果一个站点有一个名为 的类ad
,则可以通过插入以下内容来隐藏它:
<style>
.ad {
display: none !important;
}
</style>
这是完整的用户脚本:
// ==UserScript==
// @name Hide Frames
// @namespace CertainPerformance
// @version 1.0.0
// @match *://*/*
// @run-at document-start
// @grant none
// ==/UserScript==
const selectorsToHideStr = `
stackoverflow.com
.-marketing-link
.bottom-share-links
#footer
example.com
.someOtherAdSelectorOnExampleDotCom
`;
// ADD SITES AND SELECTORS ABOVE AS NEEDED
const selectorsToHideBySite = selectorsToHideStr
.match(/^.+(?:\n +.+)+/gm)
.reduce((a, siteStr) => {
const lines = siteStr.split('\n');
const site = lines.shift();
const selector = lines
.map(str => str.trim())
.join(', ');
a[site] = selector;
return a;
}, {});
const selectorsToHide = selectorsToHideBySite[window.location.host];
if (selectorsToHide) {
const styleTextContent = selectorsToHide + ' { display: none !important }';
document.documentElement.appendChild(document.createElement('style')).textContent = styleTextContent;
}
要隐藏页面上的广告,只需添加到selectorsToHideStr
. 在上面的示例中,选择器.-marketing-link
、、.bottom-share-links
和#footer
在堆栈溢出时被隐藏。
对于您的示例,如果网站somesite.com
有带有类的广告XXXX-ads-notification
,您可以将其添加到selectorsToHideStr
:
somesite.com
[class$="ads-notification"]
这将匹配并隐藏类名以ads-notification
when on结尾的元素somesite.com
。
推荐阅读
- r - 遍历数据框并根据条件更改值 [R]
- django - 允许经过身份验证和未经身份验证的用户使用令牌身份验证装饰器访问 django 休息视图
- django - 根据与该模型相关的另一个模型的属性搜索模型的记录?
- c# - 使用 ASP.NET Core 3.0 是否需要为 IActionContextAccessor 进行任何额外的配置?
- css - 从边框向外创建 CSS 脉冲效果
- google-sheets - “查询已完成,输出为空”如何在没有结果时将其置零
- typescript - Cloud Function 在 android 应用程序上返回 null
- xodus - Xodus 实体商店可以共享交易吗?
- ios - 即使在后台并且如果应用程序在 Swift 中被终止,计时器也会继续执行
- python - 如何在python的数据框中查找具有相同值的列列表