2010-07-01 15 views
7

Ho una pagina contenente un insieme di schede jQuery. Tutte le schede puntano allo stesso target div, ma lo caricano con contenuti diversi tramite ajax. Quando eseguo il caricamento iniziale della pagina intera, è necessario impostare la scheda attiva in modo diverso in base a vari fattori. Il contenuto nel div target è già impostato sul server per questo carico iniziale, quindi non è necessario fare clic sulla scheda, ho solo bisogno di impostare la scheda corretta su 'selezionato'. Ho provato a impostare la classe del relativo elemento "li" html su "ui-tabs-selected". Questo ha l'effetto iniziale desiderato, ma una volta caricata la pagina, selezionando un'altra scheda, quella preselezionata non si spegne, lasciando selezionate due schede.schede jQuery selezione scheda specifica

Quindi, qualcuno sa un modo alternativo per preselezionare una scheda (senza far sì che venga cliccato), o una soluzione per il comportamento strano "ui-tabs-selezionato" che sto vedendo.

Grazie.

<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> 

E il # frammento C che costruisce l'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); 

Un'altra versione:

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

avete un esempio di codice che mostra in azione? – spinon

+0

Nota se questo è quello che stai cercando, ma qui è il frammento C# che crea il li: if (currentTabCaption == kvp.Value.Caption) {active = "class = \" ui-tabs-selected \ " "; } tabsLiteral.Append (""); // Nota: il kvp.Value.URI determina cosa dovrebbe accadere quando si fa clic sulla scheda TabsLiteral.Append ("" + kvp.Value.Caption + ""); tabsLiteral.Aggiungi (""); – DEH

risposta

4

si potrebbe avere la prima linea all'interno della funzione di commutazione scheda rimuovere la classe selezionata:

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

grazie, sembra una buona idea - ho provato ad incollare le tue due linee nella funzione ma js si lamenta della prima riga (aspettandosi, al primo '-' char ') - qualche idea per quale motivo? – DEH

+0

grazie per avermi indirizzato nella giusta direzione – DEH

22

Quello che stai cercando è il selected option. Per esempio.

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

@Gert G - grazie, che funziona inizialmente ma poi mostra esattamente lo stesso comportamento della classe "ui-tabs-selected" aggiunta all'elemento li, ovvero facendo clic su un'altra scheda. con due schede selezionate. Facendo nuovamente clic si ordina da solo e viene mostrata solo una scheda come selezionata. – DEH

+0

@DEH - Non ho mai avuto problemi con esso. Puoi pubblicare qualche codice nella tua domanda? Grazie. –

+0

Questo dovrebbe funzionare. @DEH Pubblica il tuo markup e qualsiasi JS pertinente nella tua domanda. – offner

1

Modifica questo:

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

A tal:

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

Edit: e ...

$(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

nel mio test che non seleziona affatto una scheda, mentre la versione precedente ha selezionato una scheda ma non la ha "rilasciata" quando si fa clic su un'altra scheda. – DEH

+0

@DEH sbarazzarsi della riga html.append ..., aggiungere un campo nascosto per contenere il valore della scheda selezionata, quindi aggiungere: ", selezionato: $ ('[id * =" TabToSelect "]'). Val() "al tuo script di inizializzazione, imposta il valore di TabToSelect nel codice dietro – offner

+0

@DEH che ho lasciato prima}. Inoltre, se provi a selezionare la scheda dopo aver inizializzato le tue schede, chiamerà il tuo evento selezionato. ecco un semplice esempio: http://jsbin.com/anitu3 – offner

0

La soluzione era quella di aggiungere e rimuovere le classi, come suggerito dall'ethagnawl. Il seguente C# mostra sia l'UL che viene costruito, più l'iniezione di script jQuery richiesta. Il bit importante è nello spettacolo: funzione in cui le classi vengono manipolate. È questo codice che funziona attorno al problema.

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

Nel caso in cui nessuno viene qui a cercare la risposta, il corrente (a partire da questa data) modo per selezionare una scheda (jQuery UI 1.10) è quello di utilizzare l'opzione "attiva":

inizializzare le schede con l'opzione attiva specificato:

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

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

Problemi correlati