首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript - 控制document.write的插入点

JavaScript - 控制document.write的插入点
EN

Stack Overflow用户
提问于 2018-03-02 01:26:46
回答 2查看 0关注 0票数 0

我想创建一个运行第三方脚本的页面,该脚本document.write在DOM已经完全加载后包含。

我的页面不是XHTML。我的问题是,document.write正在覆盖我自己的页面。(这是它加载DOM后的功能)。

我尝试覆盖document.write函数(与http://ejohn.org/blog/xhtml-documentwrite-and-adsense/类似),但不包括document.write包含部分标记的情况。

一个会破坏上面代码的例子是:

代码语言:javascript
复制
document.write("<"+"div");
document.write(">"+"Done here<"+"/");
document.write("div>");

有没有办法通过JavaScript修改document.write插入点?有没有人有更好的想法如何做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2018-03-02 09:42:42

如果您正在处理第三方脚本,只需更换document.write以捕获输出并将其保存在正确的位置并不够好,因为它们可能会更改脚本,然后您的站点就会中断。

writeCapture.js做你所需要的(完全公开:我是作者)。它基本上重写了脚本标签,以便每个人都捕获它自己的document.write输出并将其放在正确的位置。使用(使用jQuery)会是这样的:

代码语言:javascript
复制
$(document.body).writeCapture().append('<script type="text/javascript" src="http://3rdparty.com/foo.js"></script>');

在这里,我假设你想追加到身体的尽头。所有的jQuery选择器和操作方法都可以与插件一起使用,所以你可以在任何地方注入它,不管你想要什么。如果这是一个问题,它也可以在没有jQuery的情况下使用。

票数 0
EN

Stack Overflow用户

发布于 2018-03-02 11:06:21

可以覆盖document.write方法。所以你可以缓冲发送到document.write的字符串,并在任何你喜欢的地方输出缓冲区。但是,如果处理不正确,则将脚本从同步更改为异步可能会导致错误。这是一个例子:

简化的document.write替换

代码语言:javascript
复制
(function() {
    // WARNING: This is just a simplified example
    // to illustrate a problem.
    // Do NOT use this code!

    var buffer = [];
    document.write = function(str) {
        // Every time document.write is called push
        // the data into buffer. document.write can
        // be called from anywhere, so we also need
        // a mechanism for multiple positions if
        // that's needed.
        buffer.push(str);
    };

    function flushBuffer() {
        // Join everything in the buffer to one string and put
        // inside the element we want the output.
        var output = buffer.join('');
        document.getElementById("ad-position-1").innerHTML = output;
    }

    // Inject the thid-party script dynamically and
    // call flushBuffer when the script is loaded
    // (and executed).
    var script = document.createElement("script");
    script.onload = flushBuffer;
    script.src = "http://someadserver.com/example.js";

})();

http://someadserver.com/example.js的内容

代码语言:javascript
复制
var flashAdObject = "<object>...</object>";
document.write("<div id='example'></div>");

// Since we buffer the data the getElementById will fail
var example = document.getElementById("example");
example.innerHTML = flashAdObject; // ReferenceError: example is not defined

我记录了在编写和使用我的document.write替换时遇到的不同问题:https : //github.com/gregersrygg/crapLoader/wiki/What-to-think-about-when-replacing-document.write

但是使用document.write替换的危险是所有可能出现的未知问题。有些甚至无法避开。

代码语言:javascript
复制
document.write("<scr"+"ipt src='http://someadserver.com/adLib.js'></scr"+"ipt>");
adLib.doSomething(); // ReferenceError: adLib is not defined

幸运的是,我还没有发现上述问题,但这并不能保证它不会发生;)

还想尝试一下吗?尝试使用crapLoader(我的)或writeCapture

您还应该查看iframe。基本上它会创建一个同域iframe,并将所有内容加载到文件中而不是文件中。不幸的是,我还没有找到任何好的库来处理这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档