erikvimz
erikvimz

Reputation: 5476

unterminated string literal / Invalid or unexpected token

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

Answers (2)

Dave Newton
Dave Newton

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

kennebec
kennebec

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

Related Questions