当前位置:首页 > JavaScript

知乎屏蔽AdBlock原理

canca6年前 (2020-04-03)JavaScript551

在知乎的main.app.e081f97c6d9521b4b613.js 里有以下这段代码。

var y = "AdblockBanner::dismiss",
            v = function(e) {
function t() {
var e, n, r, i;
                    o(this, t);
for(var u = arguments.length, l = Array(u), s = 0; s < u; s++) l[s] = arguments[s];
return n = r = a(this, (e = t.__proto__ || Object.getPrototypeOf(t)).call.apply(e, [this].concat(l))), r.state = {
shown: !1
                    }, r.handleClose = function() {
                        localStorage.setItem(y, "true"), r.setState({
shown: !1
                        })
                    }, i = n, a(r, i)
                }
return i(t, e), s(t, [{
key: "componentDidMount",
value: function() {
"true" !== localStorage.getItem(y) && !l() && u() && this.setState({
shown: !0
                        })
                    }
                }, {
key: "render",
value: function() {
return this.state.shown && f.default.createElement("div", {
className: "AdblockBanner"
                        }, f.default.createElement("div", {
className: "AdblockBanner-inner"
                        }, "我们检测到你可能使用了 AdBlock 或 Adblock Plus,它的部分策略可能会影响到正常功能的使用(如关注)。", f.default.createElement("br", null), "你可以设定特殊规则或将知乎加入白名单,以便我们更好地提供服务。 (", f.default.createElement("a", {
href: "/question/54919485",
target: "_blank"
                        }, "为什么?"), ")"), f.default.createElement(m.default, {
preset: "plain",
className: "AdblockBanner-close",
onClick: this.handleClose
                        }, f.default.createElement(p.default, {
name: "remove"
                        })))
                    }
                }]), t
            }(c.Component);

核心判断逻辑:

      value: function() {
"true" !== localStorage.getItem(y) && !l() && u() && this.setState({
shown: !0
                        })
                    }

其中localStorage.getItem(y) 就是取key为AdblockBanner::dismiss的值,l() 则是判断是否是移动端。

function l() {
return !!e.navigator && /Mobile/.test(navigator.userAgent)
        }

u()则是创建一个假的广告div,判断是否可以创建并显示出来

 function u() {
var e = document.createElement("div");
            e.className = "adsbox", document.body.appendChild(e);
var t = "none" === getComputedStyle(e).display;
return document.body.removeChild(e), t
        }

最后的this.setState({shown: !0})就是设置是否显示提示条幅。

扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/710.html

标签: JavaScript
分享给朋友:

“知乎屏蔽AdBlock原理” 的相关文章

JavaScript 函数原型对象

    以下是一篇本人在Qzone里写下的文章,现在放到这里来,欠丑了。希望对一些初学者有一点点帮助。     今天给大家说说JavaScript中的类。类?没错。JavaScript中的函数原型对象就是OOP中人们熟悉的类。..…

《Dom Scripting》读书笔记

  《Dom Scripting》读书笔记 Canca         最近看了一本《Jeremy Keith: DOM Scripting, Web design with JavaScript and the DOM. Apr…

javascript MailTo 邮件技巧

调用email的方法 //<a href="mailto:talantlee@126.com">Email</a>window.location.href="mailto:talantlee@126.com";myform.action="mailto:talant…

javascript 弹出式窗体详解

1>window.prompt(text, value) 簡單的基與模態窗體的對話框,(返回你輸入)   var v=window.prompt("提示","請輸入你的名字")2>window.confirm(text,mess)  模態確認框(返回"是/否…

Javascript 逻辑表达式

1>逻辑表达式    看例子:     var cc;      var  dd=new Object();      var false1="false…

event事件兼容mozilla firefox的问题

本来一个写好了的脚本在IE下正常,可是在mozilla firefox中我们发现程序报类似如下的错误: event is not defined obj has no properties 原因是Firefox中使用了不同的事件对象模型,不同于IE Dom,用的是W3C Dom. 下是我在网上找到的…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。