How to prevent multiple selection in jQuery UI Selectable plugin

前端 未结 10 1835
走了就别回头了
走了就别回头了 2020-12-30 00:13

I am using jQuery UI Selectable plugin. I want to select one item at a time. But jQuery UI Selectable plugin allows multiple selection by clicking/ dragging / holding CTRL

相关标签:
10条回答
  • 2020-12-30 00:27

    There is no defined way. However, you could pass in a callback function for "Start" or "Selected" events, that cancels the selection if more than one element is selected.

    0 讨论(0)
  • 2020-12-30 00:27

    You can create your custom plugin like this:

    $.widget("xim.singleSelectable", {
        options: {
            select: null
        },
        _create: function () {
            var self = this;
            this.element.addClass('ui-selectable');
            this.element.delegate('li', 'click', function (e) {
                self.element.find('>li').removeClass('ui-selected');
                $(this).addClass('ui-selected');
    
                if ($.isFunction(self.options.select)) {
                    self.options.select.apply(self.element, [e, this]);
                }
    
            });
        },
        selected: function () {
            return this.element.find('li.ui-selected');
        },
        destroy: function () {
            $.Widget.prototype.destroy.apply(this, arguments); // default destroy
        }
    });
    
    0 讨论(0)
  • 2020-12-30 00:28

    If you want to disable non consecutive multiselection but still wish to keep the dragging selection you can do this.

             stop: function( event, ui ) {
                    if( $(".ui-selected, .ui-selecting").length > 1){
                        var elems = $('.ui-selected, .ui-selecting');
    
                        for(var i = 0; i < elems.length - 1; i++){
                            if($(elems[i]).closest('td').next('td').text() != $(elems[i+1]).text()){
                               //Non consecutive selection detected
                            }
                        }
                    }
                }
    

    It essentially checks if all elements are next to each other.

    0 讨论(0)
  • 2020-12-30 00:31

    What i did, is that i allow multiple selection but when the selection is done, i only keep the first element selected

    <ul id="select">
        <li>Row 1</li>
        <li>Row 2</li>
        <li>Row 3</li>
    </ul>
    

    This selects all the selected elements except the first one and deletes the selected status. So at the end, only one element will be selected. event.target corresponds to my ul element.

    $('#select').selectable({
        stop:function(event, ui){
            $(event.target).children('.ui-selected').not(':first').removeClass('ui-selected');
        }
    });
    

    I know this topic is kinda old, but i still stumbled upon it, so it can be useful to someone else

    0 讨论(0)
  • 2020-12-30 00:32

    Here's a more general solution than those previously posted:

        $element.selectable({
            selecting: function (e, ui) {
                // force single selection
                $(e.target).find('.ui-selectee.ui-selecting').not(ui.selecting).removeClass('ui-selecting');
                $(e.target).find('.ui-selectee.ui-selected').not(ui.selecting).removeClass('ui-selected');
            }
        });
    

    (The selectees may not always be children of the selectable, and holding onto the "first" selectee causes some weird behavior when you ctrl+click.)

    0 讨论(0)
  • 2020-12-30 00:33

    This worked for me. It prevents "lassoing" multiple rows and ctrl + click.

    $(function() {
    $("#selectable").selectable({
          selecting: function(event, ui){
                if( $(".ui-selected, .ui-selecting").length > 1){
                      $(ui.selecting).removeClass("ui-selecting");
                }
          }
    });
    });
    
    0 讨论(0)
提交回复
热议问题