我想创建一个运行第三方脚本的页面,该脚本document.write
在DOM已经完全加载后包含。
我的页面不是XHTML。我的问题是,document.write正在覆盖我自己的页面。(这是它加载DOM后的功能)。
我尝试覆盖document.write函数(与http://ejohn.org/blog/xhtml-documentwrite-and-adsense/类似),但不包括document.write包含部分标记的情况。
一个会破坏上面代码的例子是:
document.write("<"+"div");
document.write(">"+"Done here<"+"/");
document.write("div>");
有没有办法通过JavaScript修改document.write插入点?有没有人有更好的想法如何做到这一点?
发布于 2018-03-02 09:42:42
如果您正在处理第三方脚本,只需更换document.write以捕获输出并将其保存在正确的位置并不够好,因为它们可能会更改脚本,然后您的站点就会中断。
writeCapture.js做你所需要的(完全公开:我是作者)。它基本上重写了脚本标签,以便每个人都捕获它自己的document.write
输出并将其放在正确的位置。使用(使用jQuery)会是这样的:
$(document.body).writeCapture().append('<script type="text/javascript" src="http://3rdparty.com/foo.js"></script>');
在这里,我假设你想追加到身体的尽头。所有的jQuery选择器和操作方法都可以与插件一起使用,所以你可以在任何地方注入它,不管你想要什么。如果这是一个问题,它也可以在没有jQuery的情况下使用。
发布于 2018-03-02 11:06:21
可以覆盖document.write方法。所以你可以缓冲发送到document.write的字符串,并在任何你喜欢的地方输出缓冲区。但是,如果处理不正确,则将脚本从同步更改为异步可能会导致错误。这是一个例子:
简化的document.write替换
(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的内容
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替换的危险是所有可能出现的未知问题。有些甚至无法避开。
document.write("<scr"+"ipt src='http://someadserver.com/adLib.js'></scr"+"ipt>");
adLib.doSomething(); // ReferenceError: adLib is not defined
幸运的是,我还没有发现上述问题,但这并不能保证它不会发生;)
还想尝试一下吗?尝试使用crapLoader(我的)或writeCapture:
您还应该查看iframe。基本上它会创建一个同域iframe,并将所有内容加载到文件中而不是文件中。不幸的是,我还没有找到任何好的库来处理这个问题。
https://stackoverflow.com/questions/-100003554
复制相似问题