很多网络广告提供商都使用旧的document.write方法,在我的案例中是AdTech。 是否可以覆盖document.write方法以在onload事件之后推迟?
答案 0 :(得分:3)
如何使用
答案 1 :(得分:0)
将所有脚本移动到页面底部(在> / body<之前),广告脚本绝对持续,完全不使用domReady(如果您的脚本在所有HTML元素之后放入,则不需要它)做同样的事。实际上,延迟document.write调用甚至可能会破坏整个页面,这取决于广告代码的重要程度。
答案 2 :(得分:0)
你可以输出一个
document.old_write=document.write;
window._bufferedText='';
document.write=function(text) {
window._bufferedText+=text;
}
//now let all the document.write go here
document.write('<h1>');
document.write('Hello World!');
document.write('</h1>');
//alert(window._bufferedText);
//end document.write methods
document.write=document.old_write;
document.write('<div id="deferred-write-placeholder"></div>');
window.onload=function() {
document.getElementById('deferred-write-placeholder').innerHTML=window._bufferedText;
delete window._bufferedText;
}
注意:
document.write
代码块的所有实例。window.onload
。答案 3 :(得分:0)
您可以通过拦截对document.write的调用来实际支持脚本注入,如下所示。诀窍是创建一个“中间人”函数来检查document.write的输入,如果是注入的脚本标记,则将其正确加载到DOM中:
document.writeText = document.write;
document.write = function(parameter) {
if (!parameter) return;
var scriptPattern = /<script.*?src=['|"](.*?)['|"]/;
if (scriptPattern.test(parameter)) {
var srcAttribute = scriptPattern.exec(parameter)[1];
var script = document.createElement('script');
script.src = srcAttribute;
document.head.appendChild(script);
}
else {
document.writeText(parameter);
}
};
显然,这可以进一步缩小,但为了清楚起见,包括变量名称。如果您愿意,可以使用async并推迟加载第三方库本身的脚本标记,确保在更改后测试正确性。