2010-04-04 69 views
1

我使这个方法动态加载JavaScript函数。它包含.js文件,但是当我调用一个方法时,该方法说明它是未定义的。以下两个.js文件是ajax_object.jsuser_manager.jsAjax 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

您能否确认,例如使用Firebug中的'net'选项卡,脚本真的被加载了吗?使用net – 2010-04-04 16:40:55

+0

,我得到这样的: GET user_manager.js 304修改 萤火虫也说明这一点: ”; – user293313 2010-04-04 17:16:31

+0

我想知道如果将函数赋值给一个变量并以这种方式调用它会发生什么...... – 2010-04-04 17:30:28

回答

0

问题来自于asychnrounous vs sychronous。使用JQuery解决方案变得非常简单。

function loadJavascript(src, url){ 

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

} 
0

你的代码有点奇怪,你都给脚本块一个src和一个body,看起来包含相同的脚本。

我看到了这样做的两种方法,无论是简单地添加一个脚本块到头部包括一个src,没有ajax调用这需要(我从来没有见过这样做之前,所以不保证会发生什么) 。或者您使用ajax调用来加载脚本并评估返回的内容,您必须小心范围,否则最终可能会让下载的脚本在执行eval的函数范围内声明一些东西,但除此之外它是蛋糕。

如果你更换了与includeJavaScript电话:

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

我不明白为什么它不应该工作。