Как вызвать функцию JavaScript из строки JSON? - PullRequest
3 голосов
/ 31 марта 2011

Если я сделаю пост AJAX с jQuery, который выглядит как

 $.post('MyApp/GetPostResult.json', function(data) {
    // what goes here?
 });

и результат выглядит как

{
    "HasCallback": true,
    "Callback": "function(){ alert('I came from the server'); }"
};

Тогда как мне вызвать функцию обратного вызова? Могу я просто написать if(data.HasCallback){data.Callback();}?

Ответы [ 4 ]

2 голосов
/ 31 марта 2011

Это должно работать:

function(data) {
  if(data.HasCallback) {
    eval(data.Callback);
  }
}

Редактировать: Не выглядело достаточно тщательно. Если вы действительно получаете текст function() { ... }, то вам нужно eval(data.Callback + "()").

1 голос
/ 31 марта 2011

Лучше хранить код и данные отдельно.Чтобы использовать ваш пример, почему бы не иметь JSON, как это:

{
    "Message": "I came from the server"
}

И в вашем JavaScript:

$.post('MyApp/GetPostResult.json', function(data) {
    if (data.Message) {
        alert(data.Message);
    }
});
1 голос
/ 31 марта 2011
eval("(" + functionDeclarationAsString + ")()");

, в то время как functionDeclaractionAsString будет что-то в форме function(){ alert('I came from the server'); }

РЕДАКТИРОВАТЬ

Обозначение (functionReference) ();используется для вызова ссылки на функцию.Следующее будет действительным:

(function() { alert('it works'); })();

Следующее также будет действительным:

var my_function = function(param) { alert(param); };
(my_function)('this is a parameter');
0 голосов
/ 31 марта 2011

Вы можете использовать зло eval для выполнения данной строки в виде кода:

if (data.HasCallback) {
  eval("("+data.Callback+"());");
}

Дополнительные скобки в конце немедленно выполняют вашу функцию.

Документировано вшкола зла

...