【问题标题】:JQuery Selectable - cancel current selected elementJQuery Selectable - 取消当前选中的元素
【发布时间】:2012-10-03 08:20:39
【问题描述】:

我有一个包含不同元素的列表。我希望所有人都可以选择,但只能分组。喜欢:

<ul>
<li rel="group1">Item 1</li>
<li rel="group1">Item 2</li>
<li rel="group2">Item 3</li>
<li rel="group2">Item 4</li>
<li rel="group3">Item 5</li>
<li rel="group3">Item 6</li>
</ul>

我写了一些可以工作的东西,但是如果当前元素的 rel 属性与第一次选择的不同,我不知道如何取消当前选择。

    var selected = null;

    $( "#selectable" ).selectable({
        selecting: function(event, ui) {
            if (!selected)
                selected = $(ui.selecting).attr('rel');

            if (selected != $(ui.selecting).attr('rel')){
               // cancel this selection
            }
        }
    });

【问题讨论】:

    标签: jquery jquery-ui-selectable


    【解决方案1】:

    您可以使用filter 选项来启用仅选择某些列表项。

    我为你准备了这个DEMO,过滤器只有一个问题。从 selecting 处理程序中更改启用的项目时,它不起作用。因此,我在stop 处理程序中添加了一个小修复程序,在该处理程序中,我从未启用的项目中删除了选择。

    您的脚本可能如下所示:

    var locked = false;
    
    function enableAll() {
        $('li').addClass('enabled');
        locked = false;
    }
    
    $("#selectable").selectable({
    
        // allow only enabled items to be selected
        filter: '.enabled',
    
        selecting: function(event, ui) {
    
            if (!locked) {
    
                var group = $(ui.selecting).attr('rel');
    
                // disable all items belonging to other groups
                $("#selectable li[rel!='" + group + "']").removeClass('enabled');
    
                locked = true;
            } 
    
        },
    
        stop: function() {
    
            // this fixes selectable behavior 
            // (it ignores dynamically added filter while selecting)
            $(this).find('li.ui-selected:not(.enabled)').removeClass('ui-selected');
    
            // if no item is selected, then enable all groups
            if($(this).find('.ui-selected').length == 0) {
                enableAll();
            };
        }
    
    });
    
    // initialize
    enableAll();​
    

    【讨论】:

      【解决方案2】:

      检查此FIDDLE - 分组选择。

      HTML

      <ul id="selectable">
          <li class="ui-widget-content" rel="group1">Item 1</li>
          <li class="ui-widget-content" rel="group1">Item 2</li>
          <li class="ui-widget-content" rel="group1">Item 3</li>
          <li class="ui-widget-content" rel="group2">Item 4</li>
          <li class="ui-widget-content" rel="group2">Item 5</li>
          <li class="ui-widget-content" rel="group3">Item 6</li>
          <li class="ui-widget-content" rel="group3">Item 7</li>
      </ul>​
      

      jquery

      $("#selectable").selectable({
          selected: function (event, ui) {
              var gr1Count = 0;
              var gr2Count = 0;
              var gr3Count = 0;
              $(".ui-selected").each(function () {
                  // Group 1
                  if ('group1' == $(this).attr('rel')) {
                      gr1Count++;
                  }
                  if (gr1Count > 1) {
                      $(this).removeClass('ui-selected')
                  }
                  // Group 2
                  if ('group2' == $(this).attr('rel')) {
                      gr2Count++;
                  }
                  if (gr2Count > 1) {
                      $(this).removeClass('ui-selected')
                  }
                  // Group 3
                  if ('group3' == $(this).attr('rel')) {
                      gr3Count++;
                  }
                  if (gr3Count > 1) {
                      $(this).removeClass('ui-selected')
                  }
              });
          }
      });
      

      【讨论】:

        【解决方案3】:
        $(function() {
                    var message = $('#message');
                    var tr = $('#tbl').find('tr');
                    tr.bind('click', function(event) {
                        var values = '';
                        tr.removeClass('row-highlight');
                        var tds = $(this).addClass('row-highlight').find('td');
        
                        $.each(tds, function(index, item) {
                            values = values + 'td' + (index + 1) + ':' + item.innerHTML + '<br/>';
                        });
                        message.html(values);
        
                    });
                });
        

        鼠标悬停:

            var message = $('#message');
            var tr = $('#tbl').find('tr');
        
            tr.hover(
                 function() {  // mouseover
                     $(this).addClass('row-highlight');
                     var values = '';
                     var tds = $(this).find('td');
        
                     $.each(tds, function(index, item) {
                         values = values + 'td' + (index + 1) + ':' + item.innerHTML + '<br/>';
                     });
                     message.html(values);
                 },
                 function() {  // mouseout
                     $(this).removeClass('row-highlight');
                     message.html('');
                 }
            );
        });
        

        自定义 TD:

        <table id ="table1">
            <th>MAHDI</th>
            <th>PISHGUY</th>
            <tr>
                <td id = "1">username</td>
                <td id = "2">666</td>
            </tr>
        </table>
        
        $('#table1 tr').each(function (){
            var vara = $(this).find('#2').html();
            if(vara != null)
                alert($(this).find('#2').html());
        });
        

        或:

        <tr class="rowid">
            <td class="user">A</td>
            <td class="id">B</td>
        </tr>
            $(document).ready(function(){ 
                rows = $(".rowid").each(function(index,value){
                        user = $(value).children(".user").text();
                        id = $(value).children(".id").text();
                        alert(id+'\t'+user);
                });
            });
        

        【讨论】:

          【解决方案4】:

          我不得不做类似的事情。我最近做的一个项目有多个部分分成几行,每行有三个部分或列。我们需要该功能以某种方式工作,如果它们将第 1 列从位置 1 排序到位置 3,那么所有其他行将相应地对其列进行排序。我通过调用 animate 函数来完成此操作,当排序完成时,它将抓取所有其他触发排序的关系列并重新定位它们。你可以在这里做同样的事情,或者只是通过在每个组周围添加一个容器来重建你的列表,然后按容器排序,并禁用容器内的排序功能。因此,第 1 组将是列表项,但在排序时,会作为单个实体进行排序。希望这会有所帮助。编码愉快!

          【讨论】:

            猜你喜欢
            • 2015-08-29
            • 1970-01-01
            • 1970-01-01
            • 2018-07-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-26
            • 1970-01-01
            相关资源
            最近更新 更多