Javascript检测div之外的点击事件

时间:2013-09-19 11:16:33

标签: javascript html events click

我有一个id =“content-area”的div,当用户点击此div之外时,我想提醒他们他们点击它之外的事实。我如何使用JavaScript来解决这个问题?

<div id = "outer-container">
   <div id = "content-area">
      Display Conents 
   </div>
</div>

10 个答案:

答案 0 :(得分:22)

在纯Javascript中

看看这个小提琴,看看你是不是在追求它!

document.getElementById('outer-container').onclick = function(e) {
    if(e.target != document.getElementById('content-area')) {
        document.getElementById('content-area').innerHTML = 'You clicked outside.';          
    } else {
        document.getElementById('content-area').innerHTML = 'Display Contents';   
    }
}

http://jsfiddle.net/DUhP6/2/

答案 1 :(得分:11)

将onClick-Event绑定到您的内容区域之外的元素,例如身体。然后,在事件内部,检查目标是内容区域还是内容区域的直接或间接子项。如果没有,请提醒。

我做了一个检查是否是孩子的功能。如果节点的父节点是搜索的父节点,则返回true。如果没有,则检查它是否确实有父。如果没有,则返回false。如果它有一个父项,但它不是被搜索的那个,它会检查父项的父项是否是搜索到的父项。

function isChildOf(child, parent) {
    if (child.parentNode === parent) {
      return true;
    } else if (child.parentNode === null) {
      return false;
    } else {
      return isChildOf(child.parentNode, parent);
    }
}

另请查看Live Example(内容区域=灰色)!

答案 2 :(得分:8)

Node.contains()方法返回一个布尔值,指示节点是否是给定节点的后代

您可以使用

捕获事件
document.addEventListener("click", clickOutside, false);
function clickOutside(e) {
   const inside = document.getElementById('content-area').contains(e.target);
}

请记住删除在正确位置收听的事件

document.removeEventListener("click", clickOutside, false)

答案 3 :(得分:5)

我为你做了一个简单而小的js library

它劫持了原生的addEventListener,创建了一个outclick事件,并在.onoutclick的原型上有一个setter

  

基本用法

     

使用outclick,您可以在DOM元素上注册事件侦听器,以检测是否单击了该元素或其中的其他元素的另一个元素。最常见的用途是菜单。

var menu = document.getElementById('menu')

menu.onoutclick = function () {
    hide(menu)
}
     

这也可以使用addEventListener方法

来完成
var menu = document.getElementById('menu')

menu.addEventListener('outclick', function (e) {
    hide(menu)
})
     

或者,您也可以使用html属性outclick来触发事件。这不处理动态HTML,我们没有计划添加它,但

<div outclick="someFunc()"></div>

玩得开心!

答案 4 :(得分:2)

使用document.activeElement查看哪些html元素处于活动状态。

这是一个参考: document.activeElement in MDN

答案 5 :(得分:1)

$('#outer-container').on('click', function (e) {
     if (e.target === this) {
        alert('clicked outside');
     }
});

这是针对您在外部容器内部但在内容区域之外单击的情况。

答案 6 :(得分:0)

这是小提琴:http://jsfiddle.net/uQAMm/1/

$('#outercontainer:not(#contentarea)').on('click', function(event){df(event)} );
function df(evenement)
{
    var xstart = $('#contentarea').offset().left;
    var xend = $('#contentarea').offset().left + $('#contentarea').width();

    var ystart = $('#contentarea').offset().top;
    var yend = $('#contentarea').offset().top + $('#contentarea').height(); 

    var xx = evenement.clientX;
    var yy = evenement.clientY;

    if ( !(  ( xx >=  xstart && xx <=  xend ) && ( yy >=  ystart && yy <=  yend )) )
    {
        alert('out');
    }


}

答案 7 :(得分:0)

将其放入您的文档中:

<script>
document.onclick = function(e) {
  if(e.target.id != 'content-area') alert('you clicked outside of content area');
}
</script>

答案 8 :(得分:0)

这里是一个简单的eventListener,它检查所有父元素(如果任何元素包含该元素的ID)。否则,点击是在元素外部

html

<div id="element-id"></div>

js

const handleMouseDown = (ev) => {
    let clickOutside = true
    let el = ev.target
    while (el.parentElement) {
        if (el.id === "element-id") clickOutside = false
        el = el.parentElement
    }
    if (clickOutside) {
        // do whatever you wanna do if clicking outside
    }
}
document.addEventListener("mousedown", handleMouseDown)

答案 9 :(得分:-1)

使用jquery作为DOM访问的最佳选择

$(document).click(function(e){
 if($(e.target).is("#content-area") || $(e.target).closest("#content-area").length)
  alert("inside content area");
else alert("you clicked out side content area");
});