Обработчики событий для выпадающих списков Twitter Bootstrap?

86

Я хочу использовать раскрывающуюся кнопку 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 -->

Когда пользователь меняет значение кнопки на «Другое действие», вместо того, чтобы просто переходить к нему #, я действительно хотел бы обработать действие индивидуальным образом.

Но я не вижу никаких обработчиков событий в раскрывающемся плагине для этого.

Можно ли использовать раскрывающиеся кнопки Bootstrap для обработки действий пользователя? Я начинаю задаваться вопросом, предназначены ли они только для навигации - сбивает с толку то, что в примере приводится список действий.

Ричард
источник
1
Разве не сработает функция, которая запускается по щелчку тега привязки?
Кэмерон Чепмен,
Во-первых, это не кнопки, это якоря. Вы можете взглянуть на обработчики событий, проверив файл bootstrap.js. Но, насколько мне известно, все эти действия обрабатываются с помощью jQuery, поэтому не должно быть особого труда отредактировать или переопределить эту функцию.
mas-designs

Ответы:

78

Загрузочная программа Twitter предназначена для обеспечения базовой функциональности и предоставляет только базовые плагины javascript, которые что-то делают на экране . Любой дополнительный контент или функциональность вам придется делать самостоятельно.

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

а затем с помощью jQuery

jQuery("#action-1").click(function(e){
//do something
e.preventDefault();
});
Томас Джонс
источник
1
Пробовал это, однако, не запускал событие. Хотя я могу поймать событие нажатия кнопки. Что еще может быть на пути?
Wrench
1
@RonnieKilsbo не уверен. Это решение действительно работает, как указано, и я использовал его бесчисленное количество раз. Возможно, вы неправильно устанавливаете идентификатор привязки или выполняете привязку до того, как элементы существуют - в этом случае я настоятельно рекомендую использовать jQuery .
Thomas Jones
1
Вы правы, моя беда. Я вставлял элементы в DOM после того, как привязал интерактивные элементы к jQuery, что плохо. :) Работает, подтвердил.
Wrench
18

Попробуй это:

$('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;
});
Фернандо
источник
14

В Bootstrap 3 dropdown.js предоставляет нам различные запускаемые события.

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

так далее

Стеваникус
источник
Это правда, но вы по-прежнему не работаете в рамках начальной загрузки для присоединения обработчиков событий. Вы делаете это самостоятельно. Bootstrap всегда делал что-то на экране, а не предоставлял настраиваемые функции. Предполагается, что разработчик сможет подключать свои собственные выпадающие события.
Thomas Jones
8

Вот рабочий пример того, как вы можете реализовать пользовательские функции для своих якорей.

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

Вы можете прикрепить идентификатор к своей привязке:

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

А затем используйте прослушиватель событий щелчка jQuery, чтобы прослушать действие щелчка и запустить вашу функцию:

$('#alertMe').click(function(e) {
    alert('alerted');
    e.preventDefault();// prevent the default anchor functionality
});
Кэмерон Чепмен
источник
Приведенный выше пример, похоже, больше не существует на jsfiddle.
Ethereal
Я добавил новый пример с действующей ссылкой. Спасибо @ethereal.
Кэмерон Чепмен
4

Я смотрел на это. При заполнении выпадающих якорей я дал им атрибуты класса и данных, поэтому, когда вам нужно выполнить действие, вы можете сделать:

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

а затем в jQuery сделать что-то вроде:

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

Поэтому, если у вас есть динамически сгенерированные элементы списка в раскрывающемся списке и вам нужно использовать данные, которые не просто текстовое значение элемента, вы можете использовать атрибуты данных при создании элемента раскрывающегося списка, а затем просто дать каждому элементу с классом событие, вместо того, чтобы ссылаться на идентификаторы каждого элемента и генерировать событие щелчка.

Эндрю Берри
источник
3

Всем, кто ищет интеграцию с Knockout JS.

Учитывая следующий HTML-код (раскрывающаяся кнопка 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>

Используйте следующий JS:

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

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

Для тех, кто хочет создать параметры раскрывающегося списка на основе наблюдаемого массива нокаутов, код будет выглядеть примерно так:

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

Обратите внимание, что наблюдаемый элемент массива неявно передается в обработчик функции щелчка для использования в коде модели представления.

сутенер
источник
3

Не изменяя группу кнопок вообще, вы можете сделать следующее. Ниже я предполагаю, что в вашем раскрывающемся списке buttonесть idиз 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>

Теперь, если вы установите для .btn-groupсамого этого элемента значение idof fldCategory, это на самом деле более эффективный jQuery и работает немного быстрее:

<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
источник
Ха! Спасибо, это круто! :) Я использовал твой 2-й пример.
drzounds 03
это должен был быть ответ!
Джейк