如何处理阻止非广告元素的AdBlock

时间:2017-05-16 09:50:58

标签: javascript html adblock

我最近遇到一个问题,即用户抱怨他们无法访问某个页面,因为该链接不在原来的位置。

经过一番头疼之后,我让他们禁用所有浏览器扩展程序,确定问题消失了。逐个重新启用扩展程序......

的AdBlock。

出于某种原因,它阻止了指向用户想要访问的页面的链接。

现在,我没有投放广告而且从不计划,所以通常我只是告诉有这个问题的人将网站列入白名单,一切都很顺利。但如果有人从来不知道开始时会出现问题,那么我实际上会失去流量。那我怎么能避免这个呢?

我唯一能想到的就是检测AdBlock并弹出一个小通知,说明AdBlock已知会破坏网站,而且由于我们不投放广告,他们可能希望为网站停用广告。我的意思是,该网站是一个游戏,这不是第一次浏览器扩展破坏它,但我不认为第一次访问者会很高兴看到弹出窗口要求禁用他们的阻止程序,你知道?

因此,实际上阻止AdBlock首先破坏网站的任何解决方案都会很棒。

1 个答案:

答案 0 :(得分:7)

您无法阻止Chrome扩展程序的运行。它们在自己独立的线程中运行,具有特权API,并且不受页面脚本的影响。

检测广告拦截器很尴尬。最简单的方法是创建一个'牺牲元素' - 例如像'ad_unit'这样的类的div - 将它添加到DOM然后等待一帧以查看它是否已隐藏(使用display: none,例如,或getBoundingClientRect支票。)

元素检查很棘手,因为严格来说,无法保证广告拦截器会同步运行或在检查代码之前运行。

由于广告拦截器以特权模式运行,因此其操作不会触发非特权脚本空间中的事件。更简单地说:当外国分机与你的页面混淆时,你不能使用DOMMutationEvents间谍。

另一种选择是尝试加载“牺牲文件” - 一个看起来像广告的URI的图像,然后 - 然后将onError处理程序附加到该元素。如果它引发了一个看似可疑的错误(我认为它是Chrome上的ERR_BLOCKED_BY_CLIENT),那么您会显示警告消息。

您最后的选择是尽量避免招致Adblock的愤怒。 Adblockers通常使用URI和CSS选择器的开放黑名单,如EasyList(https://easylist.to/easylist/easylist.txt) - 这是AdblockPlus使用的,还有其他几个。您可以尝试确保您的DOM元素永远不会有任何ID或类与任何选择器发生冲突。不过,这是一个很重要的清单,它可以随时改变。