I have an index.php file that loads other php files via this javascript/ajax code:
function AJAX(elementID,url,showStatus){
var httpObject;
if (window.ActiveXObject) {
httpObject = new ActiveXObject("Microsoft.XMLHTTP");
}
if (window.XMLHttpRequest){
httpObject = new XMLHttpRequest();
}
else {
alert("Your browser does not support AJAX.");
}
if (httpObject != null) {
httpObject.onreadystatechange = function() {
if (elementID != false){
if (httpObject.readyState == 4 && httpObject.status == 200) {
document.getElementById(elementID).innerHTML= httpObject.responseText;
}
}
}
httpObject.open("POST",url,true);
httpObject.send(null);
}
}
so for example I would load a file in inxex.php by:
<script>
AJAX("updateThisDiv", "/includes/contentpage.php", false)
</script>
which would paste the contents of "contentpage.php" into the div "updateThisDiv" but now if I have any javascript on "contentpage.php", it will not run, is there any way to do this?
I have looked at this: http://www.javascriptkit.com/script/script2/ajaxpagefetcher.shtml but its not exatcly what I was looking for.
I want to be able to update a section of my page without reloading the entire page and javascript must run
If you want to load Javascript on demand. This can be done by dynamically creating script tag. This pattern illustrated in Stoyan Stefanov book - Javascript Patterns
This snipped from the book:
Write a require function. Then call it like this:
require("extra.js", function () {
functionDefinedInExtraJS();
});
Sample require function:
function require(file, callback) {
var script = document.getElementsByTagName('script')[0],
newjs = document.createElement('script');
// IE
newjs.onreadystatechange = function () {
if (newjs.readyState === 'loaded' || newjs.readyState === 'complete') {
callback();
}
};
// others
newjs.onload = function () {
callback();
};
newjs.src = file;
script.parentNode.insertBefore(newjs, script);
}
Live example found in http://www.jspatterns.com/book/8/ondemand.html
@Edit: more details specific to your case. I will try to make things simple:
Create four files:
index.php
<html>
<head>
<script src="code.js"></script>
</head>
<body>
<input type="button" onclick="Ajax('content.php', 'd_html');" value="Fill from content.php"/>
<div id="d_html"></div>
<br>
<input type="button" onclick="Ajax('content.js', 'd_js');" value="Fill from content.js"/>
<div id="d_js"></div>
</body>
</html>
content.php
<span>Hello, I am dynamic span came from content.php</span>
content.js
//Ana javascript code you want to run it by Ajax function should go inside this function
function executeJS(element){
element.innerHTML = "<span>Hello, I am dynamic span came from content.js</span>";
}
code.js
//This function responsible for doing the ajax request for any file that will return pure HTML.
function getHTML(url, element){
var i, xhr, activeXids = [
'MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP',
'Microsoft.XMLHTTP'
];
if (typeof XMLHttpRequest === "function") { // native XHR
xhr = new XMLHttpRequest();
} else { // IE before 7
for (i = 0; i < activeXids.length; i += 1) {
try {
xhr = new ActiveXObject(activeXids[i]);
break;
} catch (e) {}
}
}
xhr.onreadystatechange = function () {
if (xhr.readyState !== 4) {
return false;
}
if (xhr.status !== 200) {
alert("Error, status code: " + xhr.status);
return false;
}
element.innerHTML += xhr.responseText;
};
xhr.open("GET", url, true);
xhr.send("");
}
//This function will load javascript file on-demand and call executeJS function inside that file.
function getJS(url, element, cb){
var newjs = document.createElement('script');
// IE
newjs.onreadystatechange = function () {
if (newjs.readyState === 'loaded' || newjs.readyState === 'complete') {
cb();
}
};
// others
newjs.onload = function () {
cb();
};
newjs.src = url;
element.appendChild(newjs);
}
//This is same as your function, but now can handle both PHP and JS files
function Ajax(url, id){
var element = document.getElementById(id),
regex = /\.js$/;
if(!element){
alert("Invalid ID");
return false;
}
if(regex.test(url)){ //If url ends with JS, load using getJS
getJS(url, element, function(){
executeJS(element);
});
} else {
getHTML(url, element);
}
}