Deferrable document.write

时间:2010-09-01 16:45:30

标签: javascript onload domdocument document.write

很多网络广告提供商都使用旧的document.write方法,在我的案例中是AdTech。 是否可以覆盖document.write方法以在onload事件之后推迟?

4 个答案:

答案 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代码块的所有实例。
  • 您应该使用特定于javascript框架的onload处理程序替换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并推迟加载第三方库本身的脚本标记,确保在更改后测试正确性。

Source