Adsense调用push({})刷新全部广告问题:仅需刷新新增空广告单元
解决无限滚动中仅加载新增Adsense广告单元的问题
问题核心在于调用(adsbygoogle = window.adsbygoogle || []).push({})时未指定目标广告单元,导致Adsense重新加载页面所有广告。要实现仅刷新新增单元,需要在push时传入新增的广告元素作为目标。
修改方案:
- 避免用
innerHTML +=插入广告(这种方式会重新解析DOM,可能引发不必要的重绘),改用DOM API创建并插入广告元素 - 插入后获取新增的
.adsbygoogle元素,在push时通过slot参数指定该元素
修改后的代码:
var totalLoadedPosts = document.querySelectorAll('.post').length; let startCount = 24; const observer = new MutationObserver(function(mutationsList) { mutationsList.forEach(function(mutation) { mutation.addedNodes.forEach(function(addedNode) { if (addedNode.classList?.contains('post')) { totalLoadedPosts = document.querySelectorAll('.post').length; if ((totalLoadedPosts - startCount) === 24) { startCount += 24; // 创建广告容器和元素 const adItem = document.createElement('div'); adItem.className = 'item'; const adIns = document.createElement('ins'); adIns.className = 'adsbygoogle'; adIns.style.display = 'block'; adIns.setAttribute('data-ad-format', 'fluid'); adIns.setAttribute('data-ad-layout-key', 'XXXXXXXXXX'); adIns.setAttribute('data-ad-client', 'ca-pub-2XXXXXXXXXXXXXX9'); adIns.setAttribute('data-ad-slot', 'XXXXXXXXXX'); adItem.appendChild(adIns); document.querySelector('.posts-wrap').appendChild(adItem); // 仅加载新增的广告单元 (adsbygoogle = window.adsbygoogle || []).push({slot: adIns}); } } }); }); });
关键说明:
- 使用
document.createElement和appendChild替代innerHTML +=,能直接获取到新增的ins元素引用 push({slot: adIns})告诉Adsense仅加载指定的广告单元,不会触发全局广告刷新- 修正了变量名拼写错误(
totalLodedPosts→totalLoadedPosts),使用let声明startCount提升变量作用域规范性
内容的提问来源于stack exchange,提问作者user9043146
相关产品推荐
相关产品推荐

