2010-07-01 41 views
7

Tôi có một trang chứa một tập hợp các tab jQuery. Tất cả các tab trỏ vào cùng một div đích, nhưng tải nó với nội dung khác nhau thông qua ajax. Khi tôi thực hiện tải trang đầy đủ ban đầu, tôi cần đặt tab hoạt động khác nhau tùy thuộc vào các yếu tố khác nhau. Nội dung trong div mục tiêu đã được đặt trên máy chủ cho lần tải ban đầu này, vì vậy tôi không cần phải nhấp vào tab, tôi chỉ cần đặt tab chính xác thành 'đã chọn'. Tôi đã thử đặt lớp của phần tử html "li" có liên quan thành "ui-tabs-selected". Điều này có hiệu quả mong muốn ban đầu, nhưng một khi trang được tải thì khi chọn một tab khác, thẻ được chọn trước sẽ không tắt, để lại hai tab được chọn. Vì vậy, không ai biết một cách khác để chọn trước một tab (mà không gây ra nó được nhấp), hoặc một giải pháp cho hành vi "ui-tab-chọn" lạ mà tôi đang nhìn thấy.Các tab jQuery chọn tab cụ thể

Cảm ơn.

<script type="text/javascript"> 
    $(function() { 
     $("#panelTabs").tabs({ 
      ajaxOptions: { 
       error: function(xhr, status, index, anchor) { 
        $(anchor.hash).html("Couldn't load this tab. We'll try to fix this as soon as possible."); 
       } 
      } 
     }); 

     $("#panelTabs").tabs({ 
      select: function(event, ui) { 
       getPage('hps.aspx?cmd=zz_' + ui.tab.id, 'panelA'); 
      } 
     }); 
    }); 
    </script> 

Và C# fragment đó xây dựng các UL:

StringBuilder tabsLiteral = new StringBuilder(); 
      tabsLiteral.Append("<ul>"); 
      foreach (KeyValuePair<string, Tab> kvp in tabs) 
      { 
       tabsLiteral.Append("<li>"); 
       // Note - the kvp.Value.URI determines what should happen when the Tab is clicked 
       tabsLiteral.Append("<a id=\"" + kvp.Value.URI + "\" href=\"#panelTabs\">" + kvp.Value.Caption + "</a>"); 
       tabsLiteral.Append("</li>"); 
      } 
      tabsLiteral.Append("</ul>"); 
      _panelTabs.Controls.Add(new LiteralControl(tabsLiteral.ToString())); 

      HtmlGenericControl ctl = new HtmlGenericControl(); 
      StringBuilder html = new StringBuilder(); 
      html.Append("<script type=\"text/javascript\">"); 
      html.Append("$(\"#panelTabs\").tabs({selected: 2});"); 
      html.Append("</script>"); 
      ctl.InnerHtml = html.ToString(); 
      _panelTabs.Controls.Add(ctl); 

Một phiên bản:

StringBuilder tabsLiteral = new StringBuilder(); 
      tabsLiteral.Append("<ul>"); 
      foreach (KeyValuePair<string, Tab> kvp in tabs) 
      { 
       string active = ""; 
       if (currentTabCaption == kvp.Value.Caption) 
       { 
        //active = " class=\"ui-tabs-selected\""; 
       } 
       tabsLiteral.Append("<li" + active + ">"); 
       // Note - the kvp.Value.URI determines what should happen when the Tab is clicked 
       tabsLiteral.Append("<a id=\"" + kvp.Value.URI + "\" href=\"#panelTabs\">" + kvp.Value.Caption + "</a>"); 
       tabsLiteral.Append("</li>"); 
      } 
      tabsLiteral.Append("</ul>"); 
      _panelTabs.Controls.Add(new LiteralControl(tabsLiteral.ToString())); 

      HtmlGenericControl ctl = new HtmlGenericControl(); 
      StringBuilder html = new StringBuilder(); 
      html.Append("<script type=\"text/javascript\">"); 
      //html.Append("$(\"#panelTabs\").tabs('option','selected', 2);"); 
      html.Append(@"$(function() { 
       alert('initialising tabs'); 
       $(""#panelTabs"").tabs({ 
        ajaxOptions: { 
         error: function(xhr, status, index, anchor) { 
          $(anchor.hash).html(""Couldn't load this tab. We'll try to fix this as soon as possible.""); 
         } 
        }, 
        select: function(event, ui) { 
         getPage('hps.aspx?cmd=zz_' + ui.tab.id, 'panelA'); 
        } 
       }); 
      });"); 
      html.Append("$(\"#panelTabs\").tabs({selected: 2});"); 
      html.Append("</script>"); 
      ctl.InnerHtml = html.ToString(); 
      //_panelTabs.Controls.Add(ctl); 
      Page.Controls.Add(ctl); 
