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