<script> inside javascript code document.write()

9

我得到了一部分嵌入在HTML中的JavaScript代码(由服务器端生成),看起来像这样:

function winWriteMail2(){
  var win = open('','wininfo', 'width=400,height=300,scrollbars=yes,resizable=yes');
  win.document.open();
  win.document.write('<HTML><HEAD><META http-equiv="Content-type" content="text/html; charset=iso-8859-2"><LINK rel="stylesheet" type="text/css" href="/css/main.css">');
  win.document.write('<scr' + 'ipt language="javascript" type="text/javascript" src="/js/JSFILE.js"></scr' + 'ipt>');
  win.document.write('</HEAD><BODY BGCOLOR="#f7f3e7">');
  <!-- window content goes here -->
  win.document.write('</BODY></HTML>');
  win.document.close();
}

这段代码会在点击一个元素时被执行。
对我来说有问题的部分是包含javascript文件 - 在Firefox和Chrome中可以正常工作,但是IE(如我测试的7和8)的行为很奇怪。有了包含JSFILE的那一行,单击后打开的窗口是空的,CPU占用率为100%,唯一的方法是关闭IE。
有人可以帮忙处理这个问题吗?也许我应该使用其他方法将javascript文件插入其中?
我尝试过不使用win.document.write(),而改用DOM操作方法,在win.document.close()之后放置这部分代码:
h = win.document.getElementsByName('head')[0];
js = document.createElement('script');
js.src = '/js/JSFILE.js';
h.appendChild(js);

但是,即使在Firefox中进行检查(使用Firebug进行检查),代码也没有加载(甚至看不到它)。


经过一些检查,我发现问题是由具有定义的 src = 属性的<script>元素引起的。如果我添加内联脚本,例如:

<script type='text/javascript'>alert('foo')</script>

在我的document.write()中,窗口打开,警告框弹出,一切正常。但使用

<script type='text/javascript' src='/js/foo.js'></script>

当打开新窗口时,IE会停顿,并且一直使用100%的CPU。


3
附注:性能提升。使用一条写语句而不是多条。先构建整个HTML字符串,然后再写入窗口。 - epascarello
1
非常感谢提供的信息。我一定会修复它。 - kender
5个回答

6

这段代码对我有效:

function winWriteMail2(){
    var win = open('','wininfo', 'width=400,height=300,scrollbars=yes,resizable=yes');
    win.document.open();
    win.document.write('<HTML><HEAD><META http-equiv="Content-type" content="text/html; charset=iso-8859-2"><LINK rel="stylesheet" type="text/css" href="/css/main.css">');
    win.document.write('</HEAD><BODY BGCOLOR="#f7f3e7">');
    win.document.write('this is the body content');
    win.document.write('</BODY></HTML>');
    win.document.close();

    var h = win.document.getElementsByTagName("head")[0];
    var js = win.document.createElement("script");
    js.type = "text/javascript";
    js.src = "js/scriptfile.js";
    h.appendChild(js);
}

以下是我需要更改您的代码才能使其正常工作的内容:

//From
var js = document.createElement("script");
//To
var js = win.document.createElement("script");

您需要在同一文档中创建脚本元素以进行附加。

5

谷歌分析是这样做的:

var _gat, gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));


1

认为你的基于DOM的代码很好,但尝试使用绝对脚本URL,设置脚本类型并在附加后更新src,这应该使其更可靠地工作:

var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.type = "text/javascript";
head.appendChild(script);
script.src = "http://host.tld/js/JSFILE.js";

希望这能有所帮助。 编辑 顺便说一下,建议设置回调函数,以确保在使用代码之前已加载脚本。代码可以类似于这样:
// most browsers
script.onload = callback;
// IE
script.onreadystatechange = function() {
   if(this.readyState == "loaded"  || this.readyState == "complete") {
      callback();
   }
}

这里的回调函数字面上是要执行的函数。


1
我知道这是一个四年前的帖子,但我想添加一个修复方法,我通过几篇不同的文章/问题结合起来得到了这个方法:
不要在document.write调用之后附加文档(.css、.js等),而是将我的open调用修改为以下形式:
var win = window.open("//"+document.domain, "_blank");//document.domain is the fix
if(win != null)
    win.document.write('...');//insert your content, wherever you got it (hand-coded, ajax, etc)

在 URL 前添加“//”会自动设置协议(http vs https)和文档域名为您的域名。这实际上会在 IE 中正确设置地址栏,以便使用类似 /foo/bar.js 的 src 和 href 可以被正确地定位和工作。
希望这能帮助到某些人!:P

1

看一下writeCapture.js

这是一个实用工具,可以帮助 Ajax 加载包含使用 document.write 的脚本标签的 HTML。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接