点击下拉内容,下拉隐藏
clicking on dropdown content, dropdown getting hide
HTML 下拉菜单代码:
<ul>
<li class="dropDownLink">
Locality
<ul class="dropDown">
<li class="dropDown-row"><input tpye="text"></li>
</ul>
</li>
<li class="dropDownLink">
Locality
<ul class="dropDown">
<li class="dropDown-row"><input tpye="checkbox"> Option 1</li>
<li class="dropDown-row"><input tpye="checkbox"> Option 2</li>
<li class="dropDown-row"><input tpye="checkbox"> Option 3</li>
</ul>
</li>
</ul>
jquery 显示下拉菜单的代码:
$('.dropDownLink').on('click', function () {
$('.dropDown').hide();
$(this).children($('.dropDown')).show();
});
jQuery 在点击外部下拉菜单时隐藏下拉菜单:
$(document).on('click', function (e) {
if(!$('.dropDownLink').is(e.target) && !$('.dropDown').is(e.target)) {
$('.dropDown').hide();
}
});
当点击文档而不是下拉菜单时,它工作正常,但点击下拉菜单中的内容时,它隐藏了它的父下拉菜单。下拉列表中也有一些表单内容,例如输入文本字段、复选框和链接。下拉菜单不应隐藏点击下拉菜单中的这些元素。
请帮我解决这个问题。提前致谢。
更新了确切的解决方案:超级具体 DOM 元素定位的建议仍然有效。 jsFiddle Example
var $dropShow = function showList() {
$('.dropDownLink').on('click', function () {
$('.dropDown').hide();
$(this).children($('.dropDown')).show();
});
};
var $navSelections = $('li.dropDown-row input, li.dropDown-row, ul.dropDown li.dropDown-row input, li.dropDownLink, ul li.dropDownLink');
var $bodyClick = function hideAll() {
$(this).on('click', function (e) {
if (!$navSelections.is(e.target)) {
$('.dropDown').slideUp(150);
}
});
};
$('.dropDownLink').not($navSelections).click($dropShow());
$('*').not($navSelections).click($bodyClick());
确定您希望仅在其上发生操作的路径。如果它只应该发生,例如在 div 上,则使用 $('div.dropDownLink')
。如果它只是链接,比如您希望应用此功能的 navMenu,那么您可以使用 $('navMenu div.dropDownLink')
。从本质上讲,您的选择器越准确,结果就越好。
但是,如果您想采用不太准确的方法,可以使用 .not()
方法省略非常具体的内容。
var $parentOfDropDown = $('div#navMenu');
$('.dropDown').not($parentOfDropDown).hide();
HTML 下拉菜单代码:
<ul>
<li class="dropDownLink">
Locality
<ul class="dropDown">
<li class="dropDown-row"><input tpye="text"></li>
</ul>
</li>
<li class="dropDownLink">
Locality
<ul class="dropDown">
<li class="dropDown-row"><input tpye="checkbox"> Option 1</li>
<li class="dropDown-row"><input tpye="checkbox"> Option 2</li>
<li class="dropDown-row"><input tpye="checkbox"> Option 3</li>
</ul>
</li>
</ul>
jquery 显示下拉菜单的代码:
$('.dropDownLink').on('click', function () {
$('.dropDown').hide();
$(this).children($('.dropDown')).show();
});
jQuery 在点击外部下拉菜单时隐藏下拉菜单:
$(document).on('click', function (e) {
if(!$('.dropDownLink').is(e.target) && !$('.dropDown').is(e.target)) {
$('.dropDown').hide();
}
});
当点击文档而不是下拉菜单时,它工作正常,但点击下拉菜单中的内容时,它隐藏了它的父下拉菜单。下拉列表中也有一些表单内容,例如输入文本字段、复选框和链接。下拉菜单不应隐藏点击下拉菜单中的这些元素。
请帮我解决这个问题。提前致谢。
更新了确切的解决方案:超级具体 DOM 元素定位的建议仍然有效。 jsFiddle Example
var $dropShow = function showList() {
$('.dropDownLink').on('click', function () {
$('.dropDown').hide();
$(this).children($('.dropDown')).show();
});
};
var $navSelections = $('li.dropDown-row input, li.dropDown-row, ul.dropDown li.dropDown-row input, li.dropDownLink, ul li.dropDownLink');
var $bodyClick = function hideAll() {
$(this).on('click', function (e) {
if (!$navSelections.is(e.target)) {
$('.dropDown').slideUp(150);
}
});
};
$('.dropDownLink').not($navSelections).click($dropShow());
$('*').not($navSelections).click($bodyClick());
确定您希望仅在其上发生操作的路径。如果它只应该发生,例如在 div 上,则使用 $('div.dropDownLink')
。如果它只是链接,比如您希望应用此功能的 navMenu,那么您可以使用 $('navMenu div.dropDownLink')
。从本质上讲,您的选择器越准确,结果就越好。
但是,如果您想采用不太准确的方法,可以使用 .not()
方法省略非常具体的内容。
var $parentOfDropDown = $('div#navMenu');
$('.dropDown').not($parentOfDropDown).hide();