10

Recentemente ho aggiornato il mio sito per il Bootstrap 3 e sono in procinto di passare attraverso tutti i layout per aggiornare i nomi delle classi e varie funzionalità per funzionare correttamente. Il mio problema più recente è che i drop down non sembrano funzionare. All'inizio pensavo di non aver implementato il codice correttamente per la barra di navigazione, ma dopo essermi frustrato, in realtà ho provato a sbarazzarmi della barra di navigazione e ad usare quella direttamente dallo BS 3 documentation. Anche quel codice non funziona. Ho esaminato questo aspetto e sono abbastanza sicuro di avere tutte le librerie .js corrette. Ecco il mio application.js:Bootstrap 3 a discesa non funziona con Rails 4 & Turbolinks

//= require jquery 
//= require bootstrap-sprockets 
//= require jquery.ui.datepicker 
//= require jquery.timepicker.js 
//= require jquery_ujs 
//= require turbolinks 
//= require bootstrap 
//= require jquery.remotipart 
//= require chosen-jquery 
//= require_tree . 

Ecco quello che appare nel mio <head>:

<script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/affix.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/alert.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/button.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/carousel.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/collapse.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/dropdown.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/tab.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/transition.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/scrollspy.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/modal.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/tooltip.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap/popover.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap-sprockets.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.core.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.datepicker.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.timepicker.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.iframe-transport.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.remotipart.js?body=1"></script> 

E devo popovers e altri elementi pieghevoli sulla stessa pagina, e tutto funziona bene, quindi sono abbastanza certo tutto il .js è intatto.

Ho letto altrove che i turbolinks possono creare problemi per Bootstrap 3 e hanno persino provato (e poi abbandonato e ripristinato) la gemma jquery.turbolinks senza alcun risultato. Inutile dire che non ho idea di come riprodurlo su jsfiddle (mi dispiace).

Infine, ho verificato che le seguenti quattro funzioni js sono chiamati ogni volta che clicco un menu a discesa, presumibilmente nel seguente ordine:

jquery.js: 4306

  eventHandle = elemData.handle = function(e) { 
       // Discard the second event of a jQuery.event.trigger() and 
       // when an event is called after a page has unloaded 
       return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? 
        jQuery.event.dispatch.apply(eventHandle.elem, arguments) : 
        undefined; 
      }; 
      // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events 
      eventHandle.elem = elem; 

turbolinks. js: 324

installClickHandlerLast = function(event) { 
     if (!event.defaultPrevented) { 
      document.removeEventListener('click', handleClick, false); 
      return document.addEventListener('click', handleClick, false); 
     } 
    }; 

tujquery.js: 4306 (ancora)

turbolinks. js: 324

handleClick = function(event) { 
     var link; 
     if (!event.defaultPrevented) { 
      link = extractLink(event); 
      if (link.nodeName === 'A' && !ignoreClick(event, link)) { 
       visit(link.href); 
       return event.preventDefault(); 
      } 
     } 
    }; 

Qualsiasi indizio su cosa potrebbe accadere qui e su come risolverlo?

risposta

2

ho risposto a questa domanda sopra a: turbolinks issues with bootstrap modal

In breve: è necessario il jquery-turbolinks gemma.

+0

Se si utilizza Rails 4.2.0, utilizzare questa gemma può causare strani comportamenti di bootstrap, sembrare come rails 4.2.0 i turbolinks funzionano bene bootstrap al volo. – zw963

12

Questo problema può essere risolto senza utilizzare jquery-turbolinks. Devi prima capire perché succede. Quando i turbolinks sono abilitati e si fa clic su un collegamento, viene attivato un evento page:change e tutto il javascript viene rivalutato dall'html appena caricato.

Questo include il bootstrap JavaScript codice che è caricato all'interno application.js. Quando il javascript di bootstrap viene ricaricato, si rompe. È possibile risolvere questo problema utilizzando data-turbolinks-eval=false nel tag application.js <script>.

Per ERB:

<%= javascript_include_tag 'application', 'data-turbolinks-eval' => false %> 
<%= javascript_include_tag params[:controller] %> 

Per SLIM:

== javascript_include_tag 'application', 'data-turbolinks-eval': false 
== javascript_include_tag params[:controller] 
+0

Ottima soluzione. Stavo iniziando a richiamare tutte le mie funzioni javascript bootstrap manualmente al cambio di pagina, ma con questo non devo farlo. – Xavier

+0

Per Webpacker: '<% = javascript_pack_tag 'application', 'data-turbolinks-eval': false%>' – wom

+0

Perfetto, funziona perfettamente, grazie mille! –

2

sono stato in grado di risolvere il problema con l'aggiunta di "data-turbolinks-eval" => false per il mio link Bootstrap CDN.

<%= javascript_include_tag 
    "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js", 
    "data-turbolinks-eval" => false 
%> 
2

Non si utilizzano i turbolinks in modo corretto. I turbolinks non dovrebbero essere usati con le risorse. Il metodo di utilizzo dei turbolinks può essere visto qui: Handling Turbolinks and JS incompatibility in Rails

Non si dovrebbero cambiare javascript_links. Solo nel App/assets/javascripts/application.js codice put come:

//= require jquery 
//= require jquery.turbolinks 
//= require jquery_ujs 
// 
// ... your other scripts here ... 
// 
//= require turbolinks 

dopo aver messo jquery-turbolinks in Gemfile. La richiesta di bootstrap dovrebbe venire tra jquery.turbolinks e turbolinks.

+2

Dovresti includere i dati rilevanti dal link nella tua risposta, invece di dare solo il link. –

+0

Caso in questione, il link è morto a partire da questo post. :( –

Problemi correlati