我在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容器。
答案 0 :(得分:0)
我发现在iframe中运行广告代码是最佳解决方案。