JQuery: вызов функции - PullRequest
       15

JQuery: вызов функции

1 голос
/ 28 августа 2011

Хорошо, я работаю с некоторыми jquery для создания динамических всплывающих окон. Однако периодически ответом будет имя функции, которую мне нужно вызывать вместо фактических данных, и я пытаюсь выяснить, как это сделать ..

success: function(response) {
                                var obj = $.parseJSON(response);
                                if (obj.response == 'false') {
                                    $('#popuperrDisplay').html(obj.msg);
                                    $('#popuperrors').show();
                                } else {
                                    if (obj.response == 'redirect') {
                                        window.location.href = obj.msg; 
                                    } else if (obj.response == 'function') {
                                        call obj
                                    } else {
                                        $(this).dialog('close');
                                    }
                                }
                            }

Это текущая часть моего jquery. Мне нужно выяснить, как я могу отправить имя функции JS через json_encode и заставить JS действительно вызывать эту функцию

Ответы [ 3 ]

5 голосов
/ 28 августа 2011

Если функция определена глобально (для объекта окна), вы можете просто вызвать ее следующим образом:

if (obj.response === 'function' &&            // 1
    typeof window[obj.msg] !== 'undefined') { // 2

    window[obj.msg]();                        // 3
    // or...
    window[obj.msg].apply(null, obj.args);    // 4
}
  1. проверяет, является ли тип ответа функцией.
  2. проверяет, существует ли функция с заданным именем, определенная в объекте окна.
  3. вызывает эту функцию.
  4. вызывает эту функцию и предоставляет ей массив аргументов.

Редактировать: (window[] синтаксис)

Для дальнейшего уточнения, window['showPopup'] обращается к элементу showPopup объекта window.Это то же самое, что и window.showPopup.Только синтаксис [] имеет преимущество в получении string вместо действительного кода.

window['showPopup'] вернет объект (если он определен);пусть это будет функция для нашего конкретного примера.

Затем мы вызываем этот функциональный объект с помощью оператора (), например: window['showPopup']().Еще раз, это то же самое, что и сделать это: window.showPopup().

Edit 2: (вызвать с аргументами)

Если функция должна быть вызвана смассив аргументов, мы можем использовать apply .Вызов функции будет выглядеть следующим образом:

window['showPopup'].apply(null, arrayOfArgs);

Где arrayOfArgs - массив, содержащий аргументы.

0 голосов
/ 28 августа 2011

Если я правильно понял вопрос, сервер отправляет обратно объекты в одной из форм:

{"response":"false", "msg":"some message"}

{"response":"redirect", "msg":"some message"}

{"response":"function", "msg":"functionName"}

, и проанализированная строка станет объектом с именем obj.

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

window[obj.msg]()

Лучше всего проверить, что это функция с typeof первой (см. Ответ Брайана).

Также убедитесь, что имя функции, что серверотправка обратно - это функция, которую вы ожидаете отправить обратно .Вы не хотите звонить вслепую.По крайней мере, кажется, вы ожидаете, что он отправит обратно имена функций, а не произвольный код, но все же, будьте в безопасности!

0 голосов
/ 28 августа 2011

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

function doAlert(msg) {
    alert(msg);
}

var x = doAlert;

x("hi");
x.call(this, "hi");
x.apply(this, arrayOfArguments);

См. здесь длябольше информации на .call().См. здесь для получения дополнительной информации о .apply().

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

function doAlert(msg) {
    alert(msg);
}

var name = "doAlert";
window[name]("hi");

Также возможно, хотя и не рекомендуется, использовать eval:

function doAlert(msg) {
    alert(msg);
}

var name = "doAlert";
eval(name + '("hi");');

Вы задали этот вопрос в комментарии:

Скажем, у меня есть функция внутри functions.js с именем updateAll, у которой нет параметров ... в моем php мой json будет $data['function_name'] = 'updateAll';который будет закодирован с помощью json_encode () ... превратив его в obj.function_name, чтобы я не мог просто вызвать: obj.function_name ();и это работает?

Вот мой ответ на этот новый вопрос:

Я не уверен, что полностью понимаю ваш вопрос, но я постараюсь описать различные возможные аспекты вашего вопроса.

Если function_name является переменной, вы не можете использовать obj.function_name().Этот синтаксис работает только для строковых констант (не переменных).

Если у вас есть имя метода в переменной, вы всегда можете сделать то же самое, что и точечная запись, используя [], например: obj[function_name]();

Если имя функции находится в $data['function_name'] = 'updateAll' и это имя функции на самом деле является методом объекта obj, так что вы хотите вызвать obj.updateAll, тогда вы могли бы сделатьэто будет выглядеть так:

obj[$data['function_name']]();

Помните, что в Javascript, где бы вы ни использовали ссылку .x для имени, которое было известно заранее, вы можете использовать ссылку [x] для имени, котороенаходится в переменной.

Если (как вы разместили в комментарии), ваш JSON выглядел так:

{"response":"function","msg":"someFunction","attribs":{"id":"1","p_id":"2"}}

и этот JSON означал, что вы хотите вызвать функцию someFunction()и передайте ему параметры в attribs, тогда есть несколько способов сделать это в зависимости от того, как вы хотите, чтобы аргументы передавались в функцию.Если вы хотите, чтобы аргументы передавались как объект attribs, вы бы сделали это следующим образом:

var data = {"response":"function","msg":"someFunction","attribs":{"id":"1","p_id":"2"}};
if (data.response == "function") {
    data.msg(data.attribs);
}

Если вы хотите, чтобы аргументы передавались как обычные параметры с параметром id первым и параметром p_id, вторым, вы 'сделал бы это так:

var data = {"response":"function","msg":"someFunction","attribs":{"id":"1","p_id":"2"}};
if (data.response == "function") {
    data.msg(data.attribs.id, data.attribs.p_id);
}
...