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
それを試しましたが、イベントは発生しませんでした。ボタンをクリックするイベントはキャッチできますが。他に何が邪魔になるのでしょうか?
レンチ2013

1
@RonnieKilsboわからない。このソリューションは述べたように機能し、私はそれを数え切れないほど使用しました。アンカーのIDを正しく設定していないか、要素が存在する前にバインドしている可能性があります。この場合jQueryをオンにすることを強くお勧めします。
トーマスジョーンズ

1
あなたは正しい、私の悪い。クリック可能なものをjQueryでバインドした後、DOMに要素を挿入しましたが、これは悪いことです。:)動作中、確認済み。
レンチ2013

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は常に画面上で物事を行うことであり、カスタム機能を提供することではありません。開発者は独自のドロップダウンイベントをフックできると想定されています。
トーマスジョーンズ

8

これは、アンカーのカスタム関数を実装する方法の実用的な例です。

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

アンカーにIDを添付できます。

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

次に、jQueryのクリックイベントリスナーを使用して、クリックアクションをリッスンし、関数を起動します。

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

上記の例は、jsfiddleにはもう存在しないようです。
Ethereal 2013年

有効なリンクを含む新しい例を追加しました。@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"));
});

したがって、ドロップダウンで動的にリストアイテムを生成し、アイテムのテキスト値だけではないデータを使用する必要がある場合は、ドロップダウンリストアイテムを作成するときにデータ属性を使用して、クラスを持つ各アイテムに各アイテムのIDを参照してクリックイベントを生成するのではなく、イベント。


3

KnockoutJS統合を探している人は誰でも。

次のHTML(標準のブートストラップドロップダウンボタン)があるとします。

<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をofを持つように設定すると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>

ハ!よろしくお願いします!:)私はあなたの2番目の例を使用しました。
drzounds 2018

これが答えだったはずです!
ジェイク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.