Trình xử lý sự kiện cho trình đơn thả xuống Twitter Bootstrap?


86

Tôi muốn sử dụng nút thả xuống 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 -->

Khi người dùng thay đổi giá trị của nút thành 'Một hành động khác', thay vì chỉ điều hướng đến #, tôi thực sự muốn xử lý hành động theo cách tùy chỉnh.

Nhưng tôi không thể thấy bất kỳ trình xử lý sự kiện nào trong plugin thả xuống để thực hiện việc này.

Có thực sự có thể sử dụng các nút thả xuống của Bootstrap để xử lý các hành động của người dùng không? Tôi bắt đầu tự hỏi liệu chúng có chỉ nhằm mục đích điều hướng hay không - thật khó hiểu khi ví dụ đưa ra danh sách các hành động.


1
Một chức năng được kích hoạt khi nhấp vào thẻ liên kết sẽ không hoạt động?
Cameron Chapman,

Đầu tiên của chúng không phải là bất kỳ nút nào mà chúng là neo. Bạn có thể xem các trình xử lý sự kiện bằng cách kiểm tra tệp bootstrap.js. Nhưng theo như tôi biết thì tất cả các hành động này đều được xử lý bằng jQuery nên không có vấn đề gì lớn khi chỉnh sửa hoặc ghi đè chức năng này.
mas-

Câu trả lời:


78

Twitter bootstrap có nghĩa là cung cấp một chức năng cơ bản và chỉ cung cấp các plugin javascript cơ bản để thực hiện điều gì đó trên màn hình . Bất kỳ nội dung hoặc chức năng bổ sung nào, bạn sẽ phải tự thực hiện.

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

và sau đó với jQuery

jQuery("#action-1").click(function(e){
//do something
e.preventDefault();
});

1
Tuy nhiên, đã cố gắng điều đó, không có sự kiện nào xảy ra. Mặc dù vậy, tôi có thể nắm bắt được sự kiện khi nhấp vào một nút. Điều gì khác có thể cản trở?
Cờ lê

1
@RonnieKilsbo không chắc chắn. Giải pháp này không hoạt động như đã nêu và tôi đã sử dụng nó vô số lần. Bạn có thể không đặt chính xác id của anchor của mình hoặc bạn có thể bị ràng buộc trước khi các phần tử tồn tại - tôi thực sự khuyên bạn nên sử dụng jQuery's on trong trường hợp này.
Thomas Jones,

1
Bạn đúng, tôi xấu. Tôi đã chèn các phần tử vào DOM sau khi tôi liên kết các clickable với jQuery, đó là một điều tồi tệ. :) Làm việc, xác nhận.
Cờ lê

18

Thử đi:

$('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

Trong Bootstrap 3 'dropdown.js' cung cấp cho chúng ta các sự kiện khác nhau được kích hoạt.

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

Vân vân


Điều đó đúng, nhưng bạn vẫn không làm việc trong khuôn khổ bootstrap để đính kèm các trình xử lý sự kiện. Bạn làm điều đó một mình. Bootstrap luôn làm mọi thứ trên màn hình, không cung cấp chức năng tùy chỉnh. Giả định rằng nhà phát triển sẽ có thể kết nối các sự kiện thả xuống của riêng họ.
Thomas Jones,

8

Đây là một ví dụ hoạt động về cách bạn có thể triển khai các chức năng tùy chỉnh cho các neo của mình.

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

Bạn có thể đính kèm một id vào mỏ neo của mình:

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

Và sau đó sử dụng trình nghe sự kiện nhấp chuột của jQuery để lắng nghe hành động nhấp chuột và kích hoạt chức năng của bạn:

$('#alertMe').click(function(e) {
    alert('alerted');
    e.preventDefault();// prevent the default anchor functionality
});

Ví dụ trên dường như không còn tồn tại trên jsfiddle nữa.
Ethereal

Tôi đã thêm một ví dụ mới với một liên kết hợp lệ. Cảm ơn @ethereal.
Cameron Chapman

4

Tôi đã nhìn vào cái này. Khi điền các neo thả xuống, tôi đã cung cấp cho chúng một thuộc tính lớp và dữ liệu, vì vậy khi cần thực hiện một hành động, bạn có thể thực hiện:

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

và sau đó trong jQuery làm một cái gì đó như:

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

Vì vậy, nếu bạn đã tạo động các mục danh sách trong danh sách thả xuống và cần sử dụng dữ liệu không chỉ là giá trị văn bản của mục, bạn có thể sử dụng các thuộc tính dữ liệu khi tạo listitem thả xuống và sau đó chỉ cần cung cấp cho mỗi mục với lớp là sự kiện, thay vì đề cập đến id của từng mục và tạo sự kiện nhấp chuột.


3

Bất kỳ ai ở đây đang tìm kiếm tích hợp Knockout JS.

Cho HTML sau (nút thả xuống 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>

Sử dụng JS sau:

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

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

Đối với những người muốn tạo các tùy chọn thả xuống dựa trên mảng có thể quan sát được, mã sẽ giống như sau:

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

Lưu ý rằng mục mảng có thể quan sát được hoàn toàn được chuyển vào trình xử lý hàm nhấp để sử dụng trong mã mô hình chế độ xem.


3

Không cần phải thay đổi nhóm nút của bạn, bạn có thể làm như sau. Dưới đây, tôi giả định thả xuống bạn buttonidcủa 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>

Bây giờ, nếu bạn đặt .btn-groupchính mục này có giá idtrị của fldCategory, thì đó thực sự là jQuery hiệu quả hơn và chạy nhanh hơn một chút:

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

Ha! Cảm ơn thật tuyệt! :) Tôi đã sử dụng ví dụ thứ 2 của bạn.
drzounds

đây lẽ ra phải là câu trả lời!
Jake
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.