This page shows you how to use javascript (js) to insert a html that contains js code and have that js code run.
If you don't know how to insert a element using js, see:
Adding HTML Content with Javascript.
The Problem
There are lots js based widgets today. For example,
web share widget,
Google search widget,
Comment widget,
twitter, facebook, amazon ads... etc. They let you easily add functionality to your site.
If your webpage is static html, or generated by php or content
manager software, you can directly include these widgets at the right
place at the server side. However, sometimes it is convenient to use a
js to insert them. Because, you may want the location of the widget to
be different for different pages. Or, only centain pages you want to
include the widget, but you don't know which until the page is
generated.
So, the solution is to use a client side js that insert these js widgets.
If you use a javascript to insert a js code xyz, will the newly inserted xyz script run?
It depends on how you construct the element to be inserted. If the
「<script...>...</script>」 is constructed using 「innerHTML =
...」, then it won't work. But if it is constructed as a DOM element,
then it'll work.
Using innerHTML Does Not Work
First, let's see what happens if you don't do anything special.
Suppose you want to use js to insert the following js code.
<div class="xyz">
<p>Fantastic!</p>
<script type="text/javascript">alert("woot!");</script>
</div>
Suppose you do it this way:
var myElement = document.createElement("div");
myElement.setAttribute("class", "xyz");
myElement.innerHTML='<p>Fantastic!<\/p> <script type="text/javascript">alert("woot!");<\/script>';
document.body.insertBefore(myElement, (document.getElementsByTagName("p"))[0]);
It will fail in IE8, Google Chrome, Opera. (but works in Firefox 3.6.12).
You can see what your browser do here: insert_js.html.
For a version where each js file is on its own page, see: js_insert_js.html.
Creating 「<script>」 Object by createElement
Here's how to make it work. It's easy. Instead of using
「myElement.innerHTML="<script>...</script>";」, you should
create the �script� element as a DOM object, then you insert this
object.
Here's a sample js code:
var ele = document.createElement("script");
ele.type = "text/javascript";
ele.innerHTML='alert("woot!");'
document.body.insertBefore(ele, (document.getElementsByTagName("p"))[0]);
Here's a test page using this code: js_insert_js_works.html.
Twitter Example
Suppose you want to insert this code:
<div class="twtr">
<a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="xah_lee">Tweet</a>
<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
</div>
It's a widget that shows a Twitter button with number of tweets of the page.
Here's how you do it in your js:
function insertTwitter (cg) {
var mdv = document.createElement("div");
mdv.setAttribute("class", "twt");
mdv.innerHTML='<a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="xah_lee">Tweet</a>';
var ele = document.createElement("script");
ele.type = "text/javascript";
ele.src = "http://platform.twitter.com/widgets.js";
mdv.appendChild(ele);
document.body.insertBefore(mdv, cg);
}
insertTwitter((document.getElementsByTagName("p"))[0]);
Thanks to �idealmachine� and DVK. stackoverflow.com.
|