不能使用内部伪元素的jquery.find div

问题描述:

我试图检测点击是否在特定div之外。对于这一点,我将绑定单击事件整个文档和测试,如果目标是我的div的孩子,像这样:不能使用内部伪元素的jquery.find div

var _div = $('myselector'); 

document.bind('click touchstart', function (event) { 
    if (_div.find(event.target).length === 0) { 
     callback(); 
    } 
}); 

它可以在大多数情况下细,但在某些失败。故障的具体情况是目标DIV里面影子DOM:

当我在某个区域中单击DIV中我有这个event.target

<div class="row btnActions"> 
::before 
     <a class="link pull-left ng-binding" style="" ng-click="deleteAllFilters()"> 
      Supprimer 
     </a> 
     <button type="button" class="btn btn-primary btn-sm pull-right ng-binding" ng-click="validate()"> 
      Valider 
     </button> 
::after 
    </div> 

这实际上是在我的_div元素,但_div.find(event.target)返回空数组,当我试着问_div.find(” btnActions。)返回我:

<div class="row btnActions"> 
     <a class="link pull-left ng-binding" style="" ng-click="deleteAllFilters()"> 
      Supprimer 
     </a> 
     <button type="button" class="btn btn-primary btn-sm pull-right ng-binding" ng-click="validate()"> 
      Valider 
     </button> 
    </div> 

不同之处在于最后没有阴影DOM,所以我认为jquery不能在里面找到带有伪元素的元素。有人知道如何让_div.find(event.target)返回一些好东西吗?

如果你想有一个事件处理程序为你的每个div触发,我建议使用jQuerys "on"而不是绑定,因为你可以选择处理程序应该触发哪些元素。这甚至适用于动态添加div到文档中的情况。像这样的:

$(document).on('click touchstart', "div", function (event) { 
    alert("Clicked " + $(event.target).closest("div").attr("id")); 
}); 

这是一个JSFiddle这证明了这一点。

如果你仍然想跟踪所有点击该文件,并希望将处理程序内决定是否点击的是文件或某些DIV中,你可以使用这样的事情:

$(document).on('click touchstart', function (event) { 
    var div = $(event.target).closest("div"); 
    if (div.length > 0) { 
     alert("Inside Div"); 
    } else { 
     alert("Outside Div"); 
    } 
}); 

请参阅this JSFiddle

如果你还是想先(如你的例子)定义你的选择,你可以做这样的事情:

var _div = $("#div1"); 

$(document).on('click touchstart', function (event) { 
    var target = $(event.target); 

    if (_div.has(target).length || _div.is(target)) { 
     alert("Inside Div1"); 
    } else { 
     alert("Outside Div1"); 
    } 
}); 

在这种情况下,你需要检查,如果点击happend到你选择的子或者是选择器本身(以防有人直接点击div)。请参阅here

在每种情况下,我认为jQuerys "closest" APIthis SO question将对您有用。

希望我正确理解你的问题。