[英]setTimeout doesn't let me append to innerHTML
我怀疑应该责怪我的代码的setTimeout
部分,但是我可以毫无问题地附加到DOM的document.body
部分。 我究竟做错了什么?
let adblock = document.getElementById(`adblock`); let fake_ad = document.createElement("div"); fake_ad.innerHTML = " "; // Hide it from viewport fake_ad.setAttribute("style", "top: -999px; position: fixed;"); // Add some Adblock bait classes fake_ad.className = "adsbox ad-300x250 banner-ad"; // Append the ad to DOM document.body.appendChild(fake_ad); // Wait 500ms for the adblocker to do its job window.setTimeout(function() { if (fake_ad.offsetHeight === 0) { // Add class .ab to body document.body.classList.add("ab"); // For testing console.log("Adblock is enabled!"); adblock.innerHTML = "present!"; document.body.innerHTML += "Adblock is enabled!"; } else { // For testing console.log("Adblock is disabled!"); document.body.innerHTML += "Adblock is disabled!"; } // Remove the fake ad from DOM document.body.removeChild(fake_ad); }, 500);
<!DOCTYPE html> <html lang=en> <head> <title>test</title> </head> <body> <p>Adblocking is <strong id="adblock"></strong></p> </body> </html>
可能是,在setTimeout
内部执行的代码是在垃圾回收周期删除了fake_ad
之后执行的,因为任何活动函数都不会引用该代码。 您可以尝试将fake_ad
变量传递给setTimeout
调用,因此它具有防止蜜蜂收集垃圾的引用:
window.setTimeout(function(fake_ad) {
...
}, 500, fake_ad);
尝试包装您的JavaScript,以使其在窗口加载后运行。 如果您尝试预先操作DOM,则这些对象将不存在。
就像是:
window.addEventListener('load', function() {
code block here...
}
或者,您可以从脚本标记中删除async
,并将其附加在结束<body>
标记之后和结束<html>
标记之前。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.