+0

bạn có một mẫu mã cho thấy điều này trong hành động? – spinon

+0

Lưu ý chắc chắn nếu đây là những gì bạn đang theo sau, nhưng đây là đoạn C# xây dựng li: nếu (currentTabCaption == kvp.Value.Caption) {active = "class = \" ui-tabs-selected \ " "; } tabsLiteral.Append (""); // Lưu ý - kvp.Value.URI xác định điều gì sẽ xảy ra khi Tab được nhấp vào tabLiteral.Append ("" + kvp.Value.Caption + ""); tabsLiteral.Nối thêm (""); – DEH

Trả lời

4

Bạn có thể có dòng đầu tiên bên trong chức năng chuyển đổi tab của bạn loại bỏ các lớp chọn:

var uiTabsSelected = '.ui-tabs-selected'; 
$(uiTabsSelected).removeClass(uiTabsSelected); 
+0

cảm ơn, âm thanh như một ý tưởng hay - tôi đã thử dán hai dòng của bạn vào hàm nhưng js đang phàn nàn về dòng đầu tiên (mong đợi; tại 'char' đầu tiên) - bất kỳ ý tưởng nào tại sao? – DEH

+0

cảm ơn đã chỉ cho tôi đúng hướng – DEH

22

Những gì bạn đang tìm kiếm là selected option. Ví dụ.

$("#MyTabs").tabs({ 
    selected: 2 
}); 
+0

@ Gert G - cảm ơn, hoạt động ban đầu nhưng sau đó thể hiện chính xác hành vi tương tự như lớp "ui-tabs-selected" được thêm vào phần tử li tức là nhấp vào tab khác mà tôi kết thúc với hai tab được chọn. Khi nhấp một lần nữa nó sẽ tự sắp xếp và chỉ một tab được hiển thị như được chọn. – DEH

+0

@DEH - Tôi chưa bao giờ gặp vấn đề với nó. Bạn có thể đăng một số mã lên trong câu hỏi của bạn không? Cảm ơn. –

+0

Điều này sẽ hoạt động. @DEH Đăng đánh dấu của bạn và bất kỳ JS có liên quan nào trong câu hỏi của bạn. – offner

1

Thay đổi này:

html.Append("$(\"#panelTabs\").tabs({selected: 2});"); 

Để này:

html.Append("$(\"#panelTabs\").tabs('option','selected', 2);"); 

Edit: và ...

$(function() { 
     $("#panelTabs").tabs({ 
      ajaxOptions: { 
       error: function(xhr, status, index, anchor) { 
        $(anchor.hash).html("Couldn't load this tab. We'll try to fix this as soon as possible."); 
       }}, 
      select: function(event, ui) { 
       getPage('hps.aspx?cmd=zz_' + ui.tab.id, 'panelA'); 
      } 
     });  

    }); 
+0

trong thử nghiệm của tôi mà không chọn một tab nào cả, trong khi phiên bản trước đó đã chọn một tab nhưng không 'phát hành' nó khi một tab khác được nhấp. – DEH

+0

@DEH loại bỏ dòng html.append ..., thêm trường ẩn để giữ giá trị của tab đã chọn, sau đó thêm: ", selected: $ ('[id * =" TabToSelect "]'). Val() "cho tập lệnh khởi tạo của bạn, đặt giá trị của TabToSelect trong codebehind – offner

+0

@DEH Tôi đã rời khỏi a} trước đó. Ngoài ra, nếu bạn cố gắng chọn tab sau khi bạn khởi tạo các tab, tab sẽ gọi sự kiện bạn chọn. đây là một ví dụ đơn giản: http://jsbin.com/anitu3 – offner

0

Giải pháp là để thêm và loại bỏ các lớp học, như ethagnawl gợi ý. C# sau đây cho thấy cả UL được xây dựng, cộng với việc chèn kịch bản lệnh jQuery cần thiết. Bit quan trọng là trong hàm show: nơi các lớp đang được thao tác. Đó là mã này hoạt động xung quanh vấn đề.

StringBuilder tabsLiteral = new StringBuilder(); 
      tabsLiteral.Append("<ul>"); 
      foreach (KeyValuePair<string, Tab> kvp in tabs) 
      { 
       //string tabClass = " class=\"ui-state-default\""; 
       string tabClass = " class=\"ui-state-default\""; 
       if (currentTabCaption == kvp.Value.Caption) 
       { 
        tabClass = " class=\"ui-tabs-selected\""; 
       } 
       tabsLiteral.Append("<li" + tabClass + ">"); 
       //tabsLiteral.Append("<li>"); 
       // Note - the kvp.Value.URI determines what should happen when the Tab is clicked 
       tabsLiteral.Append("<a id=\"" + kvp.Value.URI + "\" href=\"#panelTabs\">" + kvp.Value.Caption + "</a>"); 
       tabsLiteral.Append("</li>"); 
      } 
      tabsLiteral.Append("</ul>"); 
      _panelTabs.Controls.Add(new LiteralControl(tabsLiteral.ToString())); 

      HtmlGenericControl ctl = new HtmlGenericControl(); 
      StringBuilder html = new StringBuilder(); 
      html.Append("<script type=\"text/javascript\">"); 
      //html.Append("$(\"#panelTabs\").tabs('option','selected', 2);"); 
      html.Append(@"$(function() { 
       $('#panelTabs').tabs({ 
        select: function(event, ui) { 
         getPage('hps.aspx?cmd=zz_' + ui.tab.id, 'panelA'); 
        }, 
        show: function(event, ui) { 
         // You MUST set both 'ui-state-active' AND 'ui-tabs-selected' for tab UI to operate properly - if either are missing it doesn't work 
         $('.ui-tabs-selected').removeClass('ui-state-active').removeClass('ui-tabs-selected'); 
         $(ui.tab).addClass('ui-state-active').addClass('ui-tabs-selected'); 

         //$('#panelTabs').tabs('selected',idx); // WOULD have been nice if this had worked, but UI does not keep up 
        } 
       }); 
      });"); 
      html.Append("</script>"); 
      ctl.InnerHtml = html.ToString(); 
      //Page.Header.Controls.Add(ctl); // NEVER place script in the page header when the script must survive an AJAX delivery - it won't run 
      Page.Controls.Add(ctl); // Acceptable to place script on the page, as it WILL survive AJAX delivery 
1

Trong trường hợp bất cứ ai khác đến đây tìm kiếm câu trả lời, các hiện (kể từ ngày này) cách để chọn một tab (jQuery UI 1.10) là sử dụng các "hoạt động" tùy chọn:

khởi tạo các tab với các tùy chọn hoạt động quy định:

$(".selector").tabs({ active: 1 }); 

http://api.jqueryui.com/tabs/#option-active

Các vấn đề liên quan