50

我在下面有一个引导下拉菜单。它有一个链接到一个 knockout.js 绑定,它返回 false 因为我不希望将 # 标记发送到浏览器 URL。但是,当我单击链接时,这样做不会关闭下拉菜单。有什么办法吗?

HTML

<div class="btn-group">
    <button class="btn dropdown-toggle" data-toggle="dropdown" data-bind="enable: !noResults()"><i class="icon-download-alt" ></i> Export <span class="icon-caret-down"></span></button>

    <ul class="dropdown-menu">
        @foreach(var exportUrl in Model.ExportUrls)
        {
            <li>
                <a href="#" data-bind="disable: noResults(), download: { url: '@exportUrl.Value', data: data }"><img src="/Content/less/images/img/@(exportUrl.Key.ToString().ToLower()).png" alt="@exportUrl.Key.GetDisplayName()"/> @exportUrl.Key.GetDisplayName()</a>
            </li>
        }
    </ul>
</div>

knockut.js 绑定

ko.bindingHandlers.download = {
    init: function (element, valueAccessor) {

        var value = ko.utils.unwrapObservable(valueAccessor()),
            id = 'download-iframe-container',
            iframe;

        $(element).unbind('click').bind('click', function () {

            iframe = document.getElementById(id);

            if (!iframe) {
                iframe = document.createElement("iframe");
                iframe.id = id;
                iframe.style.display = "none";
            }

            if (value.data) {
                iframe.src = value.url + (value.url.indexOf('?') > 0 ? '&' : '?') + $.param(ko.mapping.toJS(value.data));
            } else {
                iframe.src = value.url;
            }

            document.body.appendChild(iframe);

            return false;
        });
    }
};
4

12 回答 12

58

给你的链接一个类(例如下载):

<a href="#" class="download" data-bind="disable: noResults()....

和你的下拉一个 id(例如 dlDropDown):

<button class="btn dropdown-toggle" id="dlDropDown" data-toggle="dropdown" data-bind="enable: !noResults()">

然后添加以下事件处理程序:

$("a.download").click(function() {
   $("#dlDropDown").dropdown("toggle");
});
于 2013-09-17T17:47:23.587 回答
40

这实际上将与您现有的引导标记一起使用,而无需添加任何新的类或 ID。希望这对其他只想在不更改任何现有内容的情况下放入解决方案的人有所帮助。

$(".dropdown-menu a").click(function() {
    $(this).closest(".dropdown-menu").prev().dropdown("toggle");
});
于 2014-04-16T01:56:31.107 回答
20

这可以通过引导程序自己的 CSS 类来实现dropdown-toggle

只需像这样将该类添加到您的链接元素中:<a class='dropdown-toggle'></a>它会切换下拉菜单。

于 2015-08-12T17:53:12.337 回答
12

我认为这将关闭页面上的所有下拉菜单和扩展的导航菜单:

$('.in,.open').removeClass('in open');
于 2014-03-25T11:16:31.833 回答
9

不幸的是,我没有.dropdown('toggle')按照上面的建议成功使用...

然而,起作用的是将引导程序的下拉按钮数据属性应用于它自己的下拉链接:

<button type="button" data-toggle="collapse" data-target=".navbar-collapse" class="navbar-toggle navbar-btn">

...

<ul class="nav navbar-nav">
  <li><a href="#about" class="scroll-to" data-toggle="collapse" data-target=".navbar-collapse">About</a></li>

我所做的只是将data-toggle="collapse"and添加data-target=".navbar-collapse"到每个下拉导航链接。

没有额外的css或js,它就像一个魅力:)

于 2017-03-15T17:54:48.493 回答
5

使用event.preventDefault()而不是return false解决问题。

将您的代码更改为:

$(element).unbind('click').bind('click', function(e) {
  e.preventDefault();

  // ...

  return true; // or just remove the return clause
});
于 2015-01-26T18:51:26.727 回答
4

只需将 to 更改href="#"href="javscript:void(0);"然后return true在您的点击事件中(而不是false)。

于 2014-08-28T17:35:37.497 回答
1

一个更清洁的解决方案,以保留下拉功能并获得您正在寻找的内容。

$("body").on('click', function (e) {
     if (!$(e.target).hasClass("open") && $(e.target).parents(".btn-group.open").length == 0)
         $(this).find(".btn-group.open a").trigger("click");
});
于 2017-07-27T21:59:50.557 回答
1

如果您有一个事件参数,只需执行以下操作:

$(element).unbind('click').bind('click', function (event)
{
    event.preventDefault();
    return true;
});
于 2016-04-11T06:57:16.887 回答
0

最好的答案是执行单击,因此它的行为与用户单击鼠标以隐藏下拉菜单的行为相同,为此,请将此快照代码添加到您的页面:

<script>
    $(document).ready(function () {
        $("li.dropdown ul.dropdown-menu li").click(function (event) {
            event.toElement.parentElement.click();
        })
    })
</script>
于 2014-09-24T02:49:47.900 回答
0

单击菜单时,导航将关闭这是使用 jquery onclick="$('#mobile-menu').removeClass('mm-menu_opened');" 的简单方法

于 2020-01-28T11:19:32.093 回答
0

当下拉菜单打开时,您还可以添加透明蒙版以阻止任何其他不需要的点击:

   OnDomReadyHeaderItem.forScript("$('.dropdown').on('shown.bs.dropdown', function (e) { $(this).append('<span id=\"transparent-mask\"></span>')})"));

   OnDomReadyHeaderItem.forScript("$('.dropdown').on('hidden.bs.dropdown', function (e) { $('#transparent-mask').remove()})"));

带着面具:

.dropdown.open #transparent-mask{
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    display: block;
    margin: auto;
    height: initial;
    z-index: 1000 !important;
}
于 2018-01-21T17:17:15.950 回答