Передать функцию javascript через jQuery $.post

#javascript #jquery #ajax

#javascript #jquery #ajax

Вопрос:

В основном то, что я пытаюсь сделать, это передать функцию обратного вызова через PHP с помощью jQuery $.post . Что-то вроде:

 function loadPage()
{
    $.post('myurl.php', { 'callbackfunc' : function (info) { alert(info); } }, 
        function(data) {
            $("#divid").html(data);
     } );
}
 

Где myurl.php создается страница с таблицей. Строки таблицы имеют onclick обработчик, который вызывает функцию обратного вызова.

Проблема в том, что передача функции таким образом отправляет ее как undefined via post, и если я заключу ее в кавычки, то при попытке вызвать ее я получаю сообщение об ошибке, что это не функция.

Есть ли какой-нибудь способ сделать то, что я описываю?

Комментарии:

1. могу я спросить, что вы планируете делать с этой функцией в php?

2. Сообщение AJAX создает таблицу с информацией из базы данных в ней. Когда пользователь нажимает на строку в таблице, вызывается функция обратного вызова. Это позволяет таблице быть переносимой, а onclick должен отличаться в каждом месте, где он используется.

Ответ №1:

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

 function loadPage()
{
    $.post('myurl.php', { 'callbackfunc' : "function (info) { alert(info); }" }, 
        function(data) {
            $("#divid").html(eval(data));
     } );
}
 

Ответ №2:

передайте ее как строку (тело функции в двойных кавычках, возможно, с использованием escape-символов).

Комментарии:

1. функция — это обычная переменная javascript. Здесь она не вызывается.

2. тем не менее, необходимо выполнить следующее: { ‘callbackfunc’: «функция (информация) { оповещение (информация); }» }

Ответ №3:

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

 function loadPage(callbackfunc)
{
    $.post('myurl.php', {}, 
        function(data) {
            $("#divid").html(data);
            $("#divid").find("tr").each($(this).click(callbackfunc));
    } );
}
 

Ответ №4:

нет способа сделать то, что вы описываете, но, вероятно, есть способ сделать то, что вы хотите. (я не знаю, чего вы хотите)

вы не можете передать функцию JS на сервер. вы можете передавать только строки.

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

было бы лучше делегировать функцию click в div, куда вы вставляете таблицу следующим образом:

 function loadPage(){
    $("#divid").delegate('tr', 'click', function(evt){
      //this code is different per page, change color, alert, etc
    });
    //after the above event is delegated, you can reload the table as much as you want, without needing to rebind the above event
    $.post('myurl.php', function(data) {
        $("#divid").html(data);
    });
}
 

Комментарии:

1. Лучший способ, который я могу придумать, как это объяснить, заключается в том, что у меня есть три страницы, которым нужна одна и та же таблица, поэтому все три страницы вызывают один и тот же $.post для AJAX-загрузки таблицы. Однако каждая страница выполняет что-то свое, когда пользователь нажимает на строку в таблице. Для страницы 1 я хочу предупредить идентификатор строки, для страницы 2 я хочу изменить цвет, а для страницы 3 я хочу сделать перенаправление. Таким образом, я хочу передать другую функцию обратного вызова с каждой страницы, которая будет вызываться через обработчик onclick tr