【问题标题】:Multiple jQuery UI Tabs + connected Sortables not working as expected多个 jQuery UI 选项卡 + 连接的 Sortables 无法按预期工作
【发布时间】:2012-10-26 07:11:45
【问题描述】:

我正在使用 jQuery 1.8.2 和 jQuery UI 1.9.0。

这是来自jQuery UI Tabs Demo page 的可排序演示的扩展,带有两组选项卡+可排序,相互连接http://jsfiddle.net/sujay/cUDLF/

移动工作正常,但即使在refresh 之后,选项卡也无法按预期工作。

要重现此问题,请尝试将未选择的选项卡从顶部集移动到底部集,然后选择它。

您会看到选项卡和面板都已移至底部设置(底部设置的选择将被取消选择)。但是在选择时,顶部的选项卡会被取消选择。

更新

我现在可以让它工作了。检查http://jsfiddle.net/cUDLF/6/

但是正弦接收事件只获取绝对位置而不是索引。位置丢失。它总是附加到标签列表的末尾。

如果有办法找到索引,问题就会迎刃而解。

【问题讨论】:

    标签: jquery jquery-ui jquery-ui-tabs jquery-ui-sortable


    【解决方案1】:

    替换:

    tabs.tabs( "refresh" );
    

    与:

    tabs.tabs('destroy');
    tabs.tabs();
    

    【讨论】:

    • 但是调用refresh 和你的方法有什么区别。 destroy 并在某些情况下再次创建时会出现明显的闪烁。
    【解决方案2】:

    我终于找到了解决这个问题的方法。

    可以在http://jsfiddle.net/cUDLF/12/找到一个可行的解决方案。

    感谢this answer 中的提示。

    接收sn-p的样子

                receive: function (event, ui) {
                var receiver = $(this).parent(),
                    sender = $(ui.sender[0]).parent(),
                    tab = ui.item[0],
                    tab$ = $(ui.item[0]),
                // Find the id of the associated panel
                    panelId = tab$.attr( "aria-controls" ),
                    insertBefore = document.elementFromPoint(event.pageX,event.pageY);
    
                tab$ = $(tab$.removeAttr($.makeArray(tab.attributes).
                              map(function(item){ return item.name;}).
                              join(' ')).remove());
                tab$.find('a').removeAttr('id tabindex role class');
                if(insertBefore.parentElement == tab){
                    insertBefore = document.elementFromPoint(event.pageX + insertBefore.offsetWidth, event.pageY);
                }
                insertBefore = $(insertBefore).closest('li[role="tab"]').get(0);
                if(insertBefore)
                    tab$.insertBefore(insertBefore);
                else
                    $(this).append(tab$);
    
                $($( "#" + panelId ).remove()).appendTo(receiver);
                tabs.tabs('refresh');
            }
    

    如果您发现此方法有任何问题,请告诉我。

    【讨论】:

      【解决方案3】:

      这似乎适用于接收:

                  tabs.tabs("destroy");
                  $( "#" + panelId ).appendTo(receiver);
                  tabs.tabs();
      

      在这里演示http://jsfiddle.net/nxtwrld/yxgUR/1/

      【讨论】:

      • 这行得通。但是在某些情况下会出现视觉闪烁,我想避免这种情况。由于再次破坏和建设,闪烁发生。我认为refresh 方法将能够做到这一点。
      【解决方案4】:

      这是工作示例:http://jsfiddle.net/5qY5B/

      如果 newTab 和 oldTab 来自不同的选项卡容器,解决方法是阻止选项卡更改事件:)

      例子:

      安装了这个:

      var tabs = $( "#tabs_1, #tabs_2" ).tabs();
      

      使用这个(更新):

      var tabs = $( "#tabs_1, #tabs_2" ).tabs({
              beforeActivate : function( event, ui ) {        
                  if(ui.oldTab.parent().parent().attr("id") != ui.newTab.parent().parent().attr("id")) {
                      if( $( this ).tabs( "option", "active") == -1) $( this ).tabs( "option", "active", 0); // NEW
                      return false;
                  }        
              }    
          });
      

      【讨论】:

      • 您的解决方案并非在所有情况下都有效。当用户试图拖回移动的选项卡时,两个选项卡将在同一个选项卡组中突出显示(这只是一个简单的测试用例)。这可能会导致更多问题
      • 我仍然能够找到错误的条件。您可以通过在第一组 n 中激活“Proin dolor”来复制其中一个,然后将其向下移动到第二组。第一组现在没有活动标签。但是第二组有两个。
      • 是的,在这种情况下会出错。我建议尝试使用此回调事件:beforeActivateactivate
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2021-09-23
      • 2020-08-20
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多