JavaScript Document.Write使用AJAXreplace所有的内容

我正在创build一个简单的ajax调用,它检索指定的url的内容并将其写入页面。 我所遇到的问题是用这些信息来取代整个机构内容

这里是JS:

(function(){ var mb = window.mb = {}; function get_ad(url, parameters){ var result = ""; var http_request = false; if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/html'); } } else if (window.ActiveXObject) { // IE var avers = ["Microsoft.XmlHttp", "MSXML2.XmlHttp", "MSXML2.XmlHttp.3.0", "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.5.0"]; for (var i = avers.length -1; i >= 0; i--) { try { http_request = new ActiveXObject(avers[i]); if (http_request){ break; } } catch(e) {} } } if (!http_request) { alert('Cannot create XMLHTTP instance'); return false; } http_request.onreadystatechange = function(){ if (http_request.readyState == 4) { if (http_request.status == 200) { gen_output(http_request.responseText); } else { alert('Error'); } } } http_request.open('GET', url + parameters, true); http_request.send(null); } function gen_output(ad_content){ document.write("<div id=\"mb_ad\">"); document.write(ad_content); document.write("</div>"); } get_ad("http://localhost/test/test.html", ""); })(); 

这里是html:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> i am text before <br/> <script type="text/javascript" src="mb.js"></script> <br /> i am text after </body> </html> 

使用萤火虫进行检查,我没有看到之前的文本或之后的文本,只是<div id="mb_ad">和test.html页面的内容。 如果我删除了Ajax调用,只是做3 document.writes之前的文字和文字将正确显示。 jQuery不是一个选项,我不得不这样做,没有大型图书馆的帮助,因为大小和速度是至关重要的。

一旦文件完成加载,就不能使用document.write 。 如果你这样做,浏览器将打开一个新的文件,取代当前。

使用innerHTML属性将HTML代码放入元素中:

 function gen_output(ad_content){ document.getElementById('mb_ad').innerHTML = ad_content; } 

将该元素放在脚本之前,以确保在调用callback函数时存在该元素:

 i am text before <div id="mb_ad"></div> i am text after <script type="text/javascript" src="mb.js"></script> 

放置脚本的位置并不重要,因为没有任何内容会写入到文档中。

如果你不能控制远程脚本,你可能会写如下的东西:

 <script> var tmp = document.write; document.write = function () { document.getElementById('someId').innerHTML = [].concat.apply([], arguments).join(''); }; </script> <script .....> document.write = tmp; 

那么这是一个讨厌的黑客,但它似乎工作…

 var div = document.createElement('div'); div.id = 'mb_ad'; div.innerHTML = ad_content; 

现在,你可以在任何你想要的地方附加这个节点。

你可以使用<script>document.body.innerHTML+="//Your HTML Code Here";</script>

相同的Leon Fedotov答案,但更多的jQuery

 { var old_write = document.write; var $zone = $('.zone.zone_' + name); // redefine document.write in this closure document.write = function () { $zone.append([].concat.apply([], arguments).join('')); }; // OA_output[name] contains dangerous document.write $zone.html(OA_output[name]); document.write = old_write; } 

我有与下面的代码相同的问题:

 $html[] = '<script> if($("#mf_dialogs").length == 0) { document.write("<div id=\"mf_dialogs\"></div>"); } </script>'; 

以下代码有效地replacedocument.write:

 $html = '<div id="dialogHolder"></div> <script> if($("#mf_dialogs").length == 0) { document.getElementById("dialogHolder").innerHTML="<div id=\"mf_dialogs\"></div>"; } </script>';