我希望能够检测用户是否正在使用广告拦截软件,当他们访问我的网站。如果他们正在使用它,我想显示一条消息,要求他们关闭它以支持项目,就像这个网站一样。

如果你进入该网站,而你的浏览器启用了某种广告拦截软件,那么该网站就不会显示真正的广告,而是显示一个小横幅,告诉用户广告收入用于托管项目,他们应该考虑关闭广告拦截。

我想在我的网站上做到这一点,我正在使用adsense广告,我怎么能做到呢?


当前回答

我用jquery最简单的解决方案是:

$.ajax({
    url: "/scripts/advertisement.js", // this is just an empty js file
    dataType: "script"
}).fail(function () {
    // redirect or display message here
});

advertising .js什么都不包含。当有人使用adblock时,它失败了,函数被调用。

其他回答

你不需要一个额外的HTTP请求,你可以简单地计算一个假添加的高度。

顺便说一下,这里有一个完整的列表,与广告拦截器避免渲染的元素相匹配。

窗口。adBlockRunning = function() { return (getComputedStyle(document.getElementById("detect"))["display"] == "none") ?真:假; }() console.log (window.adBlockRunning); #{检测 身高:1 px; 宽度:1 px; 位置:绝对的; 左:-999 em; 上图:-999年新兴市场 } <div id="detect" class="ads AD adsbox doubleclick AD -placement carbon-ads"></div>

如果你有问题的adblock阻止新标签在浏览器中,你可以这样做:

$('a').click(function(e){ // change $('a') into more specific selector
    const openedWindow = window.open(this.href, '_blank');

    // Check if browser tab was closed within 0.3 second (user can't, adblock does).
    setTimeout(() => {
        if (openedWindow.closed) {
            alert('Adblock detected!');
        }
    }, 300);

    e.preventDefault(); // return false if you like
});

这段代码是有用的,如果你不想阻止整个网站,只是告诉用户为什么他们的浏览器标签是关闭的;)

如果你正在使用react和钩子:

import React, { useState, useEffect } from 'react'

const AdblockDetect = () => {
  const [usingAdblock, setUsingAdblock] = useState(false)

  let fakeAdBanner
  useEffect(() => {
    if (fakeAdBanner) {
      setUsingAdblock(fakeAdBanner.offsetHeight === 0)
    }
  })

  if (usingAdblock === true) {
    return null
  }

  return (
    <div>
      <div
        ref={r => (fakeAdBanner = r)}
        style={{ height: '1px', width: '1px', visibility: 'hidden', pointerEvents: 'none' }}
        className="adBanner"
      />
      Adblock!
    </div>
  )
}

export default AdblockDetect

以上所有的答案都是有效的,但大多数将不适用于dns级别的广告拦截。

dns级别的广告拦截器(如π -hole)基本上会返回NXDOMAIN(domain不存在)的广告拦截域列表(例如telemetry.microsoft.com将“不存在”当它存在时)。

有几种方法可以避免这种情况:

方法A:根据ip地址而不是域名请求广告。

这种方法有点烦人,因为您必须跟踪ip地址。如果您的代码没有得到很好的维护或定期更新,这将会产生问题。

方法B:阻塞所有失败的请求——即使客户端报告NXDOMAIN。

如果它是一个“合法的”NXDOMAIN,这会让用户非常恼火。

我用jquery最简单的解决方案是:

$.ajax({
    url: "/scripts/advertisement.js", // this is just an empty js file
    dataType: "script"
}).fail(function () {
    // redirect or display message here
});

advertising .js什么都不包含。当有人使用adblock时,它失败了,函数被调用。