无法使用包含伪元素的jquery.find div

无法使用包含伪元素的jquery.find div,jquery,html,jquery-selectors,pseudo-element,shadow-dom,Jquery,Html,Jquery Selectors,Pseudo Element,Shadow Dom,我试图检测单击是否指向特定div之外。为此,我将单击事件绑定到整个文档,并测试目标是否是我div的子对象,如下所示: var _div = $('myselector'); document.bind('click touchstart', function (event) { if (_div.find(event.target).length === 0) { callback(); } }); 它在大多数情况下运行良好,但在某些情况下失败。失败的具体情况

我试图检测单击是否指向特定div之外。为此,我将单击事件绑定到整个文档,并测试目标是否是我div的子对象,如下所示:

var _div = $('myselector');

document.bind('click touchstart', function (event) {
    if (_div.find(event.target).length === 0) {
        callback();
    }
});
它在大多数情况下运行良好,但在某些情况下失败。失败的具体情况是内部有阴影DOM的目标div:

当我在div内的某个区域单击时,我有此event.target:


::之前
供给者
瓦利德
::之后
它实际上在我的_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触发的事件处理程序,我建议使用而不是绑定,因为您可以选择处理程序应该触发哪些元素。如果您正在动态地将div添加到文档中,这甚至可以起作用。大概是这样的:

$(document).on('click touchstart', function (event) {
    var div = $(event.target).closest("div");
    if (div.length > 0) {
        alert("Inside Div");   
    } else {
        alert("Outside Div");
    }
});
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");
    }
});
$(文档)。在('click touchstart',div',函数(事件){
警报(“单击的”+$(event.target).closest(“div”).attr(“id”);
});
这里有一个例子来说明这一点

如果您仍然希望跟踪文档上的所有单击,并希望在处理程序内部确定单击是在文档上还是在某个div中,可以使用以下方法:

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

如果您仍然希望事先定义选择器(如您的示例),可以执行以下操作:

$(document).on('click touchstart', function (event) {
    var div = $(event.target).closest("div");
    if (div.length > 0) {
        alert("Inside Div");   
    } else {
        alert("Outside Div");
    }
});
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");
    }
});
在这种情况下,您需要检查单击是发生在选择器的子级还是选择器本身(如果有人直接单击div)。看,

在每种情况下,我都这样认为,并将对你有用

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