Javascript external script loading strangeness

后端 未结 4 947
灰色年华
灰色年华 2021-01-16 20:07

I\'m maintaining a legacy javascript application which has its components split into 4 JS files.

They are \"Default.aspx\", \"set1.aspx\", \"set2.aspx\" and \"set3.a

相关标签:
4条回答
  • 2021-01-16 20:39

    If you could use JQuery you could use the following:

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

    This loads the script into the global javascript context. Make sure you set contenttype of the response to "text/javascript".

    Hope this helps...

    0 讨论(0)
  • 2021-01-16 20:49

    You could also try:

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

    Steve

    0 讨论(0)
  • 2021-01-16 21:00

    To see the problem, look at that top line in its script element:

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

    So an HTML parser comes along and sees the opening <script> tag. Inside <script>, normal <tag> parsing is disabled (in SGML terms, the element has CDATA content). To find where the script block ends, the HTML parser looks for the matching close-tag </script>.

    The first one it finds is the one inside the string literal. An HTML parser can't know that it's inside a string literal, because HTML parsers don't know anything about JavaScript syntax, they only know about CDATA. So what you are actually saying is:

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

    That is, an unclosed string literal and an unfinished function call. These result in JavaScript errors and the desired script tag is never written.

    A common attempt to solve the problem is:

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

    This is still technically wrong (and won't validate). This is because in SGML, the character sequence that ends a CDATA element is not actually ‘</tagname>’ but just ‘</’ — a sequence that is still present in the line above. Browsers generally are more forgiving and in practice will allow it.

    Probably the best solution is to escape the sequence. There are a few possibilities, but the simplest is to use JavaScript string literal escapes ('\xNN'):

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

    The above escapes all ‘<’, ‘>’ and ‘&’ characters, which not only stops the ‘</’ sequence appearing in the string, but also allows it to be inserted into an XHTML script block without causing errors.

    (In XHTML, there's no such thing as a CDATA element, so these characters would have the same meaning as if included in normal content, and a string '<script>' inside a script block would actually create a nested script element! It's possible to allow <>& in an XHTML script block by using a <![CDATA[ section, but it's a bit ugly and usually better to avoid using those characters in inline script.)

    0 讨论(0)
  • 2021-01-16 21:03

    1) Assure that you do not try to reference MyApp before the script is "actually" included in your page.

    2) Try breaking the word "script" in your inline loader like this:

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

    Alternatively, use this syntax which i borrowed from google analytics code and have been able to use successfully:

    <script type="text/javascript">
    document.write(unescape("%3Cscript src='set1.aspx?v=1234' type='text/javascript'%3E%3C/script%3E"));
    </script>
    
    0 讨论(0)
提交回复
热议问题