【问题标题】:Multiple returns from jQuery AJAX post来自 jQuery AJAX 帖子的多次返回
【发布时间】:2012-11-25 17:21:56
【问题描述】:

让我快速解释一下我的工作,我有多个 jQuery AJAX 帖子正在返回不同的结果。这是我目前正在做的事情:

JavaScript

$("select#be_betrieb")
  .change(function() {

    $.ajax({
      type: "POST",
      url: "/functions/antragsformulare_benutzer.inc.php",
      data: { action: "getkst", bkuerzel: $(this).val() },
      success: function(data) {
        $("select#be_kostenstelle").attr('disabled',false);             
        $("select#be_kostenstelle").html(data);
      }
    });

    $.ajax({
      type: "POST",
      url: "/functions/antragsformulare_benutzer.inc.php",
      data: { action: "getcompnames", bkuerzel: $("select#be_betrieb").val() },
      success: function(data) {             
        $("select#be_arbeitsplatzbestehend").html(data);
      }
    });
  });

如您所见,我对同一个 PHP 文件进行了两次发布,只是定义了不同的操作。由于我对该文件还有其他几篇文章(大约 6 篇)要做,我想知道是否还有其他方法可以做到这一点?

我希望你们能理解我的问题。我期待着您的意见。

【问题讨论】:

  • 除了把它放在一个以datasuccess 作为参数的函数中,你所做的并没有什么问题。如果它需要 6 个调用,那么它需要 6 个调用。如果这是您要定期做的事情,那么从一次调用中返回所有数据可能是有意义的,但如果不了解更多情况,很难说这是否值得。
  • 我认为最好的解决方案是将您的 $.ajax 调用包装在一个函数中。然后将在您的操作中更改的值作为参数传递。这是你想做的吗?
  • 我在后台所做的取决于正在运行的不同 PHP 方法的“操作”,它正在返回我的结果。如果我这样做的方式没有问题,那我很好。我只是想知道,是否有一种“更好”的方式来做到这一点,因为这是我第一次使用它。跨度>
  • 您是否在更改事件中一一处理所有这些发布请求?或者您只是根据某个值选择一项操作?
  • @FAngel - 关于更改事件,我正在做所有这些帖子。每个帖子都会返回必须应用于我的表单的其他值。

标签: php jquery ajax post


【解决方案1】:

根据您的输入,我更改了代码,如果好的话,您可以再看看吗?

Javascript

$("select#be_betrieb")
        .change(function() {

            $.ajax({
                type: "POST",
                url: "/functions/antragsformulare_benutzer.inc.php",
                dataType: "json",
                data: 
                    { 
                        actions: [
                                    {action: "getkst", bkuerzel: $(this).val()},
                                    {action: "getcompnames", bkuerzel: $(this).val()}
                                 ]
                    },
                success: function(data)
                    {
                        for (var i = 0; i<data.length; i++)
                        {
                            switch(data[i]["action"])
                            {
                                case "getkst":
                                    alert(data[i]["queryresult"]);
                                    break;

                                case "getcompnames":
                                    alert(data[i]["queryresult"]);
                                    break;
                            }
                        }
                    }
            });

PHP

if ( $_POST['actions'] != "" )
{
foreach ($_POST['actions'] as $action)
{
    switch ($action['action'])
    {
        case "getkst":

            $queryresult = "here something to return";

            $results[] = array('action' => 'getkst', 'queryresult' => $queryresult);
            break;

        case "getcompnames":

            $queryresult = "here something to return";

            $results[] = array('action' => 'getcompnames', 'queryresult' => $queryresult);
            break;
    }
}

echo json_encode($results);
}

到目前为止非常感谢!

【讨论】:

【解决方案2】:

一旦您将所有这些请求一一发送到同一页面,我认为最好执行以下操作:

$.ajax({
      type: "POST",
      url: "/functions/antragsformulare_benutzer.inc.php",
      dataType:'json',
      data: {actions: [{action: "getkst", bkuerzel: $(this).val()},
                       {action: "getcompnames", bkuerzel: $("select#be_betrieb").val()},
                       ...] },
      success: function(data) {
        for(var i = 0;i<data.length;i++) {
            switch(data[i]["action"]) {
                case "getkst":
                    $("select#be_kostenstelle").attr('disabled',false);             
                    $("select#be_kostenstelle").html(data[i].resultHTML);
                    break;
                case "getcompnames":
                    $("select#be_arbeitsplatzbestehend").html(data[i].resultHTML);
                    break;
            }
        }
      }
    });

在您的/functions/antragsformulare_benutzer.inc.php 返回用json_encode 编码的结果数组。

dataType:'json' 这会让 jQuery 知道它应该像 JSON 一样处理响应,因此数据将包含常规 JS 对象。

原因:

  • 一个请求导致服务器负载降低(无需初始化 6个请求的环境)
  • 更快(每个请求都需要一些时间 连接到服务器,会话锁定也可能有问题: 一旦您使用默认会话,所有请求都将被使用 一,等待之前的请求完成)

基本思想是通过一个 AJAX 请求推送所有操作及其值。然后,在服务器上,遍历 $_POST['actions'] 并执行每个操作所需的内容。像这样将结果收集到 PHP 数组中:

 $results = array(array("action" => 'action1', 
                        "results" => "some action results"), 
                  array("action" => 'action2', 
                        "results" => "some action results"),
                  ...);

然后使用 json_encode 对该数组进行编码,以便 jQuery 可以解析它:

echo json_encode($results);

【讨论】:

  • 感谢您的回复,不确定您是否正确,或者我只是不明白 :-) 在更改事件中我总是必须完成所有这些请求。而且我不知道如何处理 PHP 部分,因为我从来没有做过类似的事情。但我想我至少从你的描述中得到了一个起点,谢谢。
  • @Crasher PHP 部分的处理方式与 JS 部分类似(参见success 处理程序中的开关)。只需遍历 $_POST['actions'] 中的项目并使用操作名称来决定要做什么。将结果输出到某个变量中,而不是立即回显给客户端。
【解决方案3】:

您可以使用自动为您执行此操作的库,甚至在完成时链接 AJAX 响应,但不是在客户端执行此操作,而是从服务器端调用 ajax 函数。使用 phery 库 (http://phery-php-ajax.net),您可以从服务器完成所有操作:

<select data-remote="getkst" name="bkuerzel" data-target="/functions/antragsformulare_benutzer.inc.php">
   // fill your options here
</select>

在您的antragsformulare_benutzer.inc.php 文件中

function getcompnames($data){
  $r = new PheryResponse;  
  // get your comp names here. If you are appending to a select, use
  $r->jquery('select#be_arbeitsplatzbestehend')->html($html_content);
  return $r;
}

function getkst($data){
  $r = new PheryResponse; 
  $html_content = set_your_html_content();

  $r
  ->jquery('select#select#be_kostenstelle')
  ->removeAttr('disabled')->html($html_content);
  // you could do
  // $r->phery_remote('getcompnames', array('bkuerzel' => $data['bkuerzel']), array('target' => '/functions/antragsformulare_benutzer.inc.php'));
  // to call a second ajax when this one is completed, but it's best to merge the response from getcompnames and keep it all in one single AJAX call
  return $r->merge(getcompnames());
}

Phery::instance()->set(array(
  'getkst' => 'getkst',
  'getcompnames' => 'getcompnames'
))->process();

如您所见,您可以调用第二个 AJAX 响应,或者合并两个答案,我认为这对您来说是最好的选择,并保存一个 AJAX 调用;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多