Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > запустить неизвестную функцию


Автор: bars80080 24.11.2009, 18:05
что-то я как-то потерялся

надо запустить функцию, имя которой в строке. желательно без eval

задача более полно:
есть функция отвечающая за аякс запрос, она принимает respondfuntion - имя функции-обработчика ответа,

Код

function ajaxQuery(url, query, method, respondfuntion) {
   ...
        if(req.readyState == 4) // respondfuntion(req.responseText);     
}

собсна вопрос, как мне положить в неё результат и запустить на выполнение

к сожалению, в req.responseText могут быть переводы строк и вообще любые символы. поэтому хотелось бы избежать поиска замены всех кавычек и переводов строки, чтоб потом всю строку запихнуть в eval()

Автор: comtat 24.11.2009, 18:43
Цитата(bars80080 @  24.11.2009,  18:05 Найти цитируемый пост)
надо запустить функцию, имя которой в строке. желательно без eval

Кажется мне что никак (( ...
Код

function execFn(_fnName){
    if (typeof _fnName == 'string'){
        _fnName = eval("(" + _fnName + ")");
    }
    _fnName();
}

Цитата(bars80080 @  24.11.2009,  18:05 Найти цитируемый пост)
в req.responseText могут быть переводы строк и вообще любые символы

там не JSON ?

Автор: bars80080 24.11.2009, 18:54
Цитата(comtat @  24.11.2009,  17:43 Найти цитируемый пост)
там не JSON ?

нет, там кусок html

Добавлено через 1 минуту и 42 секунды
Цитата(comtat @  24.11.2009,  17:43 Найти цитируемый пост)
function execFn(_fnName){
    if (typeof _fnName == 'string'){
        _fnName = eval("(" + _fnName + ")");
    }
    _fnName();
}

что-то этого механизма я не понял. а куда здесь передаётся req.responseText?

Автор: comtat 24.11.2009, 21:23
Код

function execFn(_fnName, _params){
    if (typeof _fnName == 'string'){
        _fnName = eval("(" + _fnName + ")");
    }
    _fnName(_params);
}

execFn(respondfuntion, req.responseText);


Только есть сомнения хорошо ли это ... Надеюсь я все верно понял с постановкой задачи.

Автор: unicross 24.11.2009, 22:22
Цитата(bars80080 @  24.11.2009,  18:05 Найти цитируемый пост)
надо запустить функцию, имя которой в строке. желательно без eval

Может так (если я правильно понял задачу):
Код

<html>
<head>
<script type="text/javascript">
function f1(msg) {
   alert(msg + ' f1');
}
function f2(msg) {
   alert(msg + ' f2');
}
function f3(msg) {
   alert(msg + ' f3');
}
function ajaxQuery(func, msg) {
   if (window[func])
      window[func](msg);
   else
      alert('Функция не найдена');
}
</script>
</head>
<body>
<input type="button" value="Запустить" onclick="ajaxQuery('f3', 'Привет')">
</body>
</html>

Не тестил во всех браузерах. Возможны проблемы... Кстати, а почему нельзя сразу передать ссылку на функцию через параметр?

Автор: bars80080 25.11.2009, 00:18
Цитата(unicross @  24.11.2009,  21:22 Найти цитируемый пост)
Кстати, а почему нельзя сразу передать ссылку на функцию через параметр?

это как?

у меня задача просто вернуть ответ в нужную функцию.

Автор: unicross 25.11.2009, 00:23
Цитата(bars80080 @  25.11.2009,  00:18 Найти цитируемый пост)
это как?

Указав название функции без скобок:
Код

<html>
<head>
<script type="text/javascript">
function f3(msg) {
   alert(msg + ' f3');
}
function ajaxQuery(func, msg) {
   func(msg);
}
</script>
</head>
<body>
<input type="button" value="Запустить" onclick="ajaxQuery(f3, 'Привет')">
</body>
</html>

Автор: IDVsbruck 25.11.2009, 03:59
Код
if (req.readyState == 4){
    var named_func = window[respondfuntion];
    if (typeof(named_func) == "function") named_func(req.responseText);
}

Автор: bars80080 25.11.2009, 11:51
вот какие штуки оказывается бывают

вариант unicross`а наиболее простой

всем спасибо

Автор: Котокобра 26.11.2009, 11:02
а зачем передавать ответ именно через параметр функции? можно передать через глобальную переменную.

Автор: bars80080 26.11.2009, 12:29
когда речь идёт о разных файлах, я на глобальные переменные уже не полагаюсь. 
вдруг уже будет объявлена и в каком-то процессе будет сбой

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)