我使用此方法动态加载JavaScript函数。它确实包含.js
文件,但是当我调用一个方法时,该方法表明它是未定义的。以下两个.js
文件为ajax_object.js
和user_manager.js
。
该函数外部的警报被读取并起作用,但内部的警报不会。
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 :(得分:0)
问题来自异步vs同步。使用JQuery,解决方案变得非常简单。
function loadJavascript( src, url ){
$.ajaxSetup({async: false});
$.getScript(url.concat(src));
$.ajaxSetup({async: true});
}
答案 1 :(得分:0)
你的代码有点奇怪,你们都给脚本块一个src和一个正文,看似包含相同的脚本。
我看到有两种方法可以做到这一点,要么只是在标题中添加一个脚本块,包括一个src,不需要ajax调用(之前我从未见过这样做,所以不能保证会发生什么)。或者你使用ajax调用加载脚本并且eval返回的内容,你必须要注意范围,否则你可能最终让下载的脚本在eval的函数范围内声明了东西,但是否则它是pice of pice饼。
如果用以下内容替换includeJavaScript调用:
eval("with(window){"+XMLHttpRequestObject.responseText+"}")
我不明白为什么它不起作用。