0

我在 jQueryMobile 之上为 iPhone/Android 编写了一个网站。这意味着没有页面刷新。相反,所有站点都呈现在一个页面中,并且只有 URL 末尾的主题标签会更改并导致页面转换。

现在我想嵌入来自我们的一位广告合作伙伴的基于 JavaScript 的广告代码。此脚本代码通过将广告(图像或基于 js 的广告)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()在页面刷新的静态站点上运行良好,但单页网站会被完全破坏,因为document.write()在 HTML 文档完全加载后的动态调用会清空<body>标签。

例子:

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

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

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

</html>

运行上面的 JavaScript 代码后,我的 body 如下所示:

<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 容器。

4

1 回答 1

0

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

于 2013-01-08T14:45:38.147 回答