2009-12-07 16 views
9

Sto cercando di aprire una fisarmonica sulla base di un collegamento i inviare alla paginajQuery fisarmonica, aprendo una scatola di base a href

Questo è il mio url

services.html # di branding

I sto usando il seguente codice nella testa:

<script type="text/javascript"> 
     $(document).ready(function(){ 
    $('#accordion').accordion({collapsible: true, animated: 'slide', autoHeight: false, navigation: true, active : 'false'}); 
     }); 
    </script> 

E la fisarmonica si presenta come:

<div id="accordion"> 
<h3 id="branding"><a href="#">Branding</a></h3> 
<div> 
<p>Does your business have a</p> 
</div> 
<h3><a href="#print">Print</a></h3> 
<div> 
<p>Brochures</a></p> 
</div> 
</div> 

Qualsiasi aiuto sarebbe molto apprezzato ... http://docs.jquery.com/UI/Accordion

+0

Qual è il problema? Stai ricevendo un errore, non sembra corretto? –

+0

Non apre la fisarmonica "branding" – Andy

+1

Solo un avvertimento per chiunque stia guardando che l'opzione "navigazione" è stata rimossa in [JQuery UI 1.9] (http://jqueryui.com/upgrade-guide/1.9/#deprecated-)-opzioni di navigazione-e-navigationfilter. Utilizzato per impostare il pannello attivo in base all'URL. Immagino che debba essere stato troppo utile. :( –

risposta

14

Oh vedo Jeff riferito che la versione dell'interfaccia utente corrente è rotto, ma io in realtà aveva una soluzione che utilizza la versione corrente ...

HTML

<div id="accordion"> 
<h3><a href="#branding">Branding</a></h3> 
<div> 
    <p>Does your business have a</p> 
</div> 
<h3><a href="#print">Print</a></h3> 
    <div> 
    <p>Brochures</p> 
    </div> 
</div> 

Script

$(function(){ 
$('#accordion').accordion({ 
    collapsible: true, 
    animated: 'slide', 
    autoHeight: false, 
    navigation: true 
}); 
// open content that matches the hash 
var hash = window.location.hash; 
var thash = hash.substring(hash.lastIndexOf('#'), hash.length); 
$('#accordion').find('a[href*='+ thash + ']').closest('h3').trigger('click'); 
}) 

Ho usato a[href$=...] in origine, ma l'ho modificato in a[href*=...] ... o funzionerà


Aggiornamento: il navigation option was removed from jQuery UI 1.10.0, in modo da utilizzare questo metodo:

CSS

.accordion { 
    position: relative; 
} 
.accordion .accordion-link { 
    position: absolute; 
    right: 1%; 
    margin-top: 16px; 
    z-index: 1; 
    width: 12px; 
    height: 12px; 
    background: url(link.png) center center no-repeat; /* approx 12x12 link icon */ 
} 

Script

var hashId = 0, 
    $accordion = $('#accordion'); 
if (window.location.hash) { 
    $accordion.children('h3').each(function(i){ 
    var txt = $(this).text().toLowerCase().replace(/\s+/g,'_'); 
    this.id = txt; 
    if (txt === window.location.hash.slice(1)) { 
     hashId = i; 
    } 
    }); 
} 

$accordion.accordion({ 
    active: hashId, 
    animate: false, 
    heightStyle: 'content', 
    collapsible: true, 
    create: function(event, ui) { 
    $accordion.children('h3').each(function(i){ 
     $(this).before('<a class="accordion-link link" data-index="' + i + '" href="#' + this.id + '"></a>'); 
    }); 
    $accordion.find('.accordion-link').click(function(){ 
     $accordion.accordion("option", "active", $(this).data('index')); 
    }); 
    } 
}); 
+0

grazie a entrambi voi per aver notato il problema con la versione e grazie per la soluzione sopra – Andy

+0

funziona come un fascino! Molto bella soluzione – frabiacca

+0

Ho aggiornato la mia risposta per lavorare con jQuery UI v1.10.0 + – Mottie

2

La cattiva notizia è che il plugin fisarmonica è attualmente rotto (come del 1.7.2, which you can see from ticket #4653). La buona notizia è che è stato risolto, e you can already grab the latest version here - ma attenzione, non è ancora una versione stabile!

Se si utilizza il codice 1.8.1, la funzione di navigazione funziona di nuovo. L'impostazione navigation: true consentirà alla fisarmonica di aprire automaticamente il pannello corretto quando si sfoglia un URL che corrisponde al frammento di navigazione (in modo che l'esempio funzioni: services.html#branding).

Penso che si desidera anche aggiungere l'identificatore mancante per il tuo tag di ancoraggio di branding, come questo:

<h3 id="branding"><a href="#branding">Branding</a></h3> 

Infine, si consiglia di utilizzare the technique described here per aggiornare l'URL della tua pagina in modo da riflettere che pannello di fisarmonica è stato cliccato senza ricaricare la tua pagina.

+0

Grazie per il tuo commento Jeff – Andy

+1

Questo è di grande interesse per me, ma il tuo collegamento "tecnica qui descritta" è morto. Qualsiasi aggiornamento? – Andrew

0

See:Activate Accordion Section By URL Hash

Demo:found here.

TL; DR ... Ecco il codice:

$("#accordion").accordion({ 

    // Called when the widget instance is created. 
    create: function(e, ui) { 

     // The accordion DOM element. 
     var $this = $(this); 

     // Triggered when the browser hash changes. 
     $(window).on("hashchange", function(e) { 

       // The selector string used to find all accordion headers. 
      var headers = $this.accordion("option", "header"), 

       // The header we're looking for, based on the location hash. 
       header = $(location.hash), 

       // The index of the header we're looking for. 
       index = $this.find(headers).index(header); 

      // If there's a valid index, activate the accordion section. 
      // Otherwise, do nothing. 
      if (index >= 0) { 
       $this.accordion("option", "active", index);  
      } 

     }); 

     // Make sure this works on initial page load. 
     $(window).trigger("hashchange"); 

    } 

}); 

... e il codice HTML:

<div id="accordion"> 
    <h3 id="section1">Section 1</h3> 
    <div> 
    <p> 
    Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer 
    ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit 
    amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut 
    odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate. 
    </p> 
    </div> 
    <h3 id="section2">Section 2</h3> 
    <div> 
    <p> 
    Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet 
    purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor 
    velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In 
    suscipit faucibus urna. 
    </p> 
    </div> 
    <h3 id="section3">Section 3</h3> 
    <div> 
    <p> 
    Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. 
    Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero 
    ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis 
    lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. 
    </p> 
    <ul> 
     <li>List item one</li> 
     <li>List item two</li> 
     <li>List item three</li> 
    </ul> 
    </div> 
    <h3 id="section4">Section 4</h3> 
    <div> 
    <p> 
    Cras dictum. Pellentesque habitant morbi tristique senectus et netus 
    et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in 
    faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia 
    mauris vel est. 
    </p> 
    <p> 
    Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. 
    Class aptent taciti sociosqu ad litora torquent per conubia nostra, per 
    inceptos himenaeos. 
    </p> 
    </div> 
</div> 

ha funzionato bene per le mie esigenze!

0

Ecco come fare ...

Si aggiorna l'hash per voi in base a ciò che è dentro i tag h3.

è anche possibile specificare un indice impostando un attributo sulla fisarmonica div contenitore come questo ... data-attiva-index = "2"

var initAccordion = function(_t) { 
    _t.each(function() { 
     var obj = { 
      heightStyle: 'content', 
      collapsible: true, 
      beforeActivate: function(event, ui) { 
       window.location.hash = ui.newHeader.attr('id'); 
      } 
     }; 
     // preset the active tab in html [0 = first tab] 
     var attr = $(this).attr('data-active-index'); 
     obj.active = null; 
     if(attr !== null && attr !== undefined) { 
      obj.active = Number(attr); 
     } 
     // human readable ids   
     var hash = window.location.hash; 
     $(this).find('>h3').each(function(i){ 
      this.id = $(this).text().toLowerCase().replace(/[^a-z0-9]/g, function(s) { 
       var c = s.charCodeAt(0); 
       if (c == 32) return '_'; // space 
       return ''; 
      }); 
      if(hash && hash == '#'+this.id) { 
       obj.active = i; 
      } 
     }); 
     $(this).accordion(obj); 
    }); 
};initAccordion($(".accordion")); 
2

modo più semplice per farlo è usare focusIn.

 $(function() { 
    $("#accordion").accordion({ 
     event: "focusin" 
    }); 
}); 


<div id="accordion"> 
<h3 id="section-1">Section 1</h3> 
<div> 
    <p>blaa </p> 
</div> 
<h3 id="section-2">Section 2</h3> 
<div> 
    <p>bla</p> 
</div> 

potete href dalla stessa pagina o da una pagina diversa, semplicemente facendo

<a href "otherpage.html#section-1">click to go to section 1</a> 
Problemi correlati