Why do some sites (or advertisers that give clients javascript code) employ a technique of splitting the <script>
and/or </script>
tags up within document.write()
calls?
I noticed that Amazon does this as well, for 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>
The solution Bobince posted works perfectly for me. I wanted to offer an alternative method as well for future visitors:
In this example, I've included a conditional load for jQuery to demonstrate use case. Hope that's useful for someone!
The
</script>
inside the Javascript string litteral is interpreted by the HTML parser as a closing tag, causing unexpected behaviour (see example on JSFiddle).To avoid this, you can place your javascript between comments (this style of coding was common practice, back when Javascript was poorly supported among browsers). This would work (see example in JSFiddle):
...but to be honest, using
document.write
is not something I would consider best practice. Why not manipulating the DOM directly?</script>
has to be broken up because otherwise it would end the enclosing<script></script>
block too early. Really it should be split between the<
and the/
, because a script block is supposed (according to SGML) to be terminated by any end-tag open (ETAGO) sequence (i.e.</
):However in practice browsers only end parsing a CDATA script block on an actual
</script>
close-tag.In XHTML there is no such special handling for script blocks, so any
<
(or&
) character inside them must be&escaped;
like in any other element. However then browsers that are parsing XHTML as old-school HTML will get confused. There are workarounds involving CDATA blocks, but it's easiest simply to avoid using these characters unescaped. A better way of writing a script element from script that works on either type of parser would be:I think is for prevent the browser's HTML parser from interpreting the <script>, and mainly the </script> as the closing tag of the actual script, however I don't think that using document.write is a excellent idea for evaluating script blocks, why don't use the DOM...
Here's another variation I've used when wanting to generate a script tag inline (so it executes immediately) without needing any form of escapes:
(Note: contrary to most examples on the net, I'm not setting
type="text/javascript"
on neither the enclosing tag, nor the generated one: there is no browser not having that as the default, and so it is redundant, but will not hurt either, if you disagree).