0

让我快速解释一下我的工作,我有多个 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 篇)要做,我想知道是否还有其他方法可以做到这一点?

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

4

3 回答 3

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);
}

到目前为止非常感谢!

于 2012-11-22T08:43:47.113 回答
0

您可以使用自动为您执行此操作的库,甚至在完成后链接 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 调用;)

于 2012-11-25T09:21:56.240 回答
0

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

$.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);
于 2012-11-21T14:38:20.737 回答