2010-04-04 2 views
1

Я сделал этот метод для загрузки функций JavaScript динамически. Он включает файл .js, но когда я вызываю метод, метод говорит, что он не определен. Следующие два файла .js: ajax_object.js и user_manager.js.Ajax Javascript метод не может быть вызван

Предупреждение вне функции считывается и работает, но предупреждения внутри нет.

enter code here 
//ajax_object.js 
//Load a javascript library 
function loadJavascript(src, url){ 

XMLHttpRequestObject=getXmlHttpRequestObject(); 

if(XMLHttpRequestObject){ 

    XMLHttpRequestObject.onreadystatechange = function() 
    { 
     if (XMLHttpRequestObject.readyState == 4){ 


      if (XMLHttpRequestObject.status == 200 || XMLHttpRequestObject.status == 304) { 
       includeJavaScript(src, url, XMLHttpRequestObject.responseText); 
      } 
     } 
    } 

} 

XMLHttpRequestObject.open('GET', url, true); 
XMLHttpRequestObject.send(null); 

    }//end LoadJavaScript 

//Add Library to header 
function includeJavaScript(src, fileUrl, xmlObject) { 
if ((xmlObject != null) && (!document.getElementById(src))){ 
    var documentHead = document.getElementsByTagName('HEAD').item(0); 
    var includeScript = document.createElement("script"); 
    includeScript.language = "javascript"; 
    includeScript.type = "text/javascript"; 
    //includeScript.id = src; 
    includeScript.src=fileUrl.concat(src); 
    includeScript.defer = true; 
    includeScript.text = xmlObject; 
    documentHead.appendChild(includeScript); 
} 
    } 

//user_manager.js 
//First alert is read 
alert("Outside User Manager"); 
    function selectUserManagerModuleType(){ 
XMLHttpRequestObject=getXmlHttpRequestObject(); 
//This doesn't work 
    //throws selectUserManagerModuleType undefined 
alert("Inside The User Manager"); 



    } 
+0

Можете ли вы подтвердить, например, используя вкладку 'net' в Firebug, чтобы скрипт (ы) действительно загрузился? –

+0

Используя сеть, я получаю это: GET user_manager.js 304 Модифицированный Firebug также показывает это: На вкладке «Ответ» появляется скрипт: alert («Внешний менеджер пользователя»); function selectUserManagerModuleType() { \t XMLHttpRequestObject = getXmlHttpRequestObject(); \t // Это не работает \t alert («Внутри Менеджера пользователей»); \t } И если это делает никакой разницы, то скрипт вызывается с помощью PHP после того, как он будет загружен: эхо "<сценарий языка = \" JavaScript \ "> selectUserManagerModuleType();"; – user293313

+0

Интересно, что произойдет, если вы назначили функцию переменной и вызвали ее таким образом ... –

ответ

0

Проблема возникла в связи с асинхронным и синхронным. Решение стало очень простым с JQuery.

function loadJavascript(src, url){ 

    $.ajaxSetup({async: false}); 
    $.getScript(url.concat(src)); 
    $.ajaxSetup({async: true}); 

} 
0

Ваш код немного нечетный, вы оба предоставляете блок сценария src и тело, похоже, содержащее тот же скрипт.

Я вижу два способа сделать это, либо вы просто добавляете блок сценария в заголовок, включая src, no ajax-вызов, необходимый для этого (я никогда не видел этого раньше, поэтому никаких гарантий относительно того, что произойдет) , Или вы загружаете скрипт с помощью ajax-вызова и eval возвращаемого содержимого, вы должны быть осторожны с областью видимости, иначе вы можете получить загруженный скрипт, объявляющий материал в объеме функции, которая выполняет eval, но в противном случае это кекс.

Если заменить вызов includeJavaScript с:

eval("with(window){"+XMLHttpRequestObject.responseText+"}") 

Я не вижу, почему он не должен работать.

Смежные вопросы