2012-08-27 23 views
5

Sprawdź ten fragment kodu: http://jsfiddle.net/u6N6T/3/. Akordeon działa poprawnie.Jak zdobyć Twitter Bootstrap do pracy z prototype.js?

Ale jest uszkodzony, gdy załadowany jest prototype.js, patrz http://jsfiddle.net/jWZBD/8/.

Połączyłem się z http://api.jquery.com/jQuery.noConflict/, aby JQuery działał razem z prototypem, ale akordeon nie działa, nawet jeśli zawijam plik bootstrap.js do "jQuery (document) .ready (function ($) {});".

Czy jest ktoś, kto potrafi uruchomić Bootstrap podczas ładowania prototypu? Czy muszę przekonwertować wszystkie istniejące javascripty oparte na prototypach na JQuery?

Odpowiedz

6

miał ten sam problem. Nie udało mi się tego naprawić, ale znalazłem pracę.

Najpierw użyj $.noConflict() i zrób jak ShaunOReilly powiedział i zastąp wszystkie znaki $ w Bootstrap.js z jQuery. Zwróć jednak uwagę, że bootstrap ma wiele zmiennych o nazwie $ na początku - nie są to odwołania do jQuery, ale są częścią nazwy zmiennej. Nie musisz ich zmieniać. Zauważyłem, że wyszukiwanie i zastępowanie wystąpień $., $( i $) robi lewę.

Następnie nie ładuj wtyczki do uruchamiania systemu. Jeśli ładujesz pełną bibliotekę w jednym skrypcie, wejdź i usuń funkcję przejścia (po prawej stronie u góry pliku bootstrap.js v2.3.0). Utracisz animacje przejścia, ale struktury zwinięcia nadal będą działać. Zobacz przykład this fiddle.

Naprawi to działanie przełączania w interakcji użytkownika, ale automatyczne przełączniki będą nadal łamane - na przykład pokazywanie/ukrywanie menu nawigacji na rozmiarach strony. Aby rozwiązać te problemy, wystarczy zaimplementować własny detektor zdarzeń i bezpośrednio wywołać funkcję bootstrap. Zobacz numer api w celach informacyjnych.

Na przykład, aby rozwiązać problem z paska nawigacyjnego na stronie zmienia rozmiar, użyłem tego kodu:

window.onresize = function(event) { 
    var nav = jQuery(".collapse"); 
    if (jQuery(window).width() > 940) nav.collapse('show'); 
    else nav.collapse('hide'); 
} 
+0

Chciałem tylko podziękować za to rozwiązanie, jego trochę pracy, ale niesamowite w jej wynikach. jako FYI, ale podczas wyszukiwania '$)' otrzymasz kilka wyników regularnych, które będą mieszane tam również, nie znalazłem żadnych przypadków, w których '$)' było konieczne, aby zmienić na 'jQuery)' – Kender

+0

Jeśli spojrzysz na kod źródłowy bootstrap.js, zauważysz, że cała rzecz jest hermetyzowana w 'function ($) {...} (jQuery)', więc alias $ jest zlokalizowany i poprawnie wskazuje na jQuery wewnątrz wtyczki Bootstrap , co oznacza, że ​​zastąpienie "$" przez "jQuery" w bootstrap.js nie jest konieczne. Jeśli jest to wykonalne, rozsądnym rozwiązaniem byłoby zastąpienie wszystkich funkcji Prototype.js odpowiednikami jQuery i pozbycie się Prototype.js. Nie jest optymalne ładowanie dwóch dużych bibliotek na stronie internetowej. – 10basetom

0

dwie opcje:

Wymień wszystko w aktach Twitter js ze zwyczajem jednym, i zastąpić wszystkie $ znaki ze słowem „jQuery”

można napisać własną zaklejony rodzaju funkcją przełączania jeśli to jest jedynym bitem, który jest problemem.

Inną opcją jest konwersja elementów Prototype do jQuery. Osobiście nienawidzę używać prototypu, kiedy mogę używać jQuery.

Oto kolejny przykład z podobnym problemem: jQuery & Prototype Conflict

Albo możliwe rozwiązanie można znaleźć tutaj: http://www.dynamicdrive.com/forums/showthread.php?29309-Content-Glider-and-Lighbox-Conflict

+0

Dzięki za odpowiedź. Nie jestem pewien, czy pierwsza opcja zadziała, jak próbowałem przenieść kod bootstrap wewnątrz "jQuery (document) .ready (function ($) {});". Więc nie sądzę, że jest to konflikt nazw. Poza tym właśnie debugowałem skrypt i wygląda na to, że pewne zdarzenie, o które spodziewano się Bootstrap Collapse, zostało zerwane po załadowaniu prototypu. Mam tylko nadzieję, że jest inna opcja niż konwersja prototypu. – Innerpeacer

+0

https://github.com/twitter/bootstrap/issues/5403 - Bootstrap-przejściowe konflikty z prototypem – Victor

1

To nie jest idealne, ale można zakodować akordeonie CSS3 i jQuery bypass cały chaos ... piły jeden tutaj: Accordion with CSS3

0

This article dał mi pewien wgląd w podstawowej problemu Bootstrap użyciu prototypu. Obejścia tam podane działają właściwie. Mam regulować pierwszy z nich lekko i dodano sprawdzanie czy Prototype jest faktycznie załadowane i połączono je w jQueryNoConflict() jako zamiennik dla standardowego jQuery.noConflict():

function jQueryNoConflict() 
{ 
    jQuery.noConflict(); 

    if (typeof Prototype !== "undefined" && Prototype.BrowserFeatures.ElementExtensions) 
    { 
     var disablePrototypeJS = function (method, pluginsToDisable) 
     { 
      var handler = function (event) 
      { 
       event.target[method] = undefined; 
       setTimeout(function() 
       { 
        delete event.target[method]; 
       }, 0); 
      }; 

      pluginsToDisable.each(function (plugin) 
      { 
       jQuery(window).on(method + '.bs.' + plugin, handler); 
      }); 
     }, 

     pluginsToDisable = ['collapse', 'dropdown', 'modal', 'tooltip', 'popover', 'tab']; 
     disablePrototypeJS('show', pluginsToDisable); 
     disablePrototypeJS('hide', pluginsToDisable); 
    } 
} 
0

Jeśli używasz bootstrap.js wymienić:

this.$element.trigger(startEvent); 

z:

this.$element.triggerHandler(startEvent); 

będzie działać płynnie