代码之家  ›  专栏  ›  技术社区  ›  chakrit Dutchie432

Javascript外部脚本加载异常

  •  0
  • chakrit Dutchie432  · 技术社区  · 17 年前

    通过添加对第一个集合的引用并创建主条目对象来调用应用程序。

    <script src="/app/default.aspx" type="text/javascript"></script>
    
    <script type="text/javascript>
    
        var ax;  
    
        // <body onload="OnLoad()">
        function OnLoad() {
            ax = new MyApp(document.getElementById("axTargetDiv"));
        }
    
    </script>
    

    在第一组脚本的末尾(默认.aspx)以下是 准确的 代码:

    function Script(src) {
        document.write('<script src="' + src + '" type="text/javascript"></script>');
    }
    
    Script("set1.aspx?v=" + Settings.Version);
    

    它加载第二组脚本(set1.aspx)。这在所有主流浏览器(IE6-8firefox Safari Opera Chrome)中都能正常工作。

    但是,由于我一直在安静地处理这个脚本,我想在很多地方简化函数调用,并错误地内联了上面的脚本函数,导致以下代码:

    document.write('<script src="set1.aspx?v=' + Settings.Version + '" type="text/javascript"></script>');
    

    MyApp is not defined.
    

    这种情况发生在生产线上: ax = new MyApp(... 萤火虫报告了。

    document.write('script')

    如果我把 document.write 一个函数中的行,它有效,否则就不行。发生什么了?

    拆分和/或转义脚本文本不起作用。

    4 回复  |  直到 17 年前
        1
  •  4
  •   bobince    17 年前

    <script type="text/javascript">
        document.write('<script src="set1.aspx?v=1234" type="text/javascript"></script>');
    </script>
    

    因此,一个HTML解析器会出现并看到开始的<script>标记。在<script>内部,正常的<tag>解析被禁用(在SGML术语中,元素具有CDATA内容)。若要查找脚本块的结束位置,HTML解析器将查找匹配的结束标记</script>。

    它找到的第一个是字符串文本中的那个。CDATA解析器不知道HTML语法,因为他们不知道HTML语法。所以你实际上是说:

    <script type="text/javascript">
        document.write('<script src="set1.aspx?v=1234" type="text/javascript">
    </script>
    

    解决这个问题的常见方法是:

    document.write('...</scr' + 'ipt>');
    

    这在技术上仍然是错误的(并且无法验证)。这是因为在SGML中,CDATA元素结束的字符序列实际上并不是</tagname>,而是仍在上面一行中的</tagname>。浏览器通常更宽容,而且在实践中也允许这样做。

    document.write('\x3Cscript src="set1.aspx?v=1234\x26w=5678" type="text/javascript"\x3E\x3C/script\x3E');
    

    (在XHTML中,没有CDATA元素,因此这些字符的含义与包含在普通内容中的含义相同,而脚本块中的字符串“<script>”实际上会创建一个嵌套的脚本元素!在XHTML脚本块中使用<<<![CDATA[节,但它有点难看,通常最好避免在内联脚本中使用这些字符。)

        2
  •  1
  •   Salman Arshad    17 年前

    2) 尝试在内联加载器中断开单词“script”,如下所示:

    <script type="text/javascript">
    document.write('<scr' + 'ipt src="set1.aspx?v=1234" type="text/javascript"></scr' + 'ipt>');
    </script>
    

    或者,使用我从google analytics代码中借用的语法,并成功使用:

    <script type="text/javascript">
    document.write(unescape("%3Cscript src='set1.aspx?v=1234' type='text/javascript'%3E%3C/script%3E"));
    </script>
    
        3
  •  1
  •   Steve Harrison    17 年前

    var script = document.createElement("script");
    script.src = "set1.aspx?v=1234";
    script.type = "text/javascript";
    document.getElementsByTagName("head")[0].appendChild(script);
    

    史蒂夫

        4
  •  0
  •   Norbert B. MJB    17 年前

    如果可以使用JQuery,可以使用以下命令:

    $.getScript("set1.aspx?v=1234");
    

    将此脚本加载到全局脚本中。 确保将响应的contenttype设置为“text/javascript”。

    希望这能帮助。。。