JQuery не распознает функцию, когда она добавляется позже

0

Ниже приведен фрагмент моего 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" );   
    });
}
Теги:

1 ответ

2
Лучший ответ

Когда вы создаете <script> подобный этому, скрипт загружается асинхронно, обычно после того, как ваш код Javascript возвращается в основной цикл событий. Таким образом, функции, определенные сценарием, будут недоступны сразу после loadjscssfile.

Вы должны использовать $.getScript() jQuery $.getScript(). Он выполняет функцию обратного вызова, которая будет вызываться после загрузки сценария.

Кроме того, ваша проверка $.isFunction(funcCall). funcCall - это строка, подобная "helloWorld()", а строка не является функцией. Если вы хотите узнать, загружена ли функция, вам нужно будет выполнить $.isFunction(window[data.action]). data.action - это имя функции, а window[data.action] получает значение глобальной переменной с этим именем.

  • 0
    Спасибо за четкое объяснение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню