2017-06-21 95 views
1

我正在用jQuery,HTML和CSS创建一个下拉菜单。我想在用户点击下拉菜单之外时关闭下拉菜单。但它不能正常工作。jquery dropdown不能正常工作

JS

function _drpdntest() { 
$(".drpdn-click").click(function(){ 
var _drpdn_container = $(this).attr("data-drpdn-click"); 
var _drpdn_content = $('[data-drpdn-content="'+_drpdn_container+'"]'); 
_drpdn_content.toggleClass("drpdn-show"); 
_drpdn_content.siblings().removeClass("drpdn-show"); 
$(document).click(function(event){ 
_drpdn_content.removeClass("drpdn-show"); 
}); 
$(this, _drpdn_content).click(function(event){ 
event.stopPropagation(); 
}); 
}); 
} 
// Run Component Function 
$(document).ready(function(){ 
_drpdntest(); 
}); 

HTML

<button class="drpdn-click" data-drpdn-click="main">CLICK</button> 
<div class="drpdn-content drpdn-body" data-drpdn-content="main"> 
Main 
</div> 

CSS

.drpdn-content { 
z-index: 1000; 
position: absolute; 
display:none; 
overflow: hidden; 
} 
.drpdn-content.drpdn-show { 
display: block; 
} 
+1

当我运行你的代码,并单击外面再次隐藏。所以似乎工作得很好 –

+1

它不显示当我第一次点击。而且我不想隐藏用户点击下拉菜单时的情况。 –

回答

1

这是因为你还没有为按钮,点击添加stopPropagation()。由于它在按钮上单击它触发文档点击。

另外$(this, _drpdn_content)应该是$(_drpdn_content, this)或干脆删除这个,而添加stopPropagation

这里第二个参数提供了执行选择器搜索的上下文,简言之,第二个参数是parent,并且您正在说要搜索与第一个参数中提供的选择器匹配的所有childs

function _drpdntest() { 
 
    $(".drpdn-click").click(function(e) { 
 

 
    var _drpdn_container = $(this).attr("data-drpdn-click"); 
 
    var _drpdn_content = $('[data-drpdn-content="' + _drpdn_container + '"]'); 
 

 
    _drpdn_content.siblings().removeClass("drpdn-show"); 
 
    _drpdn_content.addClass("drpdn-show"); 
 
    $(_drpdn_content).click(function(event) { 
 
     event.stopPropagation(); 
 
    }); 
 
    $(document).click(function() { 
 
     _drpdn_content.removeClass("drpdn-show"); 
 
    }); 
 
    e.stopPropagation(); 
 
    }); 
 
} 
 
// Run Component Function 
 
$(document).ready(function() { 
 
    _drpdntest(); 
 
});
.drpdn-content { 
 
    z-index: 1000; 
 
    position: absolute; 
 
    display: none; 
 
    overflow: hidden; 
 
} 
 

 
.drpdn-content.drpdn-show { 
 
    display: block; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<button class="drpdn-click" data-drpdn-click="main">CLICK</button> 
 
<div class="drpdn-content drpdn-body" data-drpdn-content="main"> 
 
    Main 
 
</div>

+0

下拉框隐藏起来。对不起,没有工作 –

+0

检查更新的答案! –

+0

谢谢你,你解决了我最大的问题。 –

0

这应该是你想要什么,根据你

现在在注释中说节目在第一次点击时,一个d当您点击该选项时,它不会隐藏。

function _drpdntest() { 
 
    $(".drpdn-click").click(function() { 
 
    var $this = $(this) 
 
    var _drpdn_container = $(this).attr("data-drpdn-click"); 
 
    var _drpdn_content = $('[data-drpdn-content="' + _drpdn_container + '"]'); 
 
    _drpdn_content.toggleClass("drpdn-show"); 
 
    $(document).click(function(event) { 
 
     if (event.target != $this[0] && event.target != _drpdn_content[0]) { 
 
     _drpdn_content.removeClass("drpdn-show"); 
 
     } 
 
    }); 
 
    $(this, _drpdn_content).click(function(event) { 
 
     event.stopPropagation(); 
 
    }); 
 
    }); 
 
} 
 
// Run Component Function 
 
$(document).ready(function() { 
 
    _drpdntest(); 
 
});
.drpdn-content { 
 
    z-index: 1000; 
 
    position: absolute; 
 
    display: none; 
 
    overflow: hidden; 
 
} 
 

 
.drpdn-content.drpdn-show { 
 
    display: block; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<button class="drpdn-click" data-drpdn-click="main">CLICK</button> 
 
<div class="drpdn-content drpdn-body" data-drpdn-content="main"> 
 
    Main 
 
</div>

+0

为什么event.stopPropagation();不在我的代码工作.. –

+0

不知道tbh,但它做了解决你面临的问题?当我点击内容区域时, –