В своем приложении React Native я использую WebView для отображения рекламы Google (AdSense) с помощью свойства "injectedJavascript".Проблема в том, что я не могу знать высоту объявления заранее.Поэтому я сначала задаю ему случайную высоту, и когда его стиль обновляется, я планирую правильно установить его высоту.
Я предполагаю, что должен получить высоту во введенном коде JS, а затем использую окно.postMessage () "метод для отправки его в WebView через опору" onMessage ".
MutationObserver в сочетании с обещаниями кажется очень подходящим для этого случая.На данный момент я хотел бы просто получить сообщение от веб-просмотра.Так что это мой код прямо сейчас, но сообщение не отправляется:
export default class App extends Component {
constructor(props) {
super(props);
}
_onMessage(e) {
console.warn(e.nativeEvent.data);
}
render() {
const jsCode = `
window._googCsa('ads', pageOptions, adblock1);
function waitForAdSense(id) {
var config = {
attributes: true,
attributeFilter: ['style'],
};
return new Promise((resolve, reject) => {
var adSenseElement = document.body.getElementById(id);
if (adSenseElement.style) {
resolve(adSenseElement.style.height);
return;
}
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.attributeName === 'style') {
observer.disconnect();
resolve(adSenseElement);
return;
}
});
});
observer.observe(adSenseElement, config);
});
}
waitForAdSense('afscontainer1').then(height => {
window.postMessage(height, '*');
});
`;
return (
<ScrollView>
<WebView
key={'AdSense'}
ref={'webview2'}
style={{ height: 300 }}
source={{
uri: isAndroid
? 'file:///android_asset/widget/adSense.html'
: './widget/index.html',
}}
javaScriptEnabled={true}
mixedContentMode="compatibility"
injectedJavaScript={jsCode}
scrollEnabled={false}
domStorageEnabled={true}
onMessage={this._onMessage}
scalesPageToFit
startInLoadingState={true}
automaticallyAdjustContentInsets={false}
/>
;
</ScrollView>
);
}
}
Хотя я могу заставить его работать с этим кодом, но setTimeout - не лучшее решение:
window._googCsa('ads', pageOptions, adblock1);
var adSenseContainer = document.getElementById("afscontainer1");
setTimeout(function(){ window.postMessage(adSenseContainer.style.height, '*'); },1000);
Doу тебя есть идеи?Я думаю, что моя функция waitForAdSense () может быть как-то прослушена.Заранее спасибо!