为什么我需要使用document.write而不是DOM操作方法?

时间:2013-12-18 20:07:35

标签: javascript ads document.write

我正在尝试新的广告服务,据我所知,他们没有提供加载广告的功能界面。我们希望根据用户的屏幕尺寸显示不同的广告尺寸,此服务要求您为每种尺寸加载不同的.js网址。

我最初尝试写作:

<script type="text/javascript"><!--
    var dochead = document.getElementsByTagName('head')[0];
    var newscript = document.createElement('script');
    newscript.type = "text/javascript";
    newscript.src = '//ads-by.madadsmedia.com/tags/22430/9194/async/' + (screen.width >= 1360 ? '160' : '120') + 'x600.js';
    dochead.appendChild(newscript);
    //-->
</script>

但我只是得到一个空白页面。我查看了Chrome开发人员工具,似乎正在正确加载他们的脚本。他们的脚本加载了谷歌的其他脚本,他们也出现在DOM中。但是没有广告形象。

当我将脚本更改为:

<script language="JavaScript" type="text/javascript">
var prot = document.location.protocol;
var adwidth = (screen.width >= 1360 ? '160' : '120');
document.write('<script language="JavaScript" type="text/javascript"'); document.write('src="'+prot+'//ads-by.madadsmedia.com/tags/22430/9194/async/'+adwidth+'x600.js">'); document.write('<\/scr' + 'ipt>');
</script>

它运作正常。我一般不喜欢使用document.write,我想知道为什么在这种情况下需要它?广告服务的脚本广泛使用document.write,这是为什么?

3 个答案:

答案 0 :(得分:4)

因为他们正在使用document.write()

http://ads-by.madadsmedia.com/tags/22430/9194/async/160x600.js

if (!window.ActiveXObject){
  document.write("<div style=\"text-align: center; margin: 0px auto; width:160px; height:600px; position:relative;\">");
// etc.

如果document.write()没有在线运行并且主动“打开”文档,它将破坏那里的内容。因此,在加载后运行脚本会用他们的内容覆盖您的内容。

答案 1 :(得分:2)

如果文档正在加载其就绪状态是交互式的,但是body元素尚未被完全解析。您不能将子项添加到尚未加载的元素。它会导致错误,脚本会停止。

dochead.appendChild(newscript);

快速解决方法是使用body.onload事件运行您的函数。将脚本移动到页面底部可能会有效,但在包含Internet Explorer和操作不当的浏览器的世界中,我认为这不可靠。

答案 2 :(得分:2)

如果他们的脚本使用document.write,则可能会导致页面变为空白,因为它会覆盖流。

document.write clears page

您可以覆盖document.write作为修复:(但我不会.....)

How to deal with document.write in a script that's added after a page has loaded?