J'ai du mal à trouver une solution sans aucun progrès jusqu'à présent. J'essaie de savoir si l'utilisateur a un AdBlocker et si c'est le cas, je veux afficher un message lui conseillant de le désactiver. Mais, jusqu'à présent, aucun succès.
J'importe mon composant dans mon conteneur principal comme:
import React from 'react';
import PropTypes from 'prop-types'
class DetectAdBlock extends React.Component {
static propTypes = {
pathname: PropTypes.string.isRequired
};
constructor(props) {
super(props);
this.state = {
adBlockDetected: false
}
this.detectAdBlocker = this.detectAdBlocker.bind(this);
}
componentDidMount() {
this.detectAdBlocker();
}
componentWillUpdate(nextProps, nextState) {
if (this.props.pathname !== nextProps.pathname) {
this.detectAdBlocker();
}
}
detectAdBlocker() {
const head = document.getElementsByTagName('head')[0];
const noAdBlockDetected = () => {
this.setState({
adBlockDetected: false
});
}
const adBlockDetected = () => {
this.setState({
adBlockDetected: true
});
}
// clean up stale bait
const oldScript =
document.getElementById('adblock-detection');
if (oldScript) {
head.removeChild(oldScript);
}
// we will dynamically generate some 'bait'.
const script = document.createElement('script');
script.id = 'adblock-detection';
script.type = 'text/javascript';
script.src = '/ads.js';
script.onload = noAdBlockDetected;
script.onerror = adBlockDetected;
head.appendChild(script);
}
noticeContentJSX() {
return (
<div id="adblock-notice">
<div className="message">
<h3>Hey, you!</h3>
<p>Your adblocker is on again.</p>
<button
onClick={this.detectAdBlocker}
>
Check for Adblocker again
</button>
</div>
</div>
);
}
render() {
return (
<div id="adblock-wrapper">
{ this.state.adBlockDetected
? this.noticeContentJSX()
: null
}
</div>
)
}
}
// DetectAdBlock.propTypes = {
// pathname: PropTypes.string.isRequired
// };
DetectAdBlock.defaultProps = {
pathname: ''
}
export default DetectAdBlock;
et puis c'est mon adblocker.js
<DetectAdBlock pathname={window.location.pathname} />
Le problème est qu'il n'y a rien à montrer non plus j'ai activé mon AdBlock.
3 Réponses :
Je vous suggère d'utiliser le package npm react-ad-block-detect :
Installez le package:
import React, { Component } from 'react';
import AdBlockDetect from 'react-ad-block-detect';
class MyComponent extends Component {
render() {
return (
<AdBlockDetect>
<p>Show this if an ad blocker has been enabled.</p>
</AdBlockDetect>
);
}
}
Ensuite, essayez ceci :
npm i react-ad-block-detect
Oui . Je connais ce package, mais je préfère garder mon code propre sans utiliser trop de bibliothèques. Mais fait toujours l'affaire pour quelqu'un. Merci mon pote. À votre santé .
Génial! aucun problème
Je pense que ça devrait être plus facile que ça. Je ne peux pas vraiment tester cela car je travaille avec adblock off, mais quelque chose comme ça devrait fonctionner:
class AdblockDetect extends Component {
state = {
usingAdblock: false,
}
componentDidMount() {
this.setState({ usingAdblock: this.fakeAdBanner.offsetHeight === 0 });
}
render() {
if (this.state.usingAdblock === true) {
return this.props.children;
}
return (
<div
ref={r => (this.fakeAdBanner = r)}
style={{ height: '1px', width: '1px', visiblity: 'none', pointerEvents: 'none' }}
className="adBanner"
/>
);
}
}
class App extends Component {
render() {
return (
<div className="App">
<AdblockDetect>You are using adblock</AdblockDetect>
</div>
);
}
}
Merci mon pote . Il fait parfaitement le travail.
Comment puis-je "réinitialiser" le composant AdblockDetect lors du démontage? De plus, que fait "ref = {r => (this.fakeAdBanner = r)}"?
Pour le contexte, je redirige l'utilisateur au lieu de renvoyer this.props.children à partir du code ci-dessus. Ensuite, je laisse l'utilisateur mettre en pause son adblocker et cliquer sur un bouton qui exécute history.goBack pour le ramener à la page avec les publicités (et le détecteur d'adblock). Cependant, même si adblock est mis en pause, le détecteur adblock est toujours déclenché. Je pense que c'est parce que la hauteur est déjà définie sur 0. J'ai essayé de régler this.fakeAdBanner.style.height (et largeur) à 1px à nouveau sur componentWillUnmount, mais cela ne l'a pas résolu pour moi.
Hm cela semble étrange si le composant était vraiment démonté, êtes-vous sûr qu'il est démonté?
Avec le hook 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