我有一个id =“content-area”的div,当用户点击此div之外时,我想提醒他们他们点击它之外的事实。我如何使用JavaScript来解决这个问题?
<div id = "outer-container">
<div id = "content-area">
Display Conents
</div>
</div>
答案 0 :(得分:22)
看看这个小提琴,看看你是不是在追求它!
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';
}
}
答案 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");
});