JS сортируемый POST start и функция обновления вместе?

#html #jquery #post #jquery-ui-sortable

#HTML #jquery #Публикация #jquery-ui-сортируемый

Вопрос:

Я хотел бы знать, как я могу отправить текущий список и отсортированный список вместе с POST? Я хорошо получил результаты, отправил отправку только одного списка. Проблема в том, что переменная currentlist находится за пределами UPDATE. Как я могу его найти?

 <script type="text/javascript">

    $(".wrapper").sortable({
         handle: ".draghandler",
         connectWith: $('.wrapper'),
         distance: 100,
         opacity: 0.4, 
         cursor: 'move',
        
        start: function (event, ui) {
                
                var currentlist = new Array(); //Aktuális sorrend lista
                $('.draghandler').each(function() {
                currentlist.push($(this).attr("id"));
                $('#currentlist').html(currentlist);
                    
                });     
                },
        
        update: function (event, ui) {

                var newsortedlist = new Array(); //Átrendezett lista
                $('.draghandler').each(function() {
                newsortedlist.push($(this).attr("id"));
                });
                
                
                $('#newsortedoutput').html(newsortedlist);
                //$('#responsefromserver').html('Rendezés mentése folyamatban');
            
**//'currentid': currentlist is outside of update:function, it is in start:function, therefore it dosen't send.**

                $.post('/megrendelesek/sortmouse.php',{'currentid': currentlist, 'sortid': newsortedlist}, function(theResponse){
                $('#responsefromserver').html(theResponse);
                    });
                                    }
    
        });
        $(".wrapper").disableSelection();
        $(".draghandler").disableSelection();   

    
    
</script>

<div id="currentlist"></div>
<div id="newsortedoutput"></div>
<div id="responsefromserver"> </div>
 

Ответ №1:

Чтобы делать то, что вам требуется, вам нужно хранить currentlist в пределах области действия обоих обработчиков функций. Глобальная переменная могла бы это сделать, но это плохая практика.

Лучшим подходом было бы сохранить массив в data атрибуте в соответствующем .wrapper контейнере. Затем вы можете получить к этому доступ везде, где это необходимо.

Также обратите внимание, что вы можете использовать эту map() функцию для упрощения создания массива из атрибутов дескриптора перетаскивания id .

 $(".wrapper").sortable({
  handle: ".draghandler",
  connectWith: $('.wrapper'),
  distance: 10, // reduced to 10 to make this demo easier to use
  opacity: 0.4,
  cursor: 'move',
  start: function(e, ui) {
    var currentlist = $('.draghandler').map((i, el) => el.id).get();
    $(e.target).closest('.wrapper').data('currentlist', currentlist);
    $('#currentlist').html(currentlist);
  },
  update: function(e, ui) {
    var currentlist = $(e.target).closest('.wrapper').data('currentlist');
    var newsortedlist = $('.draghandler').map((i, el) => el.id).get();
    $('#newsortedoutput').html(newsortedlist);

    // Commented as the AJAX call will cause an error in an SO snippet...
    /* 
    $.post('/megrendelesek/sortmouse.php', {
      'currentid': currentlist,
      'sortid': newsortedlist
    }, function(theResponse) {
      $('#responsefromserver').html(theResponse);
    });
    */
  }
});

$(".wrapper").disableSelection();
$(".draghandler").disableSelection(); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://code.jquery.com/ui/jquery-ui-git.css" />

<div class="wrapper">
  <div class="item">
    Foo
    <div class="draghandler" id="item-1">DRAG</div>
  </div>
  <div class="item">
    Foo
    <div class="draghandler" id="item-2">DRAG</div>
  </div>
  <div class="item">
    Foo
    <div class="draghandler" id="item-3">DRAG</div>
  </div>
</div>
<br />
<div id="currentlist"></div>
<div id="newsortedoutput"></div>
<div id="responsefromserver"> </div> 

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

1. Большое вам спасибо, это работает хорошо. Теперь проблема в том, что не каждый раз отправка POST в currentlist. У вас есть идеи, почему? Я получаю от responsefromserver список сортируемых новостей, но список текущих событий не каждый раз.