使用单个事件处理程序检测元素内部/外部的单击

Tho*_*mas 36 javascript jquery

假设我的页面中有一个div.如何通过JavaScript或JQuery检测用户点击div内容或div内容之外的内容.请帮助小代码片段.谢谢.

编辑:如下面的一个答案所述,我只想将一个事件处理程序附加到我的身体,并且还想知道点击了哪个元素.

amo*_*era 77

在JavaScript中(通过jQuery):

$(function() {
  $("body").click(function(e) {
    if (e.target.id == "myDiv" || $(e.target).parents("#myDiv").length) {
      alert("Inside div");
    } else {
      alert("Outside div");
    }
  });
})
Run Code Online (Sandbox Code Playgroud)
#myDiv {
  background: #ff0000;
  width: 25vw;
  height: 25vh;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="myDiv"></div>
Run Code Online (Sandbox Code Playgroud)

  • 这不会处理用户点击div的子节点的情况; 它将报告"外部div". (5认同)

Kha*_*nna 64

这是一个使用Node.contains不需要jquery的衬里:

// Get arbitrary element with id "my-element"
var myElementToCheckIfClicksAreInsideOf = document.querySelector('#my-element');
// Listen for click events on body
document.body.addEventListener('click', function (event) {
    if (myElementToCheckIfClicksAreInsideOf.contains(event.target)) {
        console.log('clicked inside');
    } else {
        console.log('clicked outside');
    }
});
Run Code Online (Sandbox Code Playgroud)

如果你想知道检查点击是否在元素本身的边缘情况,Node.contains为元素本身返回true(例如element.contains(element) === true),所以这个片段应该始终有效.

根据该MDN页面,浏览器支持似乎几乎涵盖了所有内容.

  • 这是正确的非jquery答案,谢谢! (3认同)

Phr*_*ogz 12

使用jQuery,假设你有<div id="foo">:

jQuery(function($){
  $('#foo').click(function(e){
    console.log( 'clicked on div' );
    e.stopPropagation(); // Prevent bubbling
  });
  $('body').click(function(e){
    console.log( 'clicked outside of div' );
  });
});
Run Code Online (Sandbox Code Playgroud)

编辑:对于单个处理程序:

jQuery(function($){
  $('body').click(function(e){
    var clickedOn = $(e.target);
    if (clickedOn.parents().andSelf().is('#foo')){
      console.log( "Clicked on", clickedOn[0], "inside the div" );
    }else{
      console.log( "Clicked outside the div" );
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 2021 年你好,其中 `.andSelf()` 已被弃用。相反,只需将“andSelf”替换为“addBack”,它的工作原理应该是相同的。https://api.jquery.com/andSelf/ (2认同)

Ray*_*Air 9

而不是使用jQuery .parents函数(如接受的答案中所建议的),最好.closest用于此目的.正如jQuery api文档中解释的那样,.closest检查传递的元素及其所有父元素,而.parents只检查父元素.因此,这有效:

$(function() {
    $("body").click(function(e) {
        if ($(e.target).closest("#myDiv").length) {
            alert("Clicked inside #myDiv");
        } else { 
            alert("Clicked outside #myDiv");
        }
    });
})
Run Code Online (Sandbox Code Playgroud)


bui*_*ded 6

那这个呢?

<style type="text/css">
div {border: 1px solid red; color: black; background-color: #9999DD;
width: 20em; height: 40em;}
</style>

<script type="text/javascript">
function sayLoc(e) {
e = e || window.event;
var tgt = e.target || e.srcElement;

// Get top lef co-ords of div
var divX = findPosX(tgt);
var divY = findPosY(tgt);

// Workout if page has been scrolled
var pXo = getPXoffset();
var pYo = getPYoffset();

// Subtract div co-ords from event co-ords
var clickX = e.clientX - divX + pXo;
var clickY = e.clientY - divY + pYo;

alert('Co-ords within div (x, y): '
+ clickX + ', ' + clickY);
}

function findPosX(obj) {
var curleft = 0;
if (obj.offsetParent) {
while (obj.offsetParent) {
curleft += obj.offsetLeft
obj = obj.offsetParent;
}
} else if (obj.x) {
curleft += obj.x;
}
return curleft;
}

function findPosY(obj) {
var curtop = 0;
if (obj.offsetParent) {
while (obj.offsetParent) {
curtop += obj.offsetTop
obj = obj.offsetParent;
}
} else if (obj.y) {
curtop += obj.y;
}
return curtop;
}

function getPXoffset(){
if (self.pageXOffset) { // all except Explorer
return self.pageXOffset;
} else if (document.documentElement
&& document.documentElement.scrollTop) {// Explorer 6 Strict
return document.documentElement.scrollLeft;
} else if (document.body) { // all other Explorers
return document.body.scrollLeft;
}
}

function getPYoffset(){
if (self.pageYOffset) { // all except Explorer
return self.pageYOffset;
} else if (document.documentElement
&& document.documentElement.scrollTop) {// Explorer 6 Strict
return document.documentElement.scrollTop;
} else if (document.body) { // all other Explorers
return document.body.scrollTop;
}
}
</script>

<div onclick="sayLoc(event);"></div>
Run Code Online (Sandbox Code Playgroud)

(来自http://bytes.com/topic/javascript/answers/151689-detect-click-inside-div-mozilla,使用Google.)

  • 这是一个疯狂的代码,现在可以在一行中完成:http://stackoverflow.com/a/28432139/288906 (3认同)