问题
I'm struggling to find a solution without any progress until now . I am trying to catch if the user has an AdBlocker and if it does i want to display a message advising him to turn it off. But , until now no success .
i import my component into my main container like :
<DetectAdBlock pathname={window.location.pathname} />
and then this is my adblocker.js
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;
The problem is that there is nothing to show either i have my AdBlock enabled .
回答1:
I think it should be easier than that. I can't actually test this as I'm at work with adblock off but something like this should work:
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>
);
}
}
回答2:
I suggest you use the npm package react-ad-block-detect
:
Install the package:
npm i react-ad-block-detect
Then try this:
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>
);
}
}
来源:https://stackoverflow.com/questions/55634837/adblock-into-reactjs