JQuery sortable lists and fixed/locked items

前端 未结 9 1507
故里飘歌
故里飘歌 2020-11-28 06:07

Is it possible to lock list items in JQuery sortable list in a way that those items will stay in that particular place in the list.

For example,

consider th

相关标签:
9条回答
  • 2020-11-28 06:37

    Connected sortables and fixed items

    I ran into the problem when we have several connected sortables. The code suggested by @sarunast and @DarthJDG has erroneous behavior when dragging items from one list to another. Therefore, I have modified it a little, and now you can drag items from different lists with saving positions in both of them.

    javascript:

    let connected = '.soratble';
    let fixed = '.static';
    let newParentContainer;
    
    //wrap the code suggested by @sarunast and @DarthJDG into the function
    //code was modified a little
    function sortingAroundFixedPositions(container) {
      let sortable = $(container);
      let statics = $(fixed, container).detach();
      let tagName = statics.prop('tagName');
      let helper = $('<' + tagName + '/>').prependTo(container);
      statics.each(function() {
        let target = this.dataset.pos;
        let targetPosition = $(tagName, sortable).eq(target);
        if (targetPosition.length === 0) {
          targetPosition = $(tagName, sortable).eq(target - 1)
        }
        $(this).insertAfter(targetPosition);
      });
      helper.remove();
    }
    
    $('ul').sortable({
      connectWith: connected,
      cancel: fixed,
      start: function() {
        $(fixed, connected).each(function() {
          this.dataset.pos = $(this).index();
        });
      },
      change: function(e, ui) {
        sortingAroundFixedPositions(this);
        if (ui.sender) {
          newParentContainer = this;
        }
        if (newParentContainer) {
          sortingAroundFixedPositions(newParentContainer);
        }
      },
      update: function(e, ui) {
        newParentContainer = undefined;
      }
    });
    

    demo: http://plnkr.co/edit/blmv4ZjaWJFcjvO2zQH0

    0 讨论(0)
  • 2020-11-28 06:39

    I extended the jQuery.Ui.sortable:

    Overview

    jQuery.Ui.sortable widget extension with fixed feature. This feature allows user to fix elements in the list.
    With the .fixedsortable() constructor you construct a .sortable() class which extended with the features. You can use the original methods and the extended as well.

    Code

    https://gist.github.com/3758329#file_fixedsortable.js > fixedsortable.js

    Example

    http://jsfiddle.net/omnosis/jQkdb/

    Usage

    General:

    To use, add the fixed property to the sortable list optios:

    $("#list").fixedsortable({
       fixed: (value)
    })
    

    the value can be:

    • integer example: 3
    • array of integers example : [1,2,5]
    • a html element or a list of html elements
    • a css selector
    • jquery object

    HTML:

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> //the jquery 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"></script> //the original jquery-ui   
    <script type="text/javascript" src="https://raw.github.com/gist/3758329/91749ff63cbc5056264389588a8ab64238484d74/fixedsortable.js"></script> //the extended sortable
    ...
    <ul id="sortable1">
        <li>oranges</li>
        <li class="static">apples</li>
        <li>bananas</li>
        <li>pineapples</li>
        <li>grapes</li>
        <li class="static">pears</li>
        <li>mango</li>
    </ul>
    
    <ul id="sortable2">
        <li>bananas</li>
        <li foo="asd">oranges</li>
        <li foo="dsa">apples</li>
        <li>pineapples</li>
        <li>grapes</li>
        <li>pears</li>
        <li>mango</li>
    </ul>
    
    <ul id="sortable3">
        <li>bananas</li>
        <li>oranges</li>
        <li>apples</li>
        <li>pineapples</li>
        <li>grapes</li>
        <li>pears</li>
        <li>mango</li>
    </ul>
    

    Javascript

    $(function() {
        $("#sortable1").fixedsortable({
            fixed: "> .static"
        });
    
        $("#sortable2").fixedsortable({
            fixed: $("li[foo]").css("background","red")
        });
    
        $("#sortable3").fixedsortable({
            fixed: 2
        })
    });
    

    Notes:

    If you insist to use the .sortable instead of .fixedsortable you can use this https://gist.github.com/3758329#file_sortable.js instead of the jquery.ui library. This is a complete replacement of the jQuery.ui, but i don't recommend to use this because of later updates.

    i have been working on this more than 12 hours :( i am insane..

    0 讨论(0)
  • 2020-11-28 06:39

    This is based on @DarthJDG code. However it wasn't retrieving all the id's and the sorting wasn't working with the table. So I managed to update his solution which works with both list and tables and keeps the id in the array.

    Javascript:

    var fixed = '.static'; //class which will be locked
    var items = 'li'; //tags that will be sorted
    
    $('ul').sortable({
      cancel: fixed,
      items: items,
      start: function () {
        $(fixed, this).each(function () {
          var $this = $(this);
          $this.data('pos', $this.index());
        });
      },
      change: function () {
        var $sortable = $(this);
        var $statics = $(fixed, this).detach();
        var tagName = $statics.prop('tagName');
        var $helper = $('<'+tagName+'/>').prependTo(this);
        $statics.each(function () {
          var $this = $(this);
          var target = $this.data('pos');
          $this.insertAfter($(items, $sortable).eq(target));
        });
        $helper.remove();
      }
    });
    

    Demo: http://plnkr.co/edit/hMeIiRFT97e9FGk7hmbs

    0 讨论(0)
  • 2020-11-28 06:40

    Check this out: Forcing an item to remain in place in a jQuery UI Sortable list

    Also, I've implemented the above solution with multiple fixed elements here: http://jsfiddle.net/enBnH/12/ (obsolete, see below) It's rather self-explanatory, i think.

    EDIT:

    I've automated the process for generating the lockto values as well as adding ID's to those lis with the class "fixed" (note that i have to add an ID so we can reference it)

    See the COMPLETE solution HERE: http://jsfiddle.net/enBnH/44/

    EDIT

    Okay, after a gazillion errors with the above, i just rewrote the dang thing myself: http://jsfiddle.net/thomas4g/GPMZZ/15/

    NOTE: The above does work, but @DarthJDG's answer seems a lot nicer to me. I'm leaving mine up on the offchance someone might prefer how mine behaves (i've learned not to delete stuff just beceause there's a better version :P )

    0 讨论(0)
  • 2020-11-28 06:48

    Maybe this will help to someone: use methods "disable" and "enable". Example HTML:

    <ul class="sortable">
      <li>You can move me</li>
      <li data-state="lifeless">You can't move me.</li>
    </ul>
    

    Script:

    $('#sortable').sortable();
    $('#sortable').mousedown(function() {
      if($(this).data('state')=='lifeless') $('#sortable').sortable('disable');
      else $('#sortable').sortable('enable');
    });
    

    Live example here: https://jsfiddle.net/ozsvar/0ggqtva5/2/

    0 讨论(0)
  • 2020-11-28 06:58

    Just use the "Include/Exclude" items selectors. Here is the link: https://jqueryui.com/sortable/#items

    0 讨论(0)
提交回复
热议问题