【问题标题】:Conditionally calling Ajax有条件地调用 Ajax
【发布时间】:2016-12-08 18:39:05
【问题描述】:

我正在运行 JQUERY SORTABLE -- 然后序列化结果 --- 然后使用 AJAX 将序列化数组发布到 php 数据库更新脚本。

一切正常。但是,我希望将 AJAX 调用(如下面的脚本所示)设置为仅运行一次 --- 即当所有 SORTABLE 排序完成时,因此我有一个最终的序列化数组。

序列化和 ajax 脚本如下 - 但每次更新序列化数组时发布,而不是在最终数组准备好时发布。任何想法都会非常受欢迎。 (将考虑如何最好地实现 HTML BUTTON 以手动实现此条件)。

    <script>

                $('ul').sortable({
                        update: function (event, ui) 
                    {
                        var order = $(this).sortable('serialize');      
                         $('span').text(order);//test serialize without ajax-works fine

    //ajax curently runs each time a sort operation is serialised. 
    //I want to run AJAX when I have finished sorting hence serialization.                          
                            $.ajax({
                              url: 'update_gallery_grid.php?propertyid='+ propertyid +'&product='+ product +'&payment='+payment,//url data needs to be GOT on the pageAJAX pots too 
                              type: 'post',
                              data: order, 

                            success:function(result){
                                $(".result").html(order);}, //works but gives serialised array each time serialisation is updated by sortable. No conditionality.                                   
                               error: function(){
                            alert('something bad happened');
                              }

                            }); // end ajax call

                    }

                 });     

    </script>

编辑 除了 Twisty 的想法,我还提出了这个编辑。但是它现在根本没有发布 Ajax - 所以我在移动发布的原始代码(确实发布了)和这个新编辑时犯了一个错误。我在这里做了什么傻事吗?

                <script>

                $(function() {
                  $('#saveBtn').button().click(function(e) {
                    e.preventDefault();
                //ajax is not posting on Save. It was posting to php with initial code in question. So Ive messed something up here?
                                $.ajax({
                                      url: 'update_gallery_grid.php?propertyid='+ propertyid +'&product='+ product +'&payment='+payment,//url data needs to be GOT on the pageAJAX pots too 
                                      type: 'post',
                                      data: data,

                                    success:function(result){
                                        $(".result").html(data);},

                                      error: function(xhr, desc, err) {
                                        console.log(xhr);
                                        console.log("Details: " + desc + "\nError:" + err);
                                      }
                                }); // end ajax call
                      });   //end click 

                //following sorts and reports array to $(span) ok     
                 $('#sortable').sortable({
                    //placeholder: "ui-state-highlight",
                    update: function(event, ui) {
                      var data = $(this).sortable('serialize');
                      $('span').text(data);
                    }
                  });
                  $("#sortable").disableSelection();

                });//end function


                </script>

编辑 2 Twisty-我已经移动了 var 数据声明,如下所示。效果是 sortable 不是排序并且保存不会在结果 div 中产生任何内容。

                 $('#sortable').sortable({
                    //placeholder: "ui-state-highlight",
                    update: function(event, ui) {
                    //var data = $(this).sortable('serialize');
                      $('span').text(data);
                    }
                  });
                  $("#sortable").disableSelection();

                 var data = $('#sortable').sortable('serialize');

                });//end function 

这是输出字符串,排序现在不会像之前编辑时那样改变它(尽管没有发布)。保存时仍然没有任何结果(没有 Firebug post200 列表)。

  Query string: item[]=1&item[]=2&item[]=3&item[]=4&item[]=5&item[]=6&item[]=7&item[]=8&item[]=9&item[]=10 Result: 

【问题讨论】:

  • 您在答案中搜索的内容有点不清楚。你试过什么?
  • 说实话我有点难过。所以我正在寻找关于如何做到这一点的好主意。我不敢相信这不是一个常见的问题,但我在谷歌上找不到任何可以解决的问题。因此,我对社区的任何想法持开放态度。
  • 如何知道用户何时完成排序?
  • 可能是用户交互 Kevin。也许是一个按钮。或者最多可能有十个排序更改(但这有点复杂)。真的在寻找想法。这一定是一个很常见的问题。很惊讶我找不到正面解决它的帖子。每次排序部分更改时发布确实会弄乱更新程序逻辑

标签: javascript jquery html ajax jquery-ui


【解决方案1】:

如果你想基于一个按钮来实现一个动作,你可以考虑如下:

jQuery

  <script>
  $('#saveBtn').button().click(function(e) {
    e.preventDefault();
    var targetUrl = 'update_gallery_grid.php?propertyid=' + propertyid + '&product=' + product + '&payment=' + payment;
    $.ajax({
      url: targetUrl,
      type: 'post',
      data: {
        json: JSON.stringify(order)
      },
      success: function(result) {
        $('#result').html("<p>Order: " + order + "</p><p>Results: " + result + "</p>");
      },
      error: function(xhr, status, error) {
        $('#result').append("<p>" + error + "</p>");
      }
    });
  });

  $('#sortable').sortable({
    placeholder: "ui-state-highlight",
    update: function(event, ui) {
      order = $(this).sortable('serialize');
    }
  });
  $("#sortable").disableSelection();

  var order = $('#sortable').sortable('serialize');
  </script>

工作示例:https://jsfiddle.net/Twisty/1f1tq1h3/

由于您的示例不包含 HTML,因此我使用了 jQuery UI Demo。您可以在示例中看到所有内容。我们只是将 AJAX 活动移动到 Click 事件而不是 Update 事件。

【讨论】:

  • 感谢您的 Twisty。让我玩一个小时左右,看看它会把我带到哪里。顺便问一下,我怎么给你打分??
  • 如果您觉得答案有帮助,您可以点赞或点赞。如果这回答了您的问题,您可以通过单击答案左侧的复选标记将其标记为答案。查看更多:stackoverflow.com/help/someone-answers
  • 我要支持你,因为你的 Fiddle 非常接近 Twisty。我已将您的解决方案与我的原始代码合并,创建了一个已添加到我的问题中的编辑脚本。它确实进行了排序,但不幸的是它现在根本没有从 Ajax 发布数据(在 Firebug 中检查并且保存时没有 post200)。我做了什么明显很傻的事吗?
  • 您创建的变量 data 超出范围。基本上,回调函数不会知道这个变量是什么,它会是undefined。这就是为什么在我的示例中,order 在按钮初始化之外定义并且可排序。这使它对双方都可用。
  • 这里是查询字符串: item[]=5&item[]=1&item[]=2&item[]=3&item[]=4&item[]=6&item[]=7&item[]=8&item[]= 9&item[]=10 .....这是HTML span标签中输出的排序数据变量。所以序列化工作正常。但是,我现在应该将 var data=lsjfisfiohfiohfoi 移动到您为 Ajax 调用而执行的位置吗?如果这行得通,那就是答案:)
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2019-12-28
  • 2021-03-17
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多