Ниже приведен фрагмент моего JS
Он загружает функции JS, если PHP их запрашивает. Но для моего вопроса это не очень важно.
В нижней части моего примера вы найдете: loadjscssfile("js/functions/"+data.action+".js", "js");
Что он делает, так это: пусть data.action = 'helloworld'
загрузит файл: js/functions/helloworld.js И он будет проверять функцию helloworld()
Проблема в последней части helloworld.js загружается. Но когда я делаю: $.isFunction('helloworld')
он не работает.
UPDATE: функция jQuery AJAX делает трюк, ниже также решение
//
// LOAD JS OR CSS
//
var fileref;
function loadjscssfile(filename, filetype){
if (filetype=="js"){ //if filename is a external JavaScript file
fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src", filename);
}
else if (filetype=="css"){ //if filename is an external CSS file
fileref=document.createElement("link");
fileref.setAttribute("rel", "stylesheet");
fileref.setAttribute("type", "text/css");
fileref.setAttribute("href", filename);
}
if (typeof fileref!="undefined"){
document.getElementsByTagName("head")[0].appendChild(fileref);
}
}
//
// SET INIT AJAX FUNCTION
//
function init(i){
$.ajax({
dataType: "json",
url: "ajax.php?i="+i
}).done(function( data ) {
if(data.menu!='N.U.'){
$('.menu').html(data.menu);
}
if(data.container!='N.U.'){
$('.container').html(data.container);
}
if(data.action!='N.U.'){
if(data.action_val!='N.U.'){
var funcCall = data.action + "('" + data.action_var + "');";
} else {
var funcCall = data.action + "();";
}
if($.isFunction(funcCall)){
eval(funcCall);
} else {
//
// function doesnt excist try to load function from dir
//
loadjscssfile("js/functions/"+data.action+".js", "js");
//
// try again
//
if($.isFunction(funcCall)){
eval(funcCall);
} else {
//alert('FATAL ERROR: JS function ('+data.action+') doesnt excist');
}
}
}
}).fail(function(){
alert( "error" );
});
}
РЕШЕНИЕ:
//
// SET INIT AJAX FUNCTION
//
function init(i){
$.ajax({
dataType: "json",
url: "ajax.php?i="+i
}).done(function( data ) {
if(data.menu!='N.U.'){
$('.menu').html(data.menu);
}
if(data.container!='N.U.'){
$('.container').html(data.container);
}
if(data.action!='N.U.'){
if(data.action_val!='N.U.'){
var funcCall = data.action + "('" + data.action_var + "');";
} else {
var funcCall = data.action + "();";
}
if (typeof window[data.action] === "function") {
eval(funcCall);
} else {
//
// function doesnt excist try to load function from dir
//
$.ajax({
url: "js/functions/"+data.action+".js",
dataType: "script"
}).done(function(){
//
// try again
//
if (typeof window[data.action] === "function") {
eval(funcCall);
} else {
alert('FATAL ERROR: JS function ('+data.action+') doesnt excist');
}
});
}
}
}).fail(function(){
alert( "error" );
});
}
Когда вы создаете <script>
подобный этому, скрипт загружается асинхронно, обычно после того, как ваш код Javascript возвращается в основной цикл событий. Таким образом, функции, определенные сценарием, будут недоступны сразу после loadjscssfile
.
Вы должны использовать $.getScript()
jQuery $.getScript()
. Он выполняет функцию обратного вызова, которая будет вызываться после загрузки сценария.
Кроме того, ваша проверка $.isFunction(funcCall)
. funcCall
- это строка, подобная "helloWorld()"
, а строка не является функцией. Если вы хотите узнать, загружена ли функция, вам нужно будет выполнить $.isFunction(window[data.action])
. data.action
- это имя функции, а window[data.action]
получает значение глобальной переменной с этим именем.