【问题标题】:How to deal with document.write in a script that's added after a page has loaded?如何在页面加载后添加的脚本中处理 document.write?
【发布时间】:2012-11-26 08:17:31
【问题描述】:

我遇到了需要动态添加广告脚本标签的情况。

广告本身只是一个简单的脚本标签,其 src 属性指向广告服务器。然后运行的实际代码是一个两步的考验:

首先,有一个document.write(),像这样:

document.write("<iframe id='lctopti2017041855' src='about:blank' style='visibility: hidden;' onload=\"this.style.visibility='visible';\" style='border: 0px; overflow-x: hidden;overflow-y: hidden; width: 100px; height: 400px;' width='100' height='400' scrolling='no' frameborder='0' allowtransparency='true'></iframe>");

接下来,有一个:

document.getElementById('lctopti2017041855').src = 'http://www.reallylongurl.com/blah.php?whatever=whatever'

现在,在页面加载时运行 document.write() 似乎没问题;但是我发现如果我使用相同的初始标签并将其弹出到 $('#somediv').prepend() 中,例如,它会覆盖整个页面。

有什么办法可以解决这个问题吗? iframe id 和后续的广告 url 始终是动态的,并且在初始脚本标记从广告服务器请求 javascript 时生成。如果初始脚本标签包含我需要的所有信息,我可以简单地用 $('#anywhere').prepend() 或其他东西切换 document.write。除了从字面上抓取初始脚本加载的结果然后处理结果之外,我该如何解决这个问题?

有没有办法阻止 document.write() 覆盖页面,而只写它被调用的地方?

【问题讨论】:

  • 去reddit.com或者这个网站,打开js控制台输入'document.write("hello");'看看会发生什么。如果在页面加载时 document.write 存在,那么一切都很好 - 它只是在那个时候写入任何内容。如果您在页面加载后运行它,那么它实际上会创建一个全新的页面并覆盖所有内容。

标签: javascript html dom


【解决方案1】:

这是我之前成功做过的事情

var oldWrite = document.write;
var wHtml="";
document.write=function(str) {
  wHtml+=str;
}
// load adcode
$('#somediv').prepend(wHtml);
// optionally reset
document.write = oldWrite;

如果广告代码也使用 document.write 加载脚本,这可能会失败。 在这种情况下,请使用 iFrame,因为它将包含他们可以做的所有废话

【讨论】:

  • 真聪明,我一定要试试。
  • 哇,我负责维护这个到处使用 DW 的地狱项目(非常糟糕,不是我写的)。我总是在自己正确地重新做整个事情或只是快速修复和扫除地毯下这个可怕的代码污水池之间犹豫不决。先生,您刚刚为我节省了 3-4 天的时间,无需重新完成整个项目……直到下一次维护。
  • @NicolasMoise 我在我的网站(在我的个人资料中)接受贝宝和比特币;)
【解决方案2】:

如果文档已加载,document.write 将刷新整个页面。所以它不应该放在加载文档后调用的函数中。

如果你想要更多的动作,我认为你可以换成其他方法。

http://javascript.info/tutorial/document-write 一些关于document.write 的信息显示在这里。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2015-02-28
    • 2014-03-10
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多