jQuery UI Sortable:排序时不改变项目的顺序

发布于 2024-12-04 13:15:04 字数 202 浏览 2 评论 0原文

默认情况下,在排序时,项目会被替换(例如,如果我将第三个元素移动到第一个元素,则第一个和第二个元素将向下移动)

我不需要这种行为。我希望元素在完成排序(释放鼠标)时不要更改顺序。

我需要这个,因为我想询问用户是否想要更改元素或重新排序?

PS 选项 tolerance 只有 2 个选项,在这种情况下它们没有帮助。

By default, while sorting, items are replaced (for example, if I take the third element and move it to the first, than the first and the second elements will move down)

I do not need this behaviour. I'd like elements not to change order while I finish sorting (release mouse).

I need this because I want to ask user if he want to change element or to re-order?

P.S. option tolerance have only 2 options, and they don't help in this situation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

飘过的浮云 2024-12-11 13:15:04

我的意思是这样的(带有替换元素选项的可排序列表):

$(function() {

  var

    /**
     * Sortable List, that can insert or replace elements
     */
    SortableList = (function() {

      var

        // Configuration of Sortable list
        // css classes of separator and sortable elements
        // jQuery UI droppable and sortable init configuration
        CONFIG = {

          'confirm-message': 'Insert? Element will be removed',

          'separator-class': 'sortable-separator',
          'sortable-class': 'sortable-elem',

          // Initialization of jQuery UI Droppable
          'separators-droppable-init': {
            drop: function(e, ui) {
              // Insertation
              var drag = ui.draggable,
                drop = $(this),
                a = drop.prev(),
                b = drop.next();

              Separators.clean();
              Elements.insert(a, b, drag);
              Separators.init();
            },
            over: function(e, ui) {
              $(this).css({
                'background-color': 'lightgreen'
              });
            },
            out: function(e, ui) {
              $(this).css({
                'background-color': 'white'
              });
            }
          },

          'sortable-droppable-init': {
            drop: function(e, ui) {
              // Replace
              var drag = ui.draggable,
                drop = $(this);

              if (Elements.replace(drop, drag)) {
                Separators.init();
              }
            }
          },
          'sortable-draggable-init': {
            revert: true,
            start: function(e, ui) {
              $(this).css({
                'z-index': '999',
                'cursor': 'move'
              });
            },
            stop: function(e, ui) {
              $(this).css({
                'z-index': '1',
                'cursor': 'default'
              });
            }
          }
        },

        getSeparators = function() {
          return $('.' + CONFIG['separator-class']);
        },

        getSortables = function() {
          return $('.' + CONFIG['sortable-class']);
        },

        /**
         * Separators Handler
         */
        Separators = (function() {

          var
            // create separator html element
            _create = function() {
              return $('<div />').addClass(CONFIG['separator-class']);
            },

            // create all separators and insert them
            createAll = function() {
              getSortables().each(function() {
                $(this).before(_create());
              }).last().after(_create());
              return Separators;
            },

            // remove all separators
            clean = function() {
              var s = getSeparators();
              if (s.length) {
                s.remove();
              }
              return Separators;
            },

            // init jQuery UI Droppable interface
            initDroppable = function() {
              getSeparators().droppable(CONFIG['separators-droppable-init']);
              return Separators;
            },

            // Initialization of separators
            init = function() {
              if (getSeparators().length) {
                Separators.clean();
              }
              return Separators.createAll().initDroppable();
            };

          // Return result    
          Separators = {
            clean: clean,
            createAll: createAll,
            init: init,
            initDroppable: initDroppable
          };

          return Separators;
        }()),


        Elements = (function() {
          var

            init = function() {
              getSortables().droppable(CONFIG['sortable-droppable-init']).draggable(CONFIG['sortable-draggable-init']);
              return Elements;
            },

            // replaces element A with element B
            replace = function(A, B) {

              if (!confirm(CONFIG['confirm-message'])) {
                return false;
              }
              B.draggable("option", "revert", false).css({
                top: 0,
                left: 0
              });
              A.replaceWith(B);
              return Elements;
            },

            // insert element C between elements A and B
            insert = function(A, B, C) {
              C.draggable("option", "revert", false).css({
                top: 0,
                left: 0
              });
              if (!A.length) {
                B.before(C);
              } else {
                A.after(C);
              }
              return Elements;
            },

            // result to return
            Elements = {
              init: init,
              replace: replace,
              insert: insert
            };

          return Elements;

        }()),

        init = function() {
          Separators.init();
          Elements.init();
        };

      return {
        init: init
      };
    }());

  SortableList.init();

});
.sortable-elem {
  width: 32px;
  height: 32px;
  background-color: darkred;
  border: 1px solid brown;
  color: white;
}

