Как получить список функций в файле JavaScript? - PullRequest
3 голосов
/ 10 марта 2010

Я пытаюсь собрать вместе функцию включения в стиле php для javascript.Маршрут, по которому я иду, - через XMLHttpRequest.Включенный файл будет загружен, но функции в этом файле недоступны, поскольку их область действия ограничена вызывающей их функцией.

Я натолкнулся на эту статью , которая достигает аналогичной цели, но требует, чтобы кодировщик заранее определил, какие функции им требуются, в то время как я хотел бы просто включить файл и автоматически добавить функцииоконный объект.

Вот мой прогресс

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 ]

1 голос
/ 10 марта 2010

OrbMan указал мне правильное направление, но решение этого конкретного метода включения файлов Javascript требует, чтобы функции были определены по-другому; как это

window.myFunction = function(){ 

    alert("Hey There!") 

}

Потенциальным преимуществом является то, что любые функции во включаемом файле, которые объявлены обычным способом, инкапсулированы, поэтому они доступны только для window.functions из этого файла ... насколько я могу судить.

1 голос
/ 10 марта 2010

Измените способ объявления своих функций, и это должно решить проблему с областью видимости. Вместо:

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

сделать это:

var add = function(a, b) 
{                     
    return a + b;
}   
1 голос
/ 10 марта 2010

Достаточно просто использовать DOM для добавления необходимого скрипта:

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

Браузеры даже загружают этот файл асинхронно, а элементы скрипта имеют событие onload, которое работает в большинстве (всех?) Популярных браузеров, так что вы также можете добавить функцию обратного вызова, если хотите. Очевидным недостатком является то, что функции не станут доступны для текущего скрипта, пока файл не будет загружен и проанализирован.

1 голос
/ 10 марта 2010

Вместо загрузки файла JavaScript через AJAX, почему бы не создать тег <script> и вставить его на страницу? Это позволит анализировать JavaScript в глобальной области видимости. Посмотрите, как работает функция Scriptaculous 'require

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...