如何获取javascript文件中的函数列表?

时间:2010-03-10 16:02:36

标签: javascript xmlhttprequest include

我正在尝试拼凑一个用于javascript的php风格包含功能。我正在采取的路线是通过XMLHttpRequest。将加载包含的文件,但该文件中的函数不可用,因为它们的作用域仅限于调用它们的函数。

我遇到了this article,它实现了类似的目标,但要求编码人员提前指定他们需要的功能,而我想简单地包含一个文件并自动添加窗口对象的功能。

这是我的进步

function twinkle(){

    getXMLHTTPObj("twinkle/test.js");

    // A simple function inside test.js
    includedFunc();

}


// XMLHttp Stuff lifted from he Apple tutorial

var req;
function getXMLHTTPObj(url) {
    req = false;
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest && !(window.ActiveXObject)) {
        try {
            req = new XMLHttpRequest();
        } catch(e) {
            req = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                req = false;
            }
        }
    }

    if(req) {
        req.onreadystatechange = processReqChange;

            // Set to False so javascript waits for the included functions 
            // to become available 
        req.open("GET", url, false);
        req.send("");
    }

    return req;
}

function processReqChange() {
    // only if req shows "loaded"
    if (req.readyState == 4) {
        // only if "OK"
        if (req.status == 200) {
            eval(req.responseText);
        } else {
            alert("There was a problem retrieving the XML data:\n" +
                req.statusText);
        }
    }
}

我正在考虑在每个包含的文件中创建一个函数索引,当包含该文件时可以迭代它,但这不是一个优雅的解决方案。

有什么想法吗?是否有一些我可以访问的javascript属性或函数来获取文件中的函数列表?

4 个答案:

答案 0 :(得分:1)

为什么不创建<script>标签并将其插入页面,而不是通过AJAX加载JavaScript文件?这将允许在全局范围内解析JavaScript。看一下Scriptaculous'require函数如何工作

答案 1 :(得分:1)

更改声明函数的方式,它应该解决范围问题。而不是:

function add(a, b) 
{                     
    return a + b;
} 

这样做:

var add = function(a, b) 
{                     
    return a + b;
}   

答案 2 :(得分:1)

使用DOM添加所需的脚本非常简单:

function include(jsFile)
{
    var sEl  = document.createElement("script");
    sEl.type = "text/javascript";
    sEl.src  = jsFile;
    document.getElementsByTagName("head").appendChild(sEl);
}

浏览器甚至会异步下载此文件,并且脚本元素的onload事件在大多数(所有?)流行的浏览器中都有效,因此如果您愿意,还可以添加回调函数。明显的缺点是,在下载和解析文件之前,函数不会对当前脚本可用。

答案 3 :(得分:1)

OrbMan在这个问题上向我指出了正确的方向,但是这种包含Javascript文件的特定方法的解决方案要求以不同的方式定义函数;像这样

window.myFunction = function(){ 

    alert("Hey There!") 

}

这方面的一个潜在好处是,所包含的文件中被声明为正常方式的任何函数都被封装,因此它们仅可用于该文件中的window.functions ...据我所知。