.sortable-separator {
  width: 100px;
  height: 16px;
  position: relative;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
<link href="//code.jquery.com/ui/1.8.16/themes/smoothness/jquery-ui.css" rel="stylesheet" />
<script src="//code.jquery.com/ui/1.8.16/jquery-ui.min.js"></script>

<div class="sortable-elem" data-order="1">1</div>
<div class="sortable-elem" data-order="2">2</div>
<div class="sortable-elem" data-order="3">3</div>
<div class="sortable-elem" data-order="4">4</div>
<div class="sortable-elem" data-order="5">5</div>
<div class="sortable-elem" data-order="6">6</div>
<div class="sortable-elem" data-order="7">7</div>
<div class="sortable-elem" data-order="8">8</div>
<div class="sortable-elem" data-order="9">9</div>
<div class="sortable-elem" data-order="10">10</div>

在 JSFiddle 上查看

I meant something like this (sortable list with option of replacing elements):

$(function() {

  var

    /**
     * Sortable List, that can insert or replace elements
     */
    SortableList = (function() {

      var

        // Configuration of Sortable list
        // css classes of separator and sortable elements
        // jQuery UI droppable and sortable init configuration
        CONFIG = {

          'confirm-message': 'Insert? Element will be removed',

          'separator-class': 'sortable-separator',
          'sortable-class': 'sortable-elem',

          // Initialization of jQuery UI Droppable
          'separators-droppable-init': {
            drop: function(e, ui) {
              // Insertation
              var drag = ui.draggable,
                drop = $(this),
                a = drop.prev(),
                b = drop.next();

              Separators.clean();
              Elements.insert(a, b, drag);
              Separators.init();
            },
            over: function(e, ui) {
              $(this).css({
                'background-color': 'lightgreen'
              });
            },
            out: function(e, ui) {
              $(this).css({
                'background-color': 'white'
              });
            }
          },

          'sortable-droppable-init': {
            drop: function(e, ui) {
              // Replace
              var drag = ui.draggable,
                drop = $(this);

              if (Elements.replace(drop, drag)) {
                Separators.init();
              }
            }
          },
          'sortable-draggable-init': {
            revert: true,
            start: function(e, ui) {
              $(this).css({
                'z-index': '999',
                'cursor': 'move'
              });
            },
            stop: function(e, ui) {
              $(this).css({
                'z-index': '1',
                'cursor': 'default'
              });
            }
          }
        },

        getSeparators = function() {
          return $('.' + CONFIG['separator-class']);
        },

        getSortables = function() {
          return $('.' + CONFIG['sortable-class']);
        },

        /**
         * Separators Handler
         */
        Separators = (function() {

          var
            // create separator html element
            _create = function() {
              return $('<div />').addClass(CONFIG['separator-class']);
            },

            // create all separators and insert them
            createAll = function() {
              getSortables().each(function() {
                $(this).before(_create());
              }).last().after(_create());
              return Separators;
            },

            // remove all separators
            clean = function() {
              var s = getSeparators();
              if (s.length) {
                s.remove();
              }
              return Separators;
            },

            // init jQuery UI Droppable interface
            initDroppable = function() {
              getSeparators().droppable(CONFIG['separators-droppable-init']);
              return Separators;
            },

            // Initialization of separators
            init = function() {
              if (getSeparators().length) {
                Separators.clean();
              }
              return Separators.createAll().initDroppable();
            };

          // Return result    
          Separators = {
            clean: clean,
            createAll: createAll,
            init: init,
            initDroppable: initDroppable
          };

          return Separators;
        }()),


        Elements = (function() {
          var

            init = function() {
              getSortables().droppable(CONFIG['sortable-droppable-init']).draggable(CONFIG['sortable-draggable-init']);
              return Elements;
            },

            // replaces element A with element B
            replace = function(A, B) {

              if (!confirm(CONFIG['confirm-message'])) {
                return false;
              }
              B.draggable("option", "revert", false).css({
                top: 0,
                left: 0
              });
              A.replaceWith(B);
              return Elements;
            },

            // insert element C between elements A and B
            insert = function(A, B, C) {
              C.draggable("option", "revert", false).css({
                top: 0,
                left: 0
              });
              if (!A.length) {
                B.before(C);
              } else {
                A.after(C);
              }
              return Elements;
            },

            // result to return
            Elements = {
              init: init,
              replace: replace,
              insert: insert
            };

          return Elements;

        }()),

        init = function() {
          Separators.init();
          Elements.init();
        };

      return {
        init: init
      };
    }());

  SortableList.init();

});
.sortable-elem {
  width: 32px;
  height: 32px;
  background-color: darkred;
  border: 1px solid brown;
  color: white;
}

.sortable-separator {
  width: 100px;
  height: 16px;
  position: relative;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
<link href="//code.jquery.com/ui/1.8.16/themes/smoothness/jquery-ui.css" rel="stylesheet" />
<script src="//code.jquery.com/ui/1.8.16/jquery-ui.min.js"></script>

<div class="sortable-elem" data-order="1">1</div>
<div class="sortable-elem" data-order="2">2</div>
<div class="sortable-elem" data-order="3">3</div>
<div class="sortable-elem" data-order="4">4</div>
<div class="sortable-elem" data-order="5">5</div>
<div class="sortable-elem" data-order="6">6</div>
<div class="sortable-elem" data-order="7">7</div>
<div class="sortable-elem" data-order="8">8</div>
<div class="sortable-elem" data-order="9">9</div>
<div class="sortable-elem" data-order="10">10</div>

View on JSFiddle

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文