Any idea why the piece of code below does not add the script element to the DOM?
var code = "<script></script>";
$("#someElement").append(code);
Any idea why the piece of code below does not add the script element to the DOM?
var code = "<script></script>";
$("#someElement").append(code);
This is what I think is the best solution. Google Analytics is injected this way.
What do you mean "not working"?
jQuery detects that you're trying to create a SCRIPT element and will automatically run the contents of the element within the global context. Are you telling me that this doesn't work for you? -
Edit: If you're not seeing the SCRIPT element in the DOM (in Firebug for example) after you run the command that's because jQuery, like I said, will run the code and then will delete the SCRIPT element - I believe that SCRIPT elements are always appended to the body... but anyway - placement has absolutely no bearing on code execution in this situation.
The Good News is:
It's 100% working.
Just add something inside the script tag such as
alert('voila!');
. The right question you might want to ask perhaps, "Why didn't I see it in the DOM?".Karl Swedberg has made a nice explanation to visitor's comment in jQuery API site. I
don'twant to repeat all his words, you can read directlytherehere (I found it hard to navigate through the comments there).The next thing is, I'll summarize what's the bad news by using
.append()
function to add a script.And The Bad News is..
You can't debug your code.
I'm not joking, even if you add
debugger;
keyword between the line you want to set as breakpoint, you'll be end up getting only the call stack of the object without seeing the breakpoint on the source code, (not to mention that this keyword only works in webkit browser, all other major browsers seems to omit this keyword).If you fully understand what your code does, than this will be a minor drawback. But if you don't, you will end up adding a
debugger;
keyword all over the place just to find out what's wrong with your (or my) code. Anyway, there's an alternative, don't forget that javascript can natively manipulate HTML DOM.Workaround.
Use javascript (not jQuery) to manipulate HTML DOM
If you don't want to lose debugging capability, than you can use javascript native HTML DOM manipulation. Consider this example:
There it is, just like the old days isn't it. And don't forget to clean things up whether in the DOM or in the memory for all object that's referenced and not needed anymore to prevent memory leaks. You can consider this code to clean things up:
The drawback from this workaround is that you may accidentally add a duplicate script, and that's bad. From here you can slightly mimic
.append()
function by adding an object verification before adding, and removing the script from the DOM right after it was added. Consider this example:This way, you can add script with debugging capability while safe from script duplicity. This is just a prototype, you can expand for whatever you want it to be. I have been using this approach and quite satisfied with this. Sure enough I will never use jQuery
.append()
to add a script.I want to do the same thing but to append a script tag in other frame!
Another way you can do it if you want to append code is using the
document.createElement
method but then using.innerHTML
instead of.src
.The
</script>
within the string literal terminates the entire script, to avoid that"</scr" + "ipt>"
can be used instead.