Reputation: 5476
Why am I getting...
SyntaxError: unterminated string literal
...in Firefox and...
Uncaught SyntaxError: Invalid or unexpected token
...in Chrome when I run...
$(document).ready(function () {
function addJSBeforeEndBody(code) {
$('body').append('<script>' + code + '</script>');
}
addJSBeforeEndBody('$(document).ready(function() { console.log("I never end up here."); });');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Upvotes: 4
Views: 12445
Reputation: 160211
Break up the string "</script>"
(in the javascript code); it will be interpreted as an actual closing script tag rather than the string literal you intend.
$(document).ready(function () {
function addJSBeforeEndBody(code) {
$('body').append('<script>' + code + '</scr' + 'ipt>');
}
addJSBeforeEndBody('$(document).ready(function() { console.log("It works now."); });');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Upvotes: 9
Reputation: 104780
'<script>'+code.toString()+'<\/script>'
The browser closes the script element when it sees '</script>'
, indicating the script close tag. Escaping the slash keeps the browser in text interpreting mode.
Or breaking it up as mentioned:
"<script>"+code.toString()+"<"+"/script>"
Upvotes: 2