Programy obsługi zdarzeń dla list rozwijanych Twitter Bootstrap?

86

Chciałbym użyć przycisku rozwijanego Twitter Bootstrap :

    <div class="btn-group">
      <button class="btn dropdown-toggle" data-toggle="dropdown">Action <span class="caret"></span></button>
      <ul class="dropdown-menu">
        <li><a href="#">Action</a></li>
        <li><a href="#">Another action</a></li>
        <li><a href="#">Something else here</a></li>
      </ul>
    </div><!-- /btn-group -->

Gdy użytkownik zmienia wartość przycisku na „Inna akcja”, zamiast po prostu przechodzić do #, tak naprawdę chciałbym obsłużyć tę akcję w niestandardowy sposób.

Ale nie widzę żadnych programów obsługi zdarzeń we wtyczce rozwijanej, aby to zrobić.

Czy rzeczywiście można używać przycisków rozwijanych Bootstrap do obsługi działań użytkownika? Zaczynam się zastanawiać, czy są przeznaczone tylko do nawigacji - to mylące, że przykład podaje listę działań.

Richard
źródło
1
Czy funkcja uruchamiana po kliknięciu tagu kotwicy nie działałaby?
Cameron Chapman,
Pierwszy z nich to nie przyciski, to kotwice. Możesz przyjrzeć się programom obsługi zdarzeń, sprawdzając plik bootstrap.js. Ale o ile wiem, wszystkie te akcje są przetwarzane przez jQuery, więc edycja lub zastąpienie tej funkcji nie powinno być wielkim problemem.
projekty

Odpowiedzi:

78

Bootstrap Twittera ma na celu zapewnienie podstawowej funkcjonalności i zapewnia tylko podstawowe wtyczki javascript, które robią coś na ekranie . Wszelkie dodatkowe treści lub funkcje będziesz musiał zrobić sam.

<div class="btn-group">
  <button class="btn dropdown-toggle" data-toggle="dropdown">Action <span class="caret"></span></button>
  <ul class="dropdown-menu">
    <li><a href="#" id="action-1">Action</a></li>
    <li><a href="#" id="action-2">Another action</a></li>
    <li><a href="#" id="action-3">Something else here</a></li>
  </ul>
</div><!-- /btn-group -->

a potem z jQuery

jQuery("#action-1").click(function(e){
//do something
e.preventDefault();
});
Thomas Jones
źródło
1
Próbowałem tego jednak, ale żadne wydarzenie nie zostało odpalone. Potrafię jednak złapać kliknięcie przycisku. Co jeszcze może przeszkadzać?
Klucz,
1
@RonnieKilsbo nie jestem pewien. To rozwiązanie działa zgodnie z opisem i używałem go niezliczoną ilość razy. Możliwe, że nie ustawiasz poprawnie identyfikatora zakotwiczenia lub możesz wiązać się, zanim elementy zaistnieją - w tym przypadku bardzo polecam użycie jQuery .
Thomas Jones,
1
Masz rację, moja wina. Wstawiłem elementy do DOM po powiązaniu elementów klikalnych z jQuery, co jest złą rzeczą. :) Działa, potwierdzone.
Wrench,
18

Spróbuj tego:

$('div.btn-group ul.dropdown-menu li a').click(function (e) {
    var $div = $(this).parent().parent().parent(); 
    var $btn = $div.find('button');
    $btn.html($(this).text() + ' <span class="caret"></span>');
    $div.removeClass('open');
    e.preventDefault();
    return false;
});
Fernando
źródło
14

W Bootstrap 3 „dropdown.js” dostarcza nam różnych wyzwalanych zdarzeń.

click.bs.dropdown
show.bs.dropdown
shown.bs.dropdown

itp

Stevanicus
źródło
To prawda, ale nadal nie pracujesz w ramach bootstrap, aby dołączyć programy obsługi zdarzeń. Robisz to samodzielnie. Bootstrap zawsze robił rzeczy na ekranie, a nie zapewniał niestandardową funkcjonalność. Zakłada się, że deweloper będzie mógł podłączyć własne wydarzenia z listy rozwijanej.
Thomas Jones
8

Oto działający przykład, w jaki sposób można zaimplementować niestandardowe funkcje dla swoich kotwic.

http://jsfiddle.net/CH2NZ/43/

Możesz dołączyć identyfikator do swojej kotwicy:

<li><a id="alertMe" href="#">Action</a></li>

Następnie użyj detektora zdarzeń kliknięcia jQuery, aby nasłuchiwać akcji kliknięcia i uruchomić funkcję:

$('#alertMe').click(function(e) {
    alert('alerted');
    e.preventDefault();// prevent the default anchor functionality
});
Cameron Chapman
źródło
Wydaje się, że powyższy przykład nie istnieje już na jsfiddle.
Ethereal
Dodałem nowy przykład z ważnym linkiem. Dzięki @ethereal.
Cameron Chapman
4

Patrzyłem na to. Podczas wypełniania rozwijanych kotwic dałem im atrybuty klasy i danych, więc gdy trzeba wykonać akcję, możesz wykonać:

<li><a class="dropDownListItem" data-name="Fred Smith" href="#">Fred</a></li>

a potem w jQuery robiąc coś takiego:

$('.dropDownListItem').click(function(e) {
    var name = e.currentTarget;
    console.log(name.getAttribute("data-name"));
});

Jeśli więc masz dynamicznie generowane elementy listy w swoim menu i potrzebujesz danych, które nie są tylko wartością tekstową elementu, możesz użyć atrybutów danych podczas tworzenia elementu listy rozwijanej, a następnie nadać każdemu elementowi z klasą zdarzenie, zamiast odwoływać się do identyfikatorów każdego elementu i generować zdarzenie kliknięcia.

Andrew Berry
źródło
3

Każdy, kto szuka integracji Knockout JS.

Biorąc pod uwagę następujący kod HTML (przycisk rozwijany Standard Bootstrap):

<div class="dropdown">
    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
        Select an item               
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" role="menu">
        <li>
            <a href="javascript:;" data-bind="click: clickTest">Click 1</a>
        </li>
        <li>
            <a href="javascript:;" data-bind="click: clickTest">Click 2</a>
        </li>
        <li>
            <a href="javascript:;" data-bind="click: clickTest">Click 3</a>
        </li>
    </ul>
</div>

Użyj następującego JS:

var viewModel = function(){
    var self = this;

    self.clickTest = function(){
        alert("I've been clicked!");
    }  
};

Dla tych, którzy chcą wygenerować opcje rozwijane w oparciu o tablicę obserwowalną typu knockout, kod wyglądałby mniej więcej tak:

var viewModel = function(){
    var self = this;

    self.dropdownOptions = ko.observableArray([
        { id: 1, label: "Click 1" },
        { id: 2, label: "Click 2" },
        { id: 3, label: "Click 3" }
    ])

    self.clickTest = function(item){
        alert("Item with id:" + item.id + " was clicked!");
    }  
};

<!-- REST OF DD CODE -->
<ul class="dropdown-menu" role="menu">
    <!-- ko foreach: { data: dropdownOptions, as: 'option' } -->
    <li>
        <a href="javascript:;" data-bind="click: $parent.clickTest, text: option.clickTest"></a>
    </li>
    <!-- /ko -->
</ul>
<!-- REST OF DD CODE -->

Należy zauważyć, że obserwowalny element tablicy jest niejawnie przekazywany do programu obsługi funkcji kliknięcia w celu użycia w kodzie modelu widoku.

pim
źródło
3

Bez konieczności zmiany grupy przycisków w ogóle możesz wykonać następujące czynności. Poniżej zakładam, że Twoje menu buttonma wartość idof fldCategory.

<script type="text/javascript">

$(document).ready(function(){

  $('#fldCategory').parent().find('UL LI A').click(function (e) {
    var sVal = e.currentTarget.text;
    $('#fldCategory').html(sVal + ' <span class="caret"></span>');
    console.log(sVal);
  });

});

</script>

Teraz, jeśli ustawisz sam .btn-groupten element na idof fldCategory, to w rzeczywistości jest to bardziej wydajne jQuery i działa trochę szybciej:

<script type="text/javascript">

$(document).ready(function(){

  $('#fldCategory UL LI A').click(function (e) {
    var sVal = e.currentTarget.text;
    $('#fldCategory BUTTON').html(sVal + ' <span class="caret"></span>');
    console.log(sVal);
  });

});

</script>
Volomike
źródło
Ha! Dzięki, to sprytne! :) Użyłem twojego drugiego przykładu.
drzounds
to powinna być odpowiedź!
Jake