[英]Close Bootstrap Dropdown after link click
我在下面有一个引导程序下拉菜单。 它有一个链接到一个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>
敲除.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;
});
}
};
给你的链接一个类(例如下载):
<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");
});
这实际上可以与您现有的引导标记一起使用,而无需添加任何新类或 ID。 希望这对其他人有所帮助,只是希望在不更改任何现有内容的情况下放入解决方案。
$(".dropdown-menu a").click(function() {
$(this).closest(".dropdown-menu").prev().dropdown("toggle");
});
这可以通过引导程序自己的 CSS 类dropdown-toggle
来实现
只需将该类添加到您的链接元素中,如下所示: <a class='dropdown-toggle'></a>
它将切换下拉列表。
我认为这将关闭页面上的所有下拉菜单和扩展导航菜单:
$('.in,.open').removeClass('in open');
不幸的是,我没有按照上面的建议使用.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"
和data-target=".navbar-collapse"
到每个下拉导航链接。
没有额外的 css 或 js,它就像一个魅力:)
使用event.preventDefault()
而不是return false
可以解决问题。
将您的代码更改为:
$(element).unbind('click').bind('click', function(e) {
e.preventDefault();
// ...
return true; // or just remove the return clause
});
只需将href="#"
更改为href="javscript:void(0);"
然后在您的点击事件中return true
(而不是false
)。
如果您有事件参数,请执行以下操作:
$(element).unbind('click').bind('click', function (event)
{
event.preventDefault();
return true;
});
一个更干净的解决方案,保留下拉功能并获得您正在寻找的内容。
$("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");
});
最好的答案是执行点击,因此它的行为与用户点击鼠标以隐藏下拉菜单相同,为此将这个 snap 代码添加到您的页面:
<script>
$(document).ready(function () {
$("li.dropdown ul.dropdown-menu li").click(function (event) {
event.toElement.parentElement.click();
})
})
</script>
您还可以添加透明蒙版以在下拉菜单打开时阻止任何其他不需要的点击:
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;
}
单击菜单时,导航将关闭,这是使用 jquery onclick="$('#mobile-menu').removeClass('mm-menu_opened');" 的简单方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.