2

我有一个成功切换隐藏 div 的输入框。但是,当用户单击 div 本身以外的任何内容时,我也希望 div 隐藏。我该怎么做?

html

<input id="inputID" type="text" readonly />
<div id="divID"></div>

js

var divObj = document.getElementById('divID');
var inputObj = document.getElementById('inputID');

inputObj.addEventListener('click', toggleDiv, false);
function toggleDiv(){
    divObj.style.display = (divObj.style.display == 'none') ? 'block' : 'none'; 
}
4

3 回答 3

4

在元素上创建一个事件侦听document.body器并检查事件是否源自 div 内的元素,如果不是隐藏它。.stopPropagation()您可以通过不检查来源来稍微简化这项工作,而只需通过调用事件对象来防止来自 div 内部的点击事件冒泡。

divObj.addEventListener('click', function(e) {
    e.stopPropagation();
}, false);
document.body.addEventListener('click', function(e) {
    divObj.style.display = 'none';
}, false);

演示:http: //jsfiddle.net/ThiefMaster/D7YnS/

于 2012-05-09T16:43:29.583 回答
0

ThiefMaster 的方法有效,但如果您有多个地方需要做同样的事情,则需要考虑一个小问题。假设您需要对两个单独的 div 做同样的事情,然后调用e.stopPropagation()会导致 div1 在单击 div2 时不会被隐藏

例子

div1.addEventListeners('click', function(e){
    e.stopPropagation();
}, false);
div2.addEventListener('click', function(e) {
    e.stopPropagation();
}, false);
document.body.addEventListener('click', function(e) {
    div1.style.display = 'none';
    div2.style.display = 'none';
}, false);

因此,更安全的选择是(为简单起见,我将使用 jQuery)http://jsfiddle.net/qzMnj/1/

$(function() {
    function hideWhenClickOutside(element) {
      $(document).click(function(e){
        if ( !element.contains(e.target)) {
            $(element).hide();
        }
      });
    }

    hideWhenClickOutside(document.getElementById('div1'));    
    hideWhenClickOutside(document.getElementById('div2'));
})

我的观点是,调用stopPropagation()可能会产生不必要的副作用,如果您不必这样做,最好不要这样做,除非您确定没有人会关心该点击。

于 2012-05-09T17:14:26.607 回答
0

让我们看看这是否有效

  1. 打电话给你的普通听众来隐藏 div
  2. 如果没有隐藏,则向正文添加一个额外的侦听器以隐藏您的 div
  3. 向 div 本身添加一个侦听器以停止事件(上面的 2.)
    • 这被称为事件传播
    • 你点击 div,最终是点击 body
    • 你不想打电话给 2. 当你在 div 内点击时

另外,请注意上面(你的)和下面(我的)的代码不是跨浏览器的(addEventListener 在 IE8 和更少的版本中不起作用)希望你忽略这一点,这里是带有 JS 的 HTML

<!DOCTYPE HTML>
<html>
<head>
    <title>Lab</title>
    <style type="text/css">
        #divID {
            width: 100px;
            height: 100px;
            margin: 0 auto;
            margin-top: 85px;
            border: 1px solid #020202;

            // Unnecessary stuff
            -moz-border-radius:     2px;
            -webkit-border-radius:  2px;

            -moz-box-shadow:    0 0 8px #565656;
            -webkit-box-shadow: 0 0 8px #565656;
        }
    </style>
</head>
<body>
    <input id="inputID" type="text" readonly="readonly" />
    <div id="divID"></div>
</body>

<script type="text/javascript">

    var divObj = document.getElementById('divID'),
        inputObj = document.getElementById('inputID');

    inputObj.addEventListener('click', toggleDiv, false);
    document.body.addEventListener('click', docClick, false);
    divObj.addEventListener('click', divClick, false);

    function divClick(e) {
        // if you click any element inside the div
        // when the click reaches the div, stop going above
        e.stopPropagation();
    }

    function docClick(e){
        if (divObj.style.display !== 'none') {
            divObj.style.display = 'none';
        }
    }

    function toggleDiv(e) {
        e.stopPropagation();
        divObj.style.display = (divObj.style.display === 'none') ? 'block' : 'none'; 
    }

</script>

</html>
于 2012-05-09T17:47:12.643 回答