2010-04-04 52 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+"}") 

我不明白爲什麼它不應該工作。