Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-控制document.write的插入点_Javascript_Document.write - Fatal编程技术网

JavaScript-控制document.write的插入点

JavaScript-控制document.write的插入点,javascript,document.write,Javascript,Document.write,我想创建一个运行第三方脚本的页面,该脚本包含文档。在DOM完全加载后编写 我的页面不是XHTML。我的问题是document.write正在覆盖我自己的页面。(这是加载DOM后的操作) 我尝试重写document.write函数(以类似的方式),但这不包括document.write包含部分标记的情况 打破上述规则的一个例子是: document.write("<"+"div"); document.write(">"+"Done here<"+"/"); document.w

我想创建一个运行第三方脚本的页面,该脚本包含
文档。在DOM完全加载后编写

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

我尝试重写document.write函数(以类似的方式),但这不包括document.write包含部分标记的情况

打破上述规则的一个例子是:

document.write("<"+"div");
document.write(">"+"Done here<"+"/");
document.write("div>");
document.write(“+”在这里完成”);

有没有办法通过JavaScript修改document.write插入点?是否有人对如何进行此操作有更好的想法?

编辑前的原始答案:


基本上,
document.write的问题在于它。因此,最广泛的解决方案(尽管看起来很苛刻)是不在页面中使用XHTML/xml。由于IE+XHTML和谷歌Adsense的崩溃(可能是件好事),以及向HTML5的普遍转变,我认为这并不像看上去那么糟糕

但是,如果您真的希望在页面中使用XHTML,那么您链接到的John脚本是目前为止最好的。只需在服务器上嗅探IE即可。如果请求来自IE,不要做任何事情(也不要提供
应用程序/xhtml+xml
mimetype!)。否则,将其放入页面的
,您就可以开始比赛了


重读你的问题,你对约翰的剧本有什么特别的问题吗?众所周知,Safari 2.0会失败,但仅此而已。

为了在DOM呈现后更改页面内容,您需要使用javascript库在某些点(jQuery、mootools、prototype等)附加HTML或文本,或者只使用每个DOM元素的innerHTML属性来更改/附加文本。这可以跨浏览器工作,并且不需要任何库。

有更好的方法可以做到这一点。 两种方式

1) 附加


window.onload=函数(){
var el=document.createTextNode(“hello world”);
文件.正文.附件(el);
}
2) InnerHTML

<html><head><script>
  window.onload = function () {
    document.body.innerHTML = 'hello world';
  }
</script></head><body></body></html>

window.onload=函数(){
document.body.innerHTML='hello world';
}
您可能对允许使用document.write after window.onload加载第三方脚本的内容感兴趣。在内部,该库重写document.write,动态附加DOM元素,运行任何包含的脚本,这些脚本也可能使用document.write

与John Resig的解决方案(这是我自己代码灵感的一部分)不同,我开发的模块支持部分编写,例如您使用div给出的示例:

document.write("<"+"div");
document.write(">"+"Done here<"+"/");
document.write("div>");
document.write(“+”在这里完成”);
在解析和呈现标记之前,我的库将等待脚本结束。在上面的示例中,它将使用完整字符串
“Done here”
运行一次,而不是使用部分标记运行三次


我已经准备好了

如果您处理的是第三方脚本,简单地替换document.write来捕获输出并将其粘贴到正确的位置是不够的,因为他们可能会更改脚本,然后您的站点就会崩溃

做你需要的(完全披露:我是作者)。它基本上重写脚本标记,以便每个标记都捕获自己的
文档。编写
输出并将其放在正确的位置。用法(使用jQuery)类似于:

$(document.body).writeCapture().append('<script type="text/javascript" src="http://3rdparty.com/foo.js"></script>');
$(document.body).writeCapture().append(“”);

这里我假设您希望附加到主体的末尾。所有jQuery选择器和操作方法都将与该插件一起使用,因此您可以将其注入任何地方,并以任何方式注入。如果有问题,也可以在没有jQuery的情况下使用它。

可以重写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";

})();
的内容

var flashAdObject=“…”;
文件。填写(“”);
//由于我们缓冲数据,getElementById将失败
var-example=document.getElementById(“示例”);
example.innerHTML=flashAdObject;//ReferenceError:未定义示例
我已经记录了我在编写和使用文档时遇到的不同问题。编写替换:

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

document.write("<scr"+"ipt src='http://someadserver.com/adLib.js'></scr"+"ipt>");
adLib.doSomething(); // ReferenceError: adLib is not defined
document.write(“”);
adLib.doSomething();//ReferenceError:未定义adLib
幸运的是,我没有在野外遇到上述问题,但这并不保证它不会发生;)

还想试试吗?尝试(我的)或:


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

FWIW,我发现这是最近最好的选择-它可以像一个符咒一样包装一个讨厌的广告呈现模块,允许我们的页面加载而不被阻止。

是否下载了第三方脚本,您可以编辑它?我认为这可能是一个比破解
document.write()
更好的解决方案,我的例子确实通过了。我的意思是:document.write(“+”文本内容“+”)我可以编辑它,但除了完整的JS解析之外,还有什么方法可以保证编辑后的代码能够正常工作吗?我的页面没有使用XHTML,但我在加载DOM后加载第三方脚本,它们会覆盖我的页面。我的问题是以下代码将失败:document.write(“+”文本内容“+”)@yeeeev:哇,这和XHTML无关?你真的应该把这些代码作为代码片段放到你的问题中,这样我们就可以
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("<scr"+"ipt src='http://someadserver.com/adLib.js'></scr"+"ipt>");
adLib.doSomething(); // ReferenceError: adLib is not defined