如何在一页网站中处理基于document.write()的广告代码?

时间:2012-09-05 11:47:25

标签: javascript document.write

我在jQueryMobile上编写了一个用于iPhone / Android构建的网站。这意味着没有页面刷新。而是将所有网站呈现为一个页面,并且只有URL末尾的#标签更改并导致页面转换。

现在,我想从我们的广告合作伙伴中嵌入基于JavaScript的广告代码。此脚本代码通过document.write()将广告(基于图片或基于广告的广告)写入网站。

示例:

<script>
 for (var i in adTags){
  var adTag = adTags[i];
  var jscode = adTag.jscode; // Contains document.write() call in <script> Block
  var container = $("#" + adTag.containerId);
  container.html(jscode);
 }
</script>

问题在于,虽然document.write()在页面刷新的静态网站上运行良好,但是在HTML文档完全加载后动态调用document.write()会导致单页网站被彻底销毁,将清空<body>标记。

示例:

假设我的HTML之前看起来像这样:

<html>
 <head>
  <title>Foo</title>
 </head>

<body>
 Hello World
 <div id="ad1"></div>
 <div id="ad2"></div>
</body>

</html>

运行上面的JavaScript代码后,我的身体看起来像这样:

<body>
    <img src="http://www.adserver.com/foo.png">
</body>

如您所见,document.write()完全删除了<body>的所有内容。这是不容忍的。

那么,我是否解决了这个问题?


注意:我已经尝试通过覆盖document.write()来解决此问题:

<script>
 var currentContainer = null;

 document.write = function(code){
  currentContainer.html(code);
 }

 for (var i in adTags){
  var adTag = adTags[i];
  var jscode = adTag.jscode; // Contains document.write() call in <script> Block
  var container = $(adTag.containerId);
  currentContainer = container;
  eval(jscode);
 }
</script>

现在,虽然这在第一眼看上去很有效,但问题是AdTag调用document.write()会加载另一段JavaScript,如下所示:

<script src="http://www.adserver.com/more.js"></script>

此js文件包含另一个document.write()调用,它将再次调用我的自定义(覆盖)document.write()函数。现在的问题是,在此期间我的for()循环继续并更改了变量currentContainer的内容,然后我的自定义document.write()函数将新内容写入错误的div容器。

1 个答案:

答案 0 :(得分:0)

我发现在iframe中运行广告代码是最佳解决方案。