Javascript检测div之外的点击事件

Dib*_*ish 16 html javascript events click

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

<div id = "outer-container">
   <div id = "content-area">
      Display Conents 
   </div>
</div>
Run Code Online (Sandbox Code Playgroud)

jol*_*elj 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';   
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 当我们在`#content-area`里面点击时调用这个函数. (3认同)
  • 你应该一直使用`addEventListener('click',function(e){...});`.不是`.onclick = funciton(e){...}`函数.. (3认同)
  • 小提琴链接已过期。 (2认同)

But*_*ak3 12

将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);
    }
}
Run Code Online (Sandbox Code Playgroud)

另请查看实例(内容区域=灰色)!

  • 好吧,DOM API相当于你的递归函数:[node.contains](https://developer.mozilla.org/en-US/docs/Web/API/Node.contains).它有很好的支持(IE5 +!).刚刚发现它. (7认同)

Jan*_*cak 8

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

您可以使用捕获事件

document.addEventListener("click", clickOutside, false);
function clickOutside(e) {
   const inside = document.getElementById('content-area').contains(e.target);
}
Run Code Online (Sandbox Code Playgroud)

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

document.removeEventListener("click", clickOutside, false)
Run Code Online (Sandbox Code Playgroud)


Joe*_*mas 5

我做了一个简单的小js库来为你做这个:

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

基本用法

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

var menu = document.getElementById('menu')

menu.onoutclick = function () {
    hide(menu)
}
Run Code Online (Sandbox Code Playgroud)

这也可以使用addEventListener方法完成

var menu = document.getElementById('menu')

menu.addEventListener('outclick', function (e) {
    hide(menu)
})
Run Code Online (Sandbox Code Playgroud)

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

<div outclick="someFunc()"></div>
Run Code Online (Sandbox Code Playgroud)

玩得开心!