代码之家  ›  专栏  ›  技术社区  ›  kender DaveL

<script>在javascript code document.write()中

  •  9
  • kender DaveL  · 技术社区  · 15 年前

    我在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);
    

    但即使是在火狐中,代码也不会被加载(使用Firebug进行检查甚至看不到)。


    经过检查,我发现问题是由 <script> 元素与A src= 属性已定义。如果我添加一个内联脚本,比如:

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

    在我的内心 document.write() ,窗口打开,警报框出现,一切正常。

    但使用

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

    IE在打开新窗口时会暂停,继续使用100%的CPU。

    5 回复  |  直到 10 年前
        1
  •  6
  •   Gabriel McAdams    15 年前

    此代码适用于我:

    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");
    

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

        2
  •  5
  •   MetaCipher    15 年前

    谷歌分析就是这样做的:

    var _gat,gajshort=((“https:”)== 文档。位置。协议)? “ https://ssl “:” http://www “” document.write(unescape(“%3cscript src=''+gajshort+ “google analytics.com/ga.js” type='text/javascript'%3e%3c/脚本%3e”);

        3
  •  1
  •   Sergey Galashyn    15 年前

    认为基于DOM的代码很好,但是尝试(a)使用绝对脚本URL,(b)设置脚本类型和(c)在附加后更新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();
       }
    }
    

    在这里 回调 实际上是要执行的函数。

        4
  •  1
  •   Gregory Pakosz    15 年前

    看一看 writeCapture.js

    帮助Ajax加载包含使用document.write的脚本标记的HTML的实用工具

        5
  •  1
  •   Jon B    10 年前

    我知道这是一个4y/o线程,但我想添加一个修复程序,我只是通过几个不同的文章/问题进行组合:

    我没有在document.write调用后附加文档(.css,.js等),而是将打开的调用改为如下:

    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)
    

    添加“//”将自动设置协议(HTTP vs HTTPS)和document.domain=well,即您的域。本质上,这在IE中正确地设置了地址栏,以便使用 /foo/bar.js 类型SRC和HREF将被定位并正确工作。

    希望这能帮助别人!P