Senza usare un array globale non riesco.
Il seguente script è corretto, funziona bene, ma utilizza l'array globale "scripts".
Se mi sai dire come andrebbe scritta la funzione "findScript" senza l'uso di un array globale allora elimino "scripts".
codice:
/**
*
* DESCRIPTION
*
* This script allows you to load the JavaScript scripts,
* after checking that they are not already loaded.
*
* ****************************************************************
*
* EXAMPLE
*
* loadScript('./script_1.js');
* loadScript('./script_2.js','f2');
* loadScripts(new Array('./script_3.js','./script_4.js'));
* loadScripts(new Array('./script_5.js','./script_6.js'), 'f6');
*/
var scripts = new Array(); // array (list of script name)
/**
* Initialize "scripts" array.
*/
$(document).ready(function() {
$('head > script').each(function(index, elt) {
scripts.push($(elt).attr("src"));
});
});
/**
* If it is not already loaded, load a javascript script.
* If the "callback" parameter is defined, executes "callback" after the script is loaded.
*
* @access : public
* @param : [src] string (script name)
* @param : [callback] string (optional: function string)
*/
function loadScript(src, callback) {
if(findScript(src)) {
if(callback != undefined)
eval(callback+'();');
} else {
scripts.push(src);
$.getScript(src, function(data, textStatus) {
if(callback != undefined)
eval(callback+'();');
});
}
}
/**
* If it are not already loaded, load a list of javascript scripts.
* If the parameter "callback" is defined, after all scripts have been loaded execute "callback".
*
* @access : public
* @param : [srcList] array (list of script name)
* @param : [callback] string (optional: function name)
*/
function loadScripts(srcList, callback) {
loadRecursive(srcList, callback, 0);
}
/**
* If it are not already loaded, load a list of javascript scripts.
* If the parameter "callback" is defined, after all scripts have been loaded execute "callback".
*
* @access : private
* @param : [srcList] array (list of script name)
* @param : [callback] string (optional: function name)
* @param : [i] int (index of srcList)
*/
function loadRecursive(srcList, callback, i) {
if(i == srcList.length) {
if(callback != undefined)
eval(callback+'();');
} else {
if(findScript(srcList[i])) {
loadRecursive(srcList,callback, i+1);
} else {
scripts.push(srcList[i]);
$.getScript(srcList[i], function(data, textStatus) {
loadRecursive(srcList,callback, i+1);
});
}
}
}
/**
* Find a script in "scripts" global array.
*
* @access : private
* @return : bool
* @param : [src] string (script name)
*/
function findScript(src) {
for(var i = 0; i < scripts.length; i++)
if(scripts[i] == src)
return true;
return false;
}
html di test:
codice:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="lazy_loader.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function() {
loadScript('./script_1.js');
loadScript('./script_2.js','f2');
loadScripts(new Array('./script_3.js','./script_4.js'));
loadScripts(new Array('./script_5.js','./script_6.js'), 'f6');
});
</script>
</body>
</html>
Tutti i file di test "script_N.js" contengono semplicemente:
codice:
alert("caricato");
function fN() { alert("fN"); }