javascript - Why split the <script> tag when writing it with document.write()? -


why sites (or advertisers give clients javascript code) employ technique of splitting <script> and/or </script> tags within document.write() calls?

i noticed amazon well, example:

<script type='text/javascript'>   if (typeof window['jquery'] == 'undefined') document.write('<scr'+'ipt type="text/javascript" src="http://z-ecx.images-amazon.com/images/g/01/javascripts/lib/jquery/jquery-1.2.6.pack._v265113567_.js"></sc'+'ript>'); </script> 

</script> has broken because otherwise end enclosing <script></script> block early. should split between < , /, because script block supposed (according sgml) terminated end-tag open (etago) sequence (i.e. </):

although style , script elements use cdata data model, these elements, cdata must handled differently user agents. markup , entities must treated raw text , passed application is. first occurrence of character sequence "</" (end-tag open delimiter) treated terminating end of element's content. in valid documents, end tag element.

however in practice browsers end parsing cdata script block on actual </script> close-tag.

in xhtml there no such special handling script blocks, < (or &) character inside them must &escaped; in other element. browsers parsing xhtml old-school html confused. there workarounds involving cdata blocks, it's easiest avoid using these characters unescaped. better way of writing script element script works on either type of parser be:

<script type="text/javascript">     document.write('\x3cscript type="text/javascript" src="foo.js">\x3c/script>'); </script> 

Comments

Popular posts from this blog

powershell Start-Process exit code -1073741502 when used with Credential from a windows service environment -

twig - Using Twigbridge in a Laravel 5.1 Package -

c# - LINQ join Entities from HashSet's, Join vs Dictionary vs HashSet performance -