jQuery: Evaluate script in ajax response
XML responses from my webapp have both HTML to add to the page AND some have a script to run.
I'm trying to send back XML from my webapp like:
<?xml version="1.0"?>
<doc>
<html-to-insert>
<![CDATA[<p>add me to the page</p>]]>
</html-to-insert>
<script>
<![CDATA[ alert('execute me'); ]]>
</script>
</doc>
What I'm doing now is snapping out the <html-to-insert>
and <script>
CDATA, inserting the html into the page and eval'ing <script>
.
I'm looking for criticism on my approach. Any suggestions from anyone?
Solution 1:
You can use the jQuery library to make the XML request to your backend and also parse it
$(document).ready(function()
{
$.ajax({
type: "GET",
url: "your/url/that/returns/xml",
dataType: "xml",
success: function (xml) {
// xml contains the returned xml from the backend
$("body").append($(xml).find("html-to-insert").eq(0));
eval($(xml).find("script").text());
}
});
});
You can find out more about jQuery here and here
I haven't tested it, but it should work according to this article.
Solution 2:
You'd rather send JSON, it's way easier to interpret. Example:
// Suppose your response is a string:
// { html: "<p>add me to the page</p>, script:"alert('execute me');" }
var obj = eval( "(" + response + ")" ) ;
eval( obj.script ) ;
Solution 3:
This is the best answer that i found. Work perfect:
element.innerHTML = xmlhttp.responseText;
var scriptElements = element.getElementsByTagName('SCRIPT');
for (i = 0; i < scriptElements.length; i ++) {
var scriptElement = document.createElement('SCRIPT');
scriptElement.type = 'text/javascript';
if (!scriptElements[i].src) {
scriptElement.innerHTML = scriptElements[i].innerHTML;
} else {
scriptElement.src = scriptElements[i].src;
}
document.head.appendChild(scriptElement);
}
Thanks to Joseph the Dreamer. Original answer here.
EDIT:
Clarification:
- scripts only run inside
script
tag - added scripts after document load, only take effect if it is added to the
head
tag
Thanks to Deniz Porsuk for the comment to improve the answer