You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何延迟执行JavaScript且不移除页面元素?

解决延迟执行JS时页面元素被移除的问题

核心问题出在document.write()的行为差异上:

  • 无延迟执行时,代码大概率在页面加载过程中运行,document.write()只是把内容追加到当前文档流里,不会动已有的元素。
  • 延迟执行时,页面已经完全加载完成,这时候调用document.write()会触发浏览器自动执行document.open(),直接清空整个页面的所有内容,包括你原来的广告元素,再写入新内容。

解决方案:替换document.write()为DOM操作

用标准的DOM方法添加内容,不会清空页面,比如insertAdjacentHTML()、appendChild()等。下面是修改后的代码:

延迟执行的JavaScript代码

const selecteAd = () => {
  const ads = document.querySelectorAll("[data-ad-status]");
  ads.forEach(ad => {
    const statusText = ad.getAttribute("data-ad-status") === "unfilled" ? "Unfilled" : "Filled";
    // 在每个广告元素后面插入结果标题,原元素不受影响
    ad.insertAdjacentHTML('afterend', `<h1>${statusText}</h1>`);
  });
}
// 延迟2秒执行
setTimeout(selecteAd, 2000);
// 如需重复执行可改用setInterval
// setInterval(selecteAd, 2000);

对应的HTML代码

<div class="adsbygoogle" style="display:inline-block;width:336px;height:280px" data-ad-client="ca-pub-1714167228247329" data-ad-slot="8611448539" data-adsbygoogle-status="done" data-ad-status="unfilled"> 
  <img src="https://place-hold.it/338x280" />
</div>

<div class="adsbygoogle" style="display:inline-block;width:336px;height:280px" data-ad-client="ca-pub-1714167228247329" data-ad-slot="8611448539" data-adsbygoogle-status="done" data-ad-status="somethingelse">
  <img src="https://place-hold.it/338x280" />
</div>

额外说明

如果需要把所有结果集中展示,可以先在HTML里加一个容器:

<div id="status-results"></div>

然后修改JS代码,把内容插入到这个容器里:

const selecteAd = () => {
  const resultsContainer = document.getElementById('status-results');
  const ads = document.querySelectorAll("[data-ad-status]");
  ads.forEach(ad => {
    const statusText = ad.getAttribute("data-ad-status") === "unfilled" ? "Unfilled" : "Filled";
    resultsContainer.innerHTML += `<h1>${statusText}</h1>`;
  });
}

内容的提问来源于stack exchange,提问作者Sted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:05:20