当前位置:首页 > JavaScript > 正文内容

知乎屏蔽AdBlock原理

canca6年前 (2020-04-03)JavaScript524

在知乎的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原理” 的相关文章

《Dom Scripting》读书笔记

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

javascript 弹出式窗体详解

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

javascript 中面向对象编程 (类的构造)

javascript 中面向对象编程 (类的构造)

不論是用java,還是c#,又或是vb,構建一個對象都很簡單,都可以采用 classobj =new classobj()的方法構造一個類,然后使用其中的屬性以及方法,其實javascript也是一樣可以實現的。    示例:建立一個js文件,定義一個對象 E...

javascrip 事件追加方法

基本方法:attachEvent(IE)/detachEvent;addEventListener( Mozilla, Netscape, Firefox)/removeEventListener在之前的邏輯判斷式的基礎上,在設計javascript的時候,可以針對瀏覽器的不同,寫出適合不同種類瀏覽...

Javascript 逻辑表达式

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

JavaScript 为网页添加快捷键

为网页添加快捷键即为网页添加onkeydown事件。 FireFox里获取键入键的ASCII码与IE获取是有些差别的。因为FF里没有Event对象。 但FF里事件触发方法中默认传送其事件对象。 即我们在JS里写该事件方法时,要多加一个参数。 例: <script type="text/java...

发表评论

访客

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