Ich habe unten ein Bootstrap-Dropdown-Menü. Es enthält einen Link zu einer knockout.js-Bindung, die false zurückgibt, da das # -Tag nicht an die Browser-URL gesendet werden soll. Wenn Sie auf den Link klicken, wird das Dropdown-Menü jedoch nicht geschlossen. Sowieso um das herum?
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 Bindung
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;
});
}
};
Geben Sie Ihren Links eine Klasse (z. B. Download):
<a href="#" class="download" data-bind="disable: noResults()....
Und Ihr Dropdown eine ID (z. B. dlDropDown):
<button class="btn dropdown-toggle" id="dlDropDown" data-toggle="dropdown" data-bind="enable: !noResults()">
Fügen Sie dann den folgenden Ereignishandler hinzu:
$("a.download").click(function() {
$("#dlDropDown").dropdown("toggle");
});
Dies funktioniert tatsächlich mit Ihrem vorhandenen Bootstrap-Markup, ohne dass Sie neue Klassen oder IDs hinzufügen müssen. Ich hoffe, dies ist hilfreich für jemanden, der eine Lösung reinlegen möchte, ohne etwas zu ändern.
$(".dropdown-menu a").click(function() {
$(this).closest(".dropdown-menu").prev().dropdown("toggle");
});
Dies kann mit der eigenen CSS-Klasse von bootstraps erreicht werden dropdown-toggle
Fügen Sie diese Klasse einfach wie folgt zu Ihren Link-Elementen hinzu: <a class='dropdown-toggle'></a>
und das Dropdown-Menü wird umgeschaltet.
Ich denke, das schließt alle Dropdowns und erweiterten Navigationsmenüs auf der Seite:
$('.in,.open').removeClass('in open');
Die Verwendung von event.preventDefault()
anstelle von return false
bewirkt den Trick.
Ändern Sie Ihren Code in:
$(element).unbind('click').bind('click', function(e) {
e.preventDefault();
// ...
return true; // or just remove the return clause
});
Ich hatte leider keinen Erfolg mit .dropdown('toggle')
wie oben vorgeschlagen ...
Was jedoch funktionierte, war das Anwenden der Dropdown-Button-Datenattribute von Bootstrap auf seine eigenen Dropdown-Links:
<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>
Alles, was ich tat, war, data-toggle="collapse"
und data-target=".navbar-collapse"
zu jedem Dropdown-Navigationslink hinzuzufügen.
Keine zusätzlichen Css oder Js und es hat wie ein Zauber funktioniert :)
Ändern Sie einfach href="#"
in href="javscript:void(0);"
und dann return true
in Ihrem Click-Ereignis (anstelle von false
).
Eine saubere Lösung, um die Dropdown-Funktionalität beizubehalten und zu bekommen, wonach Sie suchen.
$("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");
});
Wenn Sie einen Ereignisparameter haben, tun Sie einfach:
$(element).unbind('click').bind('click', function (event)
{
event.preventDefault();
return true;
});
sie können auch eine transparente Maske hinzufügen, um andere unerwünschte Klicks zu blockieren, wenn das Dropdown-Menü geöffnet ist:
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()})"));
mit der Maske:
.dropdown.open #transparent-mask{
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: block;
margin: auto;
height: initial;
z-index: 1000 !important;
}
die beste Antwort wird darin bestehen, einen Klick auszuführen, so dass der Mausklick genauso ausgeführt wird wie der Benutzer, um das Dropdown-Menü auszublenden.
<script>
$(document).ready(function () {
$("li.dropdown ul.dropdown-menu li").click(function (event) {
event.toElement.parentElement.click();
})
})
</script>