0

サイトのajaxnavigationを設定するときに、jQueryセレクターで問題が発生しました。このサイトはTwitterのブートストラップに基づいており、フレームワークが提供するナビゲーションバーとドロップダウンを使用しています。

ハッシュチェンジイベントを使用してsection#main、リンクclass="ajaLink"がクリックされたときに新しいコンテンツをロードします。

イベントがTwitterのブートストラップドロップダウンメニューのリンクにバインドされていないようだったので、行き詰まりました。ドロップダウンについてJSを調査しましたが、イベントがバインドおよびトリガーされるのを妨げるものは何も見つかりませんでした。

欲求不満で私はセレクターをから変更しました

$(document).on('click', '.ajaxLink', function (e) {
    ...
}

$('.ajaxLink').on('click', function (e) {
    ...
}

これにより、イベントはナビゲーションバーとドロップダウンのすべてのリンクにバインドされますが、動的に読み込まれるコンテンツにはリンクが残ります。

2つのセレクターの違いと、なぜこの動作が発生するのか理解できません。これまでの私の解決策は両方のセレクターを使用することですが、イベントが同じ要素に2回バインドされないことを確認できない限り、これは解決策としては感じられません。

では、使用されている2つのセレクターの違いは何ですか?.ajaLink各要素を1回だけバインドするようにセレクターを書き直すにはどうすればよいですか?

HTML ...

<!DOCTYPE html>
<html>
<head>


</head>
<body>
    <div class="container">
        <header>
            <div class="navbar navbar-inverse">
                <div class="navbar-inner">
                    <div class="container">
                        <!-- Minimizing the menu under a button when screen gets too small. -->
                        <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                            ...

                        </a>

                    <div class="nav-collapse">
                    <ul class="nav">
                        <!-- Choose application. -->
                        <li class="dropdown">
                            <a class="dropdown-toggle" href="#" data-toggle="dropdown"> Menu 1 <b class="caret"></b></a>
                            <ul class="dropdown-menu">
                                <li class=""><a class="ajaxLink" href="/Blabla">Blabla</a></li>
                                <li class=""><a class="ajaxLink" href="/Yadayada">Yadayada</a></li>
                                ...
                            </ul>
                        </li>
                        <!-- Choose application. -->
                        <li class="dropdown">
                            <a class="dropdown-toggle" href="#" data-toggle="dropdown"> Menu 2 <b class="caret"></b></a>
                            <ul class="dropdown-menu">
                                <li class=""><a class="ajaxLink" href="/Blabla2">Blabla 2</a></li>
                                <li class=""><a class="ajaxLink" href="/Yadayada2">Yadayada 2</a></li>
                                ...
                            </ul>
                        </li>
                    </ul>
                    <form class="navbar-search pull-right" action="/Home/Search" method="post" >
                        <input type="search" class="search-query" placeholder="Sök" />
                        <button type="submit" class="btn btn-inverse" id="search-button ">Search</button>
                    </form>


                  </div><!--/.nav-collapse -->
                </div>
              </div>
            </div>
        </header>
        <div class="log label label-important" style="display:none;" ></div>
    <section id="main" style="opacity: 1; ">

    <div class="row-fluid">   
    <div class="span2">

    </div> 
    <div class="span10">
        <span class="gradientlabel"><a href="#">Artiklar</a></span> 

        <table class="table table-striped table-bordered table-condensed overview-table">
            <tbody><tr>
                <th>
                    Art No.
                </th>
                <th>
                    Description
                </th>
                <th>
                    Price
                </th>
                <th></th>
            </tr>

            <tr>
                <td>
                    16791
                </td>
                <td style="overflow:hidden;white-space: nowrap;">
                    175/70-13 82Q Semperit Ice Grip 2 Dubbat
                </td>
                <td>
                    300
                </td>
                <td>
                    <a class="ajaxLink" href="/Artiklar/Edit/16791">Edit</a> 
                </td>
            </tr>
            <tr>
                <td>
                    16792
                </td>
                <td style="overflow:hidden;white-space: nowrap;">
                    195/55-15 85Q Uniroyal Nordic Dubbat
                </td>
                <td>
                    550
                </td>
                <td>
                    <a class="ajaxLink" href="/Artiklar/Edit/16792">Edit</a> 
                </td>
            </tr>
            ...
        </tbody></table>
    </div>
    </div>
    </section>
        <footer>
        </footer>
    </div>

</body>
</html>

Javascript

//Add event for all ajaxLink (except for the ones in the bootstrap dropdown)
$(document).on('click', '.ajaxLink', function (e) {
    var self = $(this);
    if (self.attr('href').length > 2) {
        window.location.hash = "!" + self.attr('href');
    }
    return false;
});

//I dont really know yet, but this is the only way to attach the event to bootstraps dropdown, and also have to close the dropdown programmatically.
$('.ajaxLink').on('click', function (e) {
    var self = $(this);
    //if (self.prop('tagName') != 'A') { alert('not a link'); self = self.find('a:first'); }
    if (self.attr('href').length > 2) {
        window.location.hash = "!" + self.attr('href');
    }
    self.closest('.dropdown').removeClass('open');

    return false;
});
4

2 に答える 2

3

違いは、既存の要素$('.ajaxLink').on('click', function (e) { ... } のみをバインドすることです。

$(document).on('click', '.ajaxLink', function (e) { ... }デリゲートがあり.ajaxLink、将来動的に作成される要素もバインドします。


デリゲートが必要な場合は、実際には、よりも子要素に近いdocumentを使用する必要があります。その理由は、DOMツリーで不要な検索を保存し、パフォーマンスを向上させるためです。

于 2012-08-26T10:08:16.137 に答える
2

JQuery docsから読んだことから、現在一致している$('.ajaxLink')すべての DOM 要素の配列を返し、on('click')その配列内の各項目に 1 回バインドさ$(document).on(’click')れるようですが、ドキュメントの子孫がクリックされるたびに呼び出されます。メソッドで渡された filert と一致する場合にのみ実行され.on()ます。

それを念頭に置いて、次のことを試すこともできます。

$(".dropdown-menu").on("click", ".ajaxLink", function(e) { ... });
于 2012-08-26T10:22:49.333 に